Screen capture of 3D text in Three.js |
Thanks to Zz85's work, Three ,js has excellent 3D text creation capabilities. These are described in the Three.js wiki and in a post on Zz85's website. If there is an issue it is that the 3D text uses fonts that have been converted into a special format developed by Typeface.js (as of this writing the web site is not operational) - and is described here.
There can be times, however, when you need to use a specific TTF font and want to be able to do so fairly quickly and easily. Or it may be that you might need custom kerning of text or text with a taper. Again this post if for you.
The technique described here uses a Python script to generate text inside Blender, export the text in JSON format using the Three.js blender export script and then load the text into a Three.js applet. Loading a Python script into Blender is described here.
Below is the Python script I used to generate three lines of text with each line using a different font all as shown in my3D text demo. Each line of extruded text uses a different material and the text is beveled.
import bpy import math from math import pi
# delete any meshes or text in the current drawing def removeObjects( scn ): for ob in scn.objects: if ob.type == 'FONT' or ob.type == 'MESH': scn.objects.unlink( ob ) scn = bpy.context.scene removeObjects( scn ) # create several materials - each text line will use a different material def makeMaterial(name, diffuse, specular, alpha): mat = bpy.data.materials.new(name) mat.diffuse_color = diffuse mat.diffuse_shader = 'LAMBERT' mat.diffuse_intensity = 1.0 mat.specular_color = specular mat.specular_shader = 'COOKTORR' mat.specular_intensity = 0.5 mat.alpha = alpha mat.ambient = 1 return mat def setMaterial(ob, mat): me = ob.data me.materials.append(mat) red = makeMaterial('Red', (1, 0, 0), (1, 1, 1), 1) blue = makeMaterial('BlueSemi', (0, 0, 1), (1, 1, 1), 0.5) green = makeMaterial('GreenSemi', (0, 1, 0), (1, 1, 1), 0.5) yellow = makeMaterial('YellowSemi', (1, 1, 0), (1, 1, 1), 0.5) # Create and name TextCurve object #1 bpy.ops.object.text_add( location=(-3, 0, 3.6), rotation=(pi/2, 0, 0)) ob = bpy.context.object ob.name = 'Text1' # TextCurve attributes ob.data.name = 'TextData1' ob.data.body = "THREE.JS" fnt = bpy.data.fonts.load('C:\\Windows\\Fonts\\Impact.ttf') ob.data.font = fnt ob.data.size = 2.75 # Inherited Curve attributes ob.data.bevel_depth = 0.1 ob.data.bevel_resolution = 5 ob.data.extrude = 0.5 setMaterial(ob, red) bpy.ops.object.convert(target='MESH', keep_original=False) # Create and name TextCurve object #2 bpy.ops.object.text_add( location=(-3, 0, 1.6), rotation=(pi/2, 0, 0)) ob = bpy.context.object ob.name = 'Text2' # TextCurve attributes ob.data.name = 'TextData2' ob.data.body = "TEXT" fnt = bpy.data.fonts.load('C:\\Windows\\Fonts\\Georgia.ttf') ob.data.font = fnt ob.data.bevel_depth = 0.1 ob.data.bevel_resolution = 5 ob.data.size = 3 # Inherited Curve attributes ob.data.extrude = 0.5 setMaterial(ob, green) bpy.ops.object.convert(target='MESH', keep_original=False) # Create and name TextCurve object #3 bpy.ops.object.text_add( location=(-3, 0, 0), rotation=(1.51, 0, 0)) ob = bpy.context.object ob.name = 'Text3' # TextCurve attributes ob.data.body = "DEMO" ob.data.name = 'TextData3' fnt = bpy.data.fonts.load('C:\\Windows\\Fonts\\coopbl.ttf') ob.data.font = fnt ob.data.bevel_depth = 0.1 ob.data.bevel_resolution = 5 ob.data.size = 2.32 # Inherited Curve attributes ob.data.extrude = 0.5 setMaterial(ob, yellow) bpy.ops.object.convert(target='MESH', keep_original=False)
// convert text to meshes so they can be exported bpy.ops.object.mode_set(mode='EDIT') bpy.ops.uv.smart_project() bpy.ops.object.mode_set(mode='OBJECT')
Why do I do it this way? I happen to find it much easier to program in Python than to learn the Blender user interface. ;-)
Please note that I did nothing to reduce file sizes so the JSON files amount to over 10MB - so it could take a file to load the demo the first time - or you might have to reload. Also you can use mouse button down to rotate/zoom/pan the view.
Link to demo
http://theo-armour.github.com/threo.js/anims/text/index.html
Source code
https://github.com/theo-armour/threo.js/tree/gh-pages/anims/text
No comments:
Post a Comment