VTK中的装配体(vtkAssembly)
Actors有时也会组合在一起形成层次结构,当其中的某个Actor运动时,会影响到其他Actor的位置。例如,一个机械手臂可能由上臂、前臂、手腕和末端等部分通过关节连接起来。当上臂绕着肩关节旋转时,我们希望的是其他部分也会跟着运动。这种行为的实现就要用到Assembly,vtkAssembly是vtkActor的子类,它在构建机器人模型里非常有用。对串联机器人或串并联机器人来说,机构中存在着许多运动链,当前连杆的位置与姿态与它的父节点有关,父节点转动一定的角度,子节点也必须转动,否则模型就会断开。
可以类比VREP中的三连杆机构,左侧的层次结构图中可以看到这样一条父子关系链:J1→L1→J2→L2→J3→L3。即基座关节J1可以看成运动链的根节点,转动J1剩下的两根连杆L2和L3也会同样旋转。

下面我们在Python中实现用键盘控制三连杆机构的运动。首先在SolidWorks中绘制一个长度为100mm的连杆,然后创建装配体,依次将3个连杆首尾相连。按照之前的方法将装配体导出为3个STL模型文件。使用VTK的vtkSTLReader类读入STL文件,并编写事件处理的类处理键盘事件:
#!/usr/bin/env python
import vtk
import math
from vtk.util.colors import * filenames = ["link-1.stl","link-2.stl","link-3.stl"]
dt = 1.0 # degree step in rotation
renWin = vtk.vtkRenderWindow()
actor = list() # the list of links
joint1 = vtk.vtkAssembly()
joint2 = vtk.vtkAssembly()
joint3 = vtk.vtkAssembly() # Customize vtkInteractorStyleTrackballCamera
class MyInteractor(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self,parent=None):
self.AddObserver("CharEvent",self.OnCharEvent)
self.AddObserver("KeyPressEvent",self.OnKeyPressEvent) def OnCharEvent(self,obj,event):
pass def OnKeyPressEvent(self,obj,event):
global angle
# Get the compound key strokes for the event
key = self.GetInteractor().GetKeySym()
# Handle an arrow key
if(key == "Left"):
joint1.RotateY(-dt)
if(key == "Right"):
joint1.RotateY(dt) if(key == "Up"):
joint2.RotateY(-dt)
if(key == "Down"):
joint2.RotateY(dt) if(key == "a"):
joint3.RotateY(-dt)
if(key == "d"):
joint3.RotateY(dt) # Ask each renderer owned by this RenderWindow to render its image and synchronize this process
renWin.Render()
return def LoadSTL(filename):
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(reader.GetOutputPort())
actor = vtk.vtkLODActor()
actor.SetMapper(mapper)
return actor def CreateScene():
# Create a rendering window and renderer
ren = vtk.vtkRenderer()
renWin.AddRenderer(ren) # Create a renderwindowinteractor
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
style = MyInteractor()
style.SetDefaultRenderer(ren)
iren.SetInteractorStyle(style) for id, file in enumerate(filenames):
actor.append(LoadSTL(file))
r = vtk.vtkMath.Random(.4, 1.0)
g = vtk.vtkMath.Random(.4, 1.0)
b = vtk.vtkMath.Random(.4, 1.0)
actor[id].GetProperty().SetDiffuseColor(r, g, b)
actor[id].GetProperty().SetDiffuse(.8)
actor[id].GetProperty().SetSpecular(.5)
actor[id].GetProperty().SetSpecularColor(1.0,1.0,1.0)
actor[id].GetProperty().SetSpecularPower(30.0) joint1.AddPart(actor[0])
joint1.AddPart(joint2)
joint2.AddPart(actor[1])
joint2.AddPart(joint3)
joint3.AddPart(actor[2]) joint2.SetOrigin(100, 0, 0) # initial elbow joint position
joint3.SetOrigin(200, 0, 0) # initial wrist joint position ren.AddActor(joint1)
# Set background color
ren.GradientBackgroundOn()
ren.SetBackground(.1, .1, .1)
ren.SetBackground2(0.8,0.8,0.8) # Set window size
renWin.SetSize(600, 600) # Enable user interface interactor
iren.Initialize()
iren.Start() if __name__ == "__main__":
CreateScene()
运行结果如下图所示。按键盘上的← →键可以控制连杆1,按↑ ↓键可以控制连杆2,按a、d键可以控制连杆3。在添加装配体后能保证旋转单个关节时其后面的子装配体也能跟着一起旋转。

