- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OSG的Dragger系统架构与算法分析 (magicstone Simbaforrest)
开放合作
很高兴能够和Simbaforrest筒子合作,让我们开放合作来把大家对于OSG的分析记录下来,对于OSG的在国内的普及和让OSG服务于国内的软件行业的发展敬一份微薄的力量。同时也在这里倡议大家能够一起来把OSG的分析合作整理出来,发挥各自的力量!
Dragger系统作用论述
Dragger系统主要用来对模型空间位移信息的编辑,这个系统在3D空间的场景中给美术创作人员起到很大的帮助。
Dragger算法原理简述
Dragger主要是将用户在屏幕窗口的鼠标消息,通过对应的Projector算法来求出各种类型Projector对应的空间位置,这样记录用户的屏幕窗口消息的变化,求出3D空间中位移的变化,得出用户对3D模型在空间中位移变化的操作。
Dragger程序架构
主体架构
Dragger系统架构信息处理描述
聚合了所有的各种类型的Dragger,是Dragger系统的核心,其在Dragger系统中的作用是处理外设的输入消息。通过算法,将鼠标的窗口坐标信息转换到PointInfo结构信息。根据鼠标的点击事件类型,转换到对应的Dragger事件类型,同时根据鼠标点击选择拣选出选中的Dragger来处理,根据多态的机制,对应有具体的类型Dragger来具体处理。每个Dragger对应有自身的窗口屏幕鼠标位移到3D坐标空间的位移的Projector映射算法,通过Projector算出来此次位移的3D空间位置或者旋转量,此后通过Command命令模式,将具体的Dragger空间相对变换量,打包到具体的Command中去,然后由CommandManager来负责将各种类型的Command调用其执行命令接口,其实就是将其自身传递到Selection处理Command接口处理。Selection中接受到各种不同命令时,根据命令不同获取命令空间的变化量信息,将Selection对象空间做位移。
上面大致描述了Dragger系统的运作,具体其实可以用动态图来具体呈现,但是其实这个系统挺简单的,所以也就简单描述下,相信有些程序经验的也都能明白^_^。
Selection架构与作用论述
从Selection类的继承层次关系我们就可以看出来,从Selection名字顾名思义也可以看出来,Selection是用来在场景中被选中并做3D空间位移与外部交互的类。该类还可以是一个场景图的组,可以加入和管理其他的子节点。
该类函数处理各种空间位移命令,也即把各种空间位移命令中记录的空间位移变化信息使用到该节点的空间变化中来。
Command架构与作用论述
记录各种类型的空间位移变化量,采用了命令模式。
Constraint架构与作用论述
约束器对于空间位移起到移动的约束作用,比如位移需要按照2个单位来位移,那么就可以对具体的Command中的空间位移变化数据来做修改操作,从而起到约束的作用,在这里不得不说OSG设计采用了很多好的模式啦^_^。
Projector架构与作用论述
Projector用来对窗口屏幕的2D坐标根据一定得规则映射到具体的3D坐标,看上图可以发现有很多种的Projector映射模式,线的,面得,球的等等,这些是2D屏幕坐标转换到3D空间坐标的具体规则类型。具体的算法分析还得看 Simbaforrest筒子的分析,^_^,当然这些具体的算法是本Dragger系统的最最核心的技术,看Simbaforrest筒子的努力啦。
Simbaforrest:好,那我就继续班门弄斧一回:)
Dragger中的Projector
花开两朵,各表一枝,各位看官应该还记得上回(见《OSG拖拽器 Dragger简介之二——PointerInfo》)我们说要到Translate1DDragger中的handle函数看PointerInfo用法,结果发现其中的Projector才是真正的主角,不错,我们今天就先来好好看看这个handle中的Projector到底是何方神圣。
来到Translate1DDragger::handle中,可以看到函数主体框架如下:
其中“…*…”的字样表示该部分使用了Projector。
“…1…”中的语句作了这么一个简单的事情:获得本Dragger到世界坐标系的变换矩阵localToWorld;
“…2…”中的语句是重头戏,调用了Projector的project函数,虽然我们现在还不太清楚这个函数是干啥的,但是大概可以猜到:它通过第一个参数PointerInfo中的信息,进行一些计算,得到一个3维点通过第二个参数传出。其具体原理,我们待会再说;
“…3…”中的调用Projector的语句就是A piece of cake了,不过它
文档评论(0)