从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)
但是缺点也很明显,如下图,两端没有封死,其实就是个管道