从Blender建立一个圆柱体可以知道,需要的参数为 半径,圆柱长,中点坐标。
当我们只知道圆柱两端面中心的坐标能否建立圆柱呢?
方法一,通过两点坐标计算中心坐标,和欧拉角。
1 def cylinder_between(x1, y1, z1, x2, y2, z2, r): 2 3 dx = x2 - x1 4 dy = y2 - y1 5 dz = z2 - z1 6 dist = math.sqrt(dx**2 + dy**2 + dz**2) 7 8 bpy.ops.mesh.primitive_cylinder_add( 9 radius = r, 10 depth = dist, 11 location = (dx/2 + x1, dy/2 + y1, dz/2 + z1) 12 ) 13 14 phi = math.atan2(dy, dx) 15 theta = math.acos(dz/dist) 16 17 bpy.context.object.rotation_euler[1] = theta 18 bpy.context.object.rotation_euler[2] = phi
上面代码的缺点之一是,运动中的圆柱,需要求不同时间之间变换的欧拉角来更新。
方法二,利用nurbs曲线建立圆柱
import bpy bpy.ops.curve.primitive_bezier_curve_add() obj = bpy.context.object obj.data.dimensions = '3D' obj.data.fill_mode = 'FULL' obj.data.bevel_depth = 0.1 obj.data.bevel_resolution = 4 # set first point to centre of sphere1 obj.data.splines[0].bezier_points[0].co = (-1,-1,0) obj.data.splines[0].bezier_points[0].handle_left_type = 'VECTOR' # set second point to centre of sphere2 obj.data.splines[0].bezier_points[1].co = (1,1,0) obj.data.splines[0].bezier_points[1].handle_left_type = 'VECTOR'
这样可以在制作动画时,每次只要更新这段代码即可 obj.data.splines[0].bezier_points[1].co = (1,1,0)
但是缺点也很明显,如下图,两端没有封死,其实就是个管道