微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Python中的Mayavi在TVTK渲染场景上旋转actor?

如何解决如何使用Python中的Mayavi在TVTK渲染场景上旋转actor?

我在mayavi,特别是在tvtk上玩了一点,但我很难找到示例,这些示例中字形放置在场景中的方向与认方向不同。

基于此example,我准备了以下场景,其中有两个圆柱,一个红色和一个蓝色,

import mayavi.mlab as mlab

from tvtk.api import tvtk
from tvtk.common import configure_input_data

v = mlab.figure()

# Create two cyllinders
cyl1 = tvtk.CylinderSource(center=(0,0),radius=1.0,height=0.5,capping=True,resolution=24)
cyl2 = tvtk.CylinderSource(center=(3,resolution=24)


# The mapper converts them into position in 3D
cylinder_mapper1 = tvtk.polyDataMapper()
configure_input_data(cylinder_mapper1,cyl1.output)
cyl1.update()

cylinder_mapper2 = tvtk.polyDataMapper()
configure_input_data(cylinder_mapper2,cyl2.output)
cyl2.update()

# Assign them differrent colors
p1 = tvtk.Property(opacity=1.0,color=(1,0))
p2 = tvtk.Property(opacity=1.0,color=(0,1))

# The actor is the actually object in the scene.
cyl1_actor = tvtk.Actor(mapper=cylinder_mapper1,property=p1)
v.scene.add_actor(cyl1_actor)

cyl2_actor = tvtk.Actor(mapper=cylinder_mapper2,property=p2)
v.scene.add_actor(cyl2_actor)

# Choose a view angle,and display the figure
mlab.view(90,45,7.5,[1.5,0])
mlab.savefig(filename='cylinders.png')

而我试图在这里实现的是改变其中之一的方向。只要我可以以某种方式独立旋转字形(而不仅仅是旋转整个场景),通过提供旋转矩阵(通过调用方法)都无关紧要。

上面的示例呈现

rendered output from the code example

关于先前已经问过的其他问题,this one似乎很有用,但是与其旋转角色,不如使角色旋转,而是使整个场景绕Y轴旋转。 scipy-cookbook中也有一个示例,但还是有一个示例-仅在认方向上。

tvtk documentation的示例并不丰富,几乎很难相信没有示例涉及替代方向。该文档仅声明遵循某些约定,类和方法与它们的C ++对应物相对应。

  1. tvtk类名称与VTK类基本类似,只是在前面没有烦人的“ vtk”。唯一的困难是以数字开头的类。例如,“ vtk3DSImporter”变为“ 3DSImporter”。这在Python中是非法的,因此使用的类名是“ ThreeDSImporter”。因此,如果第一个字符是数字,则将其替换为等效的非数字字符串。这样的课程很少,所以没什么大不了的。
  2. tvtk方法名称是构思样式名称,而不是CamelCase。也就是说,如果VTK方法称为AddItem,则等效的tvtk名称为add_item。这样做是为了与enthought软件包中使用的名称保持一致。
  3. 许多VTK方法已被方便的属性所取代。在上面的示例中,我们使用m.input = cs.output和p.representation ='w'代替了m.SetInput(cs.Getoutput())和p.SetRepresentationToWireframe()等。其中一些属性是真正的特征。
  4. 与VTK对象不同,可以在初始化类时通过在类实例化时将对象的属性(特征)作为关键字参数传递来设置tvtk对象的属性。例如cs = tvtk.Conesource(radius = 0.1,height = 0.5)。

也许已经在C ++中广泛使用VTK的人可以发现它有用,但对我来说却不是很有帮助。但是,我尝试查找VTK C ++文档,但确实提供了一些线索。 vtkActor class确实继承了vtkProp3DvtkProp的某些类型。 vtkProp3D似乎确实接受了与场景中面向对象相关的方法属性,但是我不清楚如何设置它们。 tvtk库只是C ++库的包装,这使得不可能inspect仅接受哪些属性

我认为,出于互联网的考虑,也许我们应该准备一个合适的示例,以mayavitvtk渲染一个既允许演员的位置又允许他们的方位的场景。大多数示例都忽略方向并使用球体,因此方向似乎不相关。

我们总结一下。

  1. 如果有人提供一个链接链接到使用mayavitvtk渲染场景的正确示例,其中涉及多个具有不同位置和方向的字形,我将接受这样的答案。
  2. 为(1)做一个自定义示例也将被接受。
  3. 也许有人还可以评论一下字形和将此字形映射到场景中的演员之间的位置差异。如您在示例中所见,当我创建CylinderSource时,我明确指定了中心在哪里。这很令人困惑,因为应该由演员中心来确定字形在场景中的位置。

非常感谢!

解决方法

好吧,事实证明Actor接受orientation参数,该参数以度为单位(不是弧度!)。另外,必须在创建角色时指定角色的位置,而不是在创建字形时指定角色的位置!

cyl1_actor = tvtk.Actor(position=(0,0),mapper=cylinder_mapper1,property=p1,orientation=(0,90))

渲染

rendered output

我通过反复试验发现了它……Mayavi软件包中的tvtk代码为generated,因此尝试研究GitHub存储库来查找接受哪些属性是毫无意义的。另外,您可能会将tvtk的{​​{1}}与Mayavi's Actor混淆,后者没有方向属性。哦,实际上有一个属性名称为“ property”,所以尝试搜索该属性并获得成千上万的结果,因为Actor一词在世界各地得到广泛使用...

编辑:

我注意到我一直在指定演员在字形中心的位置,这是错误的!这里整个源代码已更新:

property

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?