我如何用向量实现相同的功能

4 投票
1 回答
2592 浏览
提问于 2025-04-17 15:33

经过一番努力,我写了以下的Python代码,用来绘制一个向量(在这个例子中是(2,2,2)),让它从原点指向你预期的方向。花了我一些时间才搞明白这三个旋转参数分别代表什么,涉及到的概念是翻滚、俯仰和偏航。你可能需要设置欧拉角的XYZ。

我用一个细长的圆柱体来表示我的向量,这样比较符合我的需求,也和我在blender中的经验相匹配。这个代码在向量中间绘制了一个箭头(一个锥体),效果还不错,但有点粗糙。它适用于大多数向量,但当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))

我相信在向量和矩阵操作方面,blender的API应该能让这个工作变得更简单,但我在寻找其他方法时遇到了困难,只能依赖自己开发的笛卡尔坐标系的方式。

有没有人能给我指个明路,提供一个易懂的代码片段,或者一个关于如何在blender python中操作向量(从数学角度看)的教程?

我发现blender的API在参数名称和编码方式上相当清晰,但对于这些参数的实际含义却几乎找不到任何信息。

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)

这段代码在Blender 2.63版本上可以正常运行,但在2.65版本上不可以

如果你使用的是2.65版本,需要把最后一行改成:

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

撰写回答