欢迎来到天天文库
浏览记录
ID:28872526
大小:335.00 KB
页数:7页
时间:2018-12-14
《osg地dragger系统架构与算法分析报告材料090413》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用标准文案OSG的Dragger系统架构与算法分析(magicstone&Simbaforrest)开放合作很高兴能够和Simbaforrest筒子合作,让我们开放合作来把大家对于OSG的分析记录下来,对于OSG的在国内的普及和让OSG服务于国内的软件行业的发展敬一份微薄的力量。同时也在这里倡议大家能够一起来把OSG的分析合作整理出来,发挥各自的力量!Dragger系统作用论述Dragger系统主要用来对模型空间位移信息的编辑,这个系统在3D空间的场景中给美术创作人员起到很大的帮助。Dragger算法原
2、理简述Dragger主要是将用户在屏幕窗口的鼠标消息,通过对应的Projector算法来求出各种类型Projector对应的空间位置,这样记录用户的屏幕窗口消息的变化,求出3D空间中位移的变化,得出用户对3D模型在空间中位移变化的操作。Dragger程序架构主体架构Dragger系统架构信息处理描述精彩文档实用标准文案聚合了所有的各种类型的Dragger,是Dragger系统的核心,其在Dragger系统中的作用是处理外设的输入消息。通过算法,将鼠标的窗口坐标信息转换到PointInfo结构信息。根据鼠标
3、的点击事件类型,转换到对应的Dragger事件类型,同时根据鼠标点击选择拣选出选中的Dragger来处理,根据多态的机制,对应有具体的类型Dragger来具体处理。每个Dragger对应有自身的窗口屏幕鼠标位移到3D坐标空间的位移的Projector映射算法,通过Projector算出来此次位移的3D空间位置或者旋转量,此后通过Command命令模式,将具体的Dragger空间相对变换量,打包到具体的Command中去,然后由CommandManager来负责将各种类型的Command调用其执行命令接口,
4、其实就是将其自身传递到Selection处理Command接口处理。Selection中接受到各种不同命令时,根据命令不同获取命令空间的变化量信息,将Selection对象空间做位移。上面大致描述了Dragger系统的运作,具体其实可以用动态图来具体呈现,但是其实这个系统挺简单的,所以也就简单描述下,相信有些程序经验的也都能明白^_^。Selection架构与作用论述从Selection类的继承层次关系我们就可以看出来,从Selection名字顾名思义也可以看出来,Selection是用来在场景中被选中并
5、做3D空间位移与外部交互的类。该类还可以是一个场景图的组,可以加入和管理其他的子节点。该类函数处理各种空间位移命令,也即把各种空间位移命令中记录的空间位移变化信息使用到该节点的空间变化中来。精彩文档实用标准文案Command架构与作用论述记录各种类型的空间位移变化量,采用了命令模式。Constraint架构与作用论述约束器对于空间位移起到移动的约束作用,比如位移需要按照2个单位来位移,那么就可以对具体的Command中的空间位移变化数据来做修改操作,从而起到约束的作用,在这里不得不说OSG设计采用了很多好
6、的模式啦^_^。精彩文档实用标准文案Projector架构与作用论述Projector用来对窗口屏幕的2D坐标根据一定得规则映射到具体的3D坐标,看上图可以发现有很多种的Projector映射模式,线的,面得,球的等等,这些是2D屏幕坐标转换到3D空间坐标的具体规则类型。具体的算法分析还得看Simbaforrest筒子的分析,^_^,当然这些具体的算法是本Dragger系统的最最核心的技术,看Simbaforrest筒子的努力啦。Simbaforrest:好,那我就继续班门弄斧一回:)Dragger中的P
7、rojector花开两朵,各表一枝,各位看官应该还记得上回(见《OSG拖拽器Dragger简介之二——PointerInfo》)我们说要到Translate1DDragger中的handle函数看PointerInfo用法,结果发现其中的Projector才是真正的主角,不错,我们今天就先来好好看看这个handle中的Projector到底是何方神圣。来到Translate1DDragger::handle中,可以看到函数主体框架如下:switch(ea.getEventType()){//Picksta
8、rt.case(osgGA::GUIEventAdapter::PUSH):{…1…If(…2…){…3…}}精彩文档实用标准文案//Pickmovecase(osgGA::GUIEventAdapter::DRAG):{If(…2…){…3…}}//Pickfinishcase(osgGA::GUIEventAdapter::RELEASE):{If(…2…){…3…}}}其中“…*…”的字样表示该部分使用了Projecto
此文档下载收益归作者所有