4

经过大量工作,我在 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(值=(x/2, y/2, z/2))

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

任何人都可以向我指出一个可以理解的代码片段,或者一个关于如何在搅拌机 python 中操作向量(在数学意义上)的教程

我发现搅拌机 API 对参数的名称以及如何对其进行编码非常清楚,但我几乎找不到或根本找不到参数的实际含义。

4

1 回答 1

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)

该代码适用于搅拌机 2.63,但不适用于 2.65。

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

    bpy.ops.transform.rotate(value=rot.angle, axis=rot.axis)
于 2013-02-14T21:56:22.430 回答