参考:
VTK/Examples/Cxx/Interaction/Assembly
http://vtk.1045678.n5.nabble.com/vtkassembly-td2804665.html
VTK中的装配体(vtkAssembly)的更多相关文章
- SolidEdge 装配体中如何快速的搞定一个面上所有螺丝 如何在装配体上进行阵列
1 点击"规则排列" 选择要排列的螺丝 2 选择被规则排列的架子 3 选择所有的圆孔(鼠标滑到任意圆孔位置,左键单击即可选中所有圆孔) 4 选择参考的基准孔(已经上了螺 ...
- SolidEdge如何为零件指定不同的颜色 给零件着色 给装配体着色
格式-零件画笔 可以给零件的一个表面,或者一个特征着色 如果要指定不同的色彩,可以在格式-样式-面样式中修改 如果是给装配体着色,则点击任意零件,在"无"的选项卡里面修改颜 ...
- Solid Edge性质管理者 如何获取装配体的BOM表 物料清单
工具-性质管理者 在里面可以输入每个文件的文件号,版本号,作者等信息 右击点击显示性质,你还可以添加或删除文件属性 把需要的属性更改好了之后,可以输出装配体的所有零件信息到Excel中,点击工 ...
- Solid Edge如何制作装配体的剖视图
在装配体中,点击检视-剖面 选择剖切方向(向内是指把矩形框之内的东西去掉不要,向外是指把矩形框之外的东西去掉不要),选择剖切深度 最后效果如下图所示 你也可以选择不剖切的零件,效果如下图所 ...
- eclipse中(装了插件m2eclipse后的)导入maven工程显示"感叹号"
有时候导入一些开源工程(maven结构的),在eclipse中(装了插件m2eclipse后的)该工程前面会有一个小的红色感叹号,但点开工程后没有发现有打小红叉的内容,这种情况其实大部分是jar包 ...
- Solidworks如何把装配体做成单个零件
先把装配体另存为IGS格式 再把IGS打开之后另存为SLDPRT格式(打开IGS需要比较长的时间,中途会弹出提示,而且IGS文件体积也比较大) 另存为SLDPRT之后体积就很小了 ...
- VTK中获取STL模型点的坐标以及对其进行变换
VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG.OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的 ...
- VTK中导入并显示STL、3DS文件
VTK(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和科学计算可视化.VTK是在三维函数库OpenGL 的基础上采用面向对象的设计方法发展起 ...
- 37 VTK中的坐标系系统
0 引言 在利用PCL的交互功能解决尺寸关联几何的指定问题时,涉及到一些显示上的操作.目前的需求是:将投影到注释平面上的点云,以与屏幕平齐的方式,显示在屏幕正中,这样方便用户进行操作.但是,在运用se ...
随机推荐
- Tornado开发技巧,简单了解tornado
tornado基础入门(一)——简单了解tornado 参考:http://demo.pythoner.com/itt2zh/ch1.html tornado是一个轻量级的web框架,是一个用pyth ...
- 服务器配置多版本CUDA、CUdnn(不同Linux账户使用不同CUDA、CUdnn版本)
一.由于实验室大家使用的CUDA.CUdnn不同,所以需要在同一台服务器安装多个版本,而且要不引起冲突,方法如下: 1.一般来说CUDA安装在 /usr/local 目录下(当然你可以通过“echo ...
- [转]mysql在已有无分区表增加分区,mysql5.5才有,可以是innodb_file_per_table关闭状态.
FROM : http://blog.csdn.net/sunvince/article/details/7752662 mysql5.1的时候新增的partition,解决了比较简单的shardin ...
- protobuf示例
Google protobuf 是一个高性能的序列化结构化数据存储格式的接口描述语言,具有多语言支持,协议数据小,方便传输,高性能等特点.通过将结构化数据序列化(串行化)成二进制数组,并将二进制数组反 ...
- 什么是 Event Loop?
http://www.ruanyifeng.com/blog/2013/10/event_loop.html 什么是 Event Loop? 作者: 阮一峰 日期: 2013年10月21日 [2014 ...
- 【已解决】unity4.2.0f4 导出Android工程报错:Error building Player: ArgumentException: Illegal characters in path. [unity导出android工程 报错,路径含有非法字符]
使用unity3D开发的一个客户端,需要导出为Android工程,然后接入一些第三方android SDK. unity版本 操作系统为: OS 名称: Microsoft Windows 7 旗舰版 ...
- [leetcode]Path Sum II @ Python
原题地址:https://oj.leetcode.com/problems/path-sum-ii/ 题意: Given a binary tree and a sum, find all root- ...
- Twitter雪花算法 SnowFlake算法 的java实现
概述 SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法,它可以满足Twitter每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序. 原理 Sn ...
- C++两个矩阵相乘
/*编程求两个矩阵相乘的结果.输入第一行是整数m,n,表示第一个矩阵式m行n列的:然后是一个m * n的矩阵.再下一行的输入时整数p,q,表示下一个矩阵p行,q列的(n=p);然后就是一个p行q列的矩 ...
- AngulerJS学习(五)按需动态载入文件
在此之前我么年首先要先了解几个东西: $q 简单介绍: $q:主要解决的是异步编程的问题,是指描写叙述通过一个承诺行为与对象代表的异步运行的行动结果的交互.可能会也可能不会再不论什么时候完毕. 我们通 ...