Blender & Python 两点坐标建立圆柱


从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) 

但是缺点也很明显,如下图,两端没有封死,其实就是个管道