我如何使用向量来实现与此相同

时间:2013-02-11 22:46:05

标签: python python-3.x blender

经过大量工作后,我在Python中开发了以下代码来绘制向量[在本例中为(2,2,2)],以便它指向您对原点的期望。 花了一些时间来收集三个旋转参数在滚动,俯仰和偏航方面的含义。您可能需要设置Euler XYZ。

我使用了一个很长的圆柱作为我的矢量,这符合我的目的,并且符合我对搅拌器的薄薄体验。这段代码绘制了一个矢量,上面有一个箭头(一个圆锥),很适合我的目的,但有点像一个小屋。 我适用于大多数矢量但在x <0和y> 0且z> 0

时失败
import bpy
import math
from math import *
x=-5  
y=-10
z=12
yParameter=-1.0
if y < 0:
    if x < 0: 
        yParameter = 1.0
#print ("y para is ",yParameter
for i in range (0,1):

    length=sqrt(z*z+y*y+x*x)


#Create a vector at correct orientation at the origin
bpy.ops.mesh.primitive_cylinder_add(vertices=16, radius=0.04, depth=length, end_fill_type='NGON', view_align=False, enter_editmode=False, location=(0,0,0),rotation=(-acos(z/sqrt(x*x+y*y+z*z)),0,yParameter*acos(y/sqrt(x*x+y*y))))
bpy.ops.transform.translate(value=(x/2, y/2, z/2))

bpy.ops.mesh.primitive_cone_add(vertices=32, radius1=0.1, radius2=0, depth=0.4, end_fill_type='NGON', view_align=False, enter_editmode=False, location=(0,0,0), rotation=(-acos(z/sqrt(x*x+y*y+z*z)),0,yParameter*acos(y/sqrt(x*x+y*y))))

bpy.ops.transform.translate(value =(x / 2,y / 2,z / 2))

我确信向量和矩阵操作中的巨大API应该使这项工作更容易,但我正在努力寻找除了自行开发的笛卡尔工作之外的其他方法。

任何人都可以指向一个可理解的代码片段,或者可能是关于如何在blender python中操纵向量(在数学意义上)的教程

我发现blender API非常清楚参数的名称以及如何对它们进行编码,但我发现参数的实际含义很少甚至没有。

1 个答案:

答案 0 :(得分:2)

这会创建一个圆柱体,其中(0,0,0)作为一端,(x,y,z)作为另一端:

def createVectorLikeThing(x,y,z):
    v = Vector((x,y,z))
    up = Vector((0,0,1))
    if v!=-up:
        rot = up.rotation_difference(v)
    else:
        rot = Quaternion((1,0,0),pi)
    bpy.ops.mesh.primitive_cylinder_add(vertices=16, radius=0.01, depth=v.length, end_fill_type='NGON', view_align=False, enter_editmode=True)
    bpy.ops.transform.translate(value=(0,0,v.length/2))
    bpy.ops.object.editmode_toggle()
    bpy.ops.transform.rotate(value=(rot.angle,), axis=rot.axis)

该代码适用于blender 2.63但适用于2.65。

对于2.65,将最后一行更改为:

    bpy.ops.transform.rotate(value=rot.angle, axis=rot.axis)