【问题标题】:How can I use vectors to achieve the same as this如何使用向量来实现与此相同的效果
【发布时间】:2013-01-27 03:46:43
【问题描述】:

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

我使用了一个细长的圆柱体作为我的矢量,这很适合我的目的,也符合我对搅拌机的瘦身体验。这段代码在中途绘制了一个带有箭头的向量(一个圆锥),非常适合我的目的,但有点麻烦。 我适用于大多数向量,但在 x0 and 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 应该会使这项工作变得更容易,但我正在努力寻找除了这个自行开发的笛卡尔工作之外的其他方法。

谁能给我一个可以理解的代码 sn-p 或者一个关于如何在 blender python 中操作向量(在数学意义上)的教程

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

【问题讨论】:

  • Python 中的行尾不需要分号。
  • 好吧,我想这暴露了我在编程方面的背景,但把它们拿出来,问题还是一样。

标签: python python-3.x blender


【解决方案1】:

这将为您创建一个圆柱体,一端为 (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)

【讨论】:

  • 小问题,它不起作用,createVector (2,2,2) 创建了一个直的垂直圆柱体。我正在研究它,至少我现在可以使用 api `我已经看到了一个例子。
  • 2.65a OSX 山狮。我会用Linux ck。顺便说一句,我已经更改了上面的代码,现在它处理了我遇到问题的情况,但我应该使用 Mathutils
  • 也许我用错了代码,你介意评论一下吗?我必须更改 0,0,1 吗?
  • 也不适用于 2.65 linux fedora core 18。只是从原点得到一个垂直圆柱体
  • 例如blend file。尝试按几次“运行脚本”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多