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)的更多相关文章

  1. SolidEdge 装配体中如何快速的搞定一个面上所有螺丝 如何在装配体上进行阵列

    1 点击"规则排列" 选择要排列的螺丝   2 选择被规则排列的架子   3 选择所有的圆孔(鼠标滑到任意圆孔位置,左键单击即可选中所有圆孔)   4 选择参考的基准孔(已经上了螺 ...

  2. SolidEdge如何为零件指定不同的颜色 给零件着色 给装配体着色

    格式-零件画笔 可以给零件的一个表面,或者一个特征着色   如果要指定不同的色彩,可以在格式-样式-面样式中修改   如果是给装配体着色,则点击任意零件,在"无"的选项卡里面修改颜 ...

  3. Solid Edge性质管理者 如何获取装配体的BOM表 物料清单

    工具-性质管理者 在里面可以输入每个文件的文件号,版本号,作者等信息   右击点击显示性质,你还可以添加或删除文件属性   把需要的属性更改好了之后,可以输出装配体的所有零件信息到Excel中,点击工 ...

  4. Solid Edge如何制作装配体的剖视图

    在装配体中,点击检视-剖面   选择剖切方向(向内是指把矩形框之内的东西去掉不要,向外是指把矩形框之外的东西去掉不要),选择剖切深度   最后效果如下图所示   你也可以选择不剖切的零件,效果如下图所 ...

  5. eclipse中(装了插件m2eclipse后的)导入maven工程显示"感叹号"

      有时候导入一些开源工程(maven结构的),在eclipse中(装了插件m2eclipse后的)该工程前面会有一个小的红色感叹号,但点开工程后没有发现有打小红叉的内容,这种情况其实大部分是jar包 ...

  6. Solidworks如何把装配体做成单个零件

    先把装配体另存为IGS格式   再把IGS打开之后另存为SLDPRT格式(打开IGS需要比较长的时间,中途会弹出提示,而且IGS文件体积也比较大)   另存为SLDPRT之后体积就很小了       ...

  7. VTK中获取STL模型点的坐标以及对其进行变换

    VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG.OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的 ...

  8. VTK中导入并显示STL、3DS文件

    VTK(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和科学计算可视化.VTK是在三维函数库OpenGL 的基础上采用面向对象的设计方法发展起 ...

  9. 37 VTK中的坐标系系统

    0 引言 在利用PCL的交互功能解决尺寸关联几何的指定问题时,涉及到一些显示上的操作.目前的需求是:将投影到注释平面上的点云,以与屏幕平齐的方式,显示在屏幕正中,这样方便用户进行操作.但是,在运用se ...

随机推荐

  1. JAVA 项目中使用 H2 数据库

    为什么要使用H2数据库 H2数据库是可以嵌入到JAVA项目中的,因为只需要导入一个jar包即可,所以非常的方便. 项目中导入H2 将H2的jar包放到classpath里即可,我是用的maven,ma ...

  2. SKU与SPU

    首先,搞清楚商品与单品的区别.例如,iphone是一个单品,但是在淘宝上当很多商家同时出售这个产品的时候,iphone就是一个商品了. 商品:淘宝叫item,京东叫product,商品特指与商家有关的 ...

  3. GDSL 1.7 发布,C语言通用数据结构库

    GDSL 1.7 修复了 interval-heap 模块的一个小 bug. GDSL (通用数据结构库) 包含一组程序用于操作各种数据结构.这是一个可移植的库,完全由 ANSI C 编写.为 C 开 ...

  4. Django查询 – id vs pk

    当编写django查询时,可以使用id / pk作为查询参数. Object.objects.get(id=1) Object.objects.get(pk=1) pk代表主键(primary key ...

  5. ASP.NET MVC 中使用JavaScriptResult asp.net mvc 返回 JavaScript asp.mvc 后台返回js

    return this.Content("<script>alert('暂无!');window.location.href='/Wap/Index';</script&g ...

  6. Dubbo的一些编码约定和设计原则

    编码约定 代码风格 Dubbo 的源代码和 JavaDoc 遵循以下的规范: Code Conventions for the Java Programming Language How to Wri ...

  7. Go语言之高级篇beego框架安装与使用

    一.beego框架 1.beego框架简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...

  8. 创建SQL作业错误的解决方法(不能将值 NULL 插入列 'owner_sid',表 'msdb.dbo.sysjobs';列不允许有空值。)

    在用SQL语句创建SQL Server作业时有时出现如下错误: 消息 515,级别 16,状态 2,过程 sp_add_job,第 137 行 不能将值 NULL 插入列 'owner_sid',表  ...

  9. 关于UI设计中的交互软件Axure7.0运用

    Axure RP是一个专业的快速原型设计工具.让负责定义需求和规格.设计功能和界面的人员能够快速创建应用软件或Web网站的线框图.流程图.原型和规格说明文档. 作为专业的原型设计工具,它能快速.高效的 ...

  10. 【Java】Java-正则匹配-性能优化

    Java-正则匹配-性能优化 Java 正则 点_百度搜索 在Java类中如何用正则表达式表示小数点啊?_百度知道 使用Jakarta-ORO库的几个例子 - 小橡树 - ITeye博客 正则表达式以 ...