OSG的Dragger系统架构与算法分析090413
OSG的Dragger系统架构与算法分析 (magicstone & Simbaforrest)
开放合作
很高兴能够和Simbaforrest筒子合作,让我们开放合作来把大家对于OSG的分析记录下来,对于OSG的在国内的普及和让OSG服务于国内的软件行业的发展敬一份微薄的力量。同时也在这里倡议大家能够一起来把OSG的分析合作整理出来,发挥各自的力量!
Dragger系统作用论述
Dragger系统主要用来对模型空间位移信息的编辑,这个系统在3D空间的场景中给美术创作人员起到很大的帮助。
Dragger算法原理简述
Dragger主要是将用户在屏幕窗口的鼠标消息,通过对应的Projector算法来求出各种类型Projector对应的空间位置,这样记录用户的屏幕窗口消息的变化,求出3D空间中位移的变化,得出用户对3D模型在空间中位移变化的操作。
Dragger程序架构
主体架构
DraggerProjectorCommandConstraint
Dragger系统架构信息处理描述
聚合了所有的各种类型的Dragger,是Dragger系统的核心,其在Dragger系统中的作用是处理外设的输入消息。通过算法,将鼠标的窗口坐标信息转换到PointInfo结构信息。根据鼠标的点击事件类型,转换到对应的Dragger事件类型,同时根据鼠标点击选择拣选出选中的Dragger来处理,根据多态的机制,对应有具体的类型Dragger来具体处理。每个Dragger对应有自身的窗口屏幕鼠标位移到3D坐标空间的位移的Projector映射算法,通过Projector算出来此次位移的3D空间位置或者旋转量,此后通过Command命令模式,将具体的Dragger空间相对变换量,打包到具体的Command中去,然后由CommandManager来负责将各种类型的Command调用其执行命令接口,其实就是将其自身传递到Selection处理Command接口处理。Selection中接受到各种不同命令时,根据命令不同获取命令空间的变化量信息,将Selection对象空间做位移。
上面大致描述了Dragger系统的运作,具体其实可以用动态图来具体呈现,但是其实这个系统挺简单的,所以也就简单描述下,相信有些程序经验的也都能明白^_^。
Selection架构与作用论述
NodeGroupTransformMatrixTransformSelection
从Selection类的继承层次关系我们就可以看出来,从Selection名字顾名思义也可以看出来,Selection是用来在场景中被选中并做3D空间位移与外部交互的类。该类还可以是一个场景图的组,可以加入和管理其他的子节点。 该类函数处理各种空间位移命令,也即把各种空间位移命令中记录的空间位移变化信息使用到该节点的空间变化中来。
Command架构与作用论述
CommandManagerTranslateInLineCommand结束1TranslateInPlaneCommand结束2MotionCommandScale1DCommandScale2DCommandScaleUniformCommandRotate3DCommand
记录各种类型的空间位移变化量,采用了命令模式。
Constraint架构与作用论述
ConstraintGridConstraint
约束器对于空间位移起到移动的约束作用,比如位移需要按照2个单位来位移,那么就可以对具体的Command中的空间位移变化数据来做修改操作,从而起到约束的作用,在这里不得不说OSG设计采用了很多好的模式啦^_^。
Projector架构与作用论述
LineProjectorPlaneProjectorSphereProjectorProjectorCylinderProjectorSpherePlaneProjectorCylinderPlaneProjector
Projector用来对窗口屏幕的2D坐标根据一定得规则映射到具体的3D坐标,看上图可以发现有很多种的Projector映射模式,线的,面得,球的等等,这些是2D屏幕坐标转换到3D空间坐标的具体规则类型。具体的算法分析还得看 Simbaforrest筒子的分析,^_^,当然这些具体的算法是本Dragger系统的最最核心的技术,看Simbaforrest筒子的努力啦。
Simbaforrest:好,那我就继续班门弄斧一回:)
Dragger中的Projector
花开两朵,各表一枝,各位看官应该还记得上回(见《OSG拖拽器 Dragger简介之二——PointerInfo》)我们说要到Translate1DDragger中的handle函数看PointerInfo用法,结果发现其中的Projector才是真正的主角,不错,我们今天就先来好好看看这个handle中的Projector到底是何方神圣。
来到Translate1DDragger::handle中,可以看到函数主体框架如下: switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { …1… } If(…2…) {…3…} //Pick move case(osgGA::GUIEventAdapter::DRAG): { If(…2…) {…3…} } //Pick finish case(osgGA::GUIEventAdapter::RELEASE): { If(…2…) {…3…} } } 其中“…*…”的字样表示该部分使用了Projector。
“…1…”中的语句作了这么一个简单的事情:获得本Dragger到世界坐标系的变换矩阵localToWorld;
“…2…”中的语句是重头戏,调用了Projector的project函数,虽然我们现在还不太清楚这个函数是干啥的,但是大概可以猜到:它通过第一个参数PointerInfo中的信息,进行一些计算,得到一个3维点通过第二个参数传出。其具体原理,我们待会再说; “…3…”中的调用Projector的语句就是A piece of cake了,不过它是配合着MotionCommand使用的,具体如何使用这里就不详细说了。
看了这些,各位应该对Projector有了一个初步的认识,接下来我们就进入正题,来看“另一支花”——Projector。
Projector类概述
来到Projector头文件Projector类,跳过其他简单函数,我们看到这样的注释: /** * Calculates the object/world coordinates (projectedPoint) of a window * coordinate (pointToProject) when projected onto some shape or * geometry (implemented in derived classes). SceneView in used for i * projecting window coordinates into object coordinates and vice versa. * Returns true on successful projection. */ /** * 当某一个窗口坐标(pointToProject)投影到某个形状或是几何体上时, * 计算该窗口坐标对应的模型/世界坐标(该方法在子类中实现)。 * 成功投影则返回true */ virtual bool project(const PointerInfo& pi, osg::Vec3& projectedPoint) const = 0;
好吧,为了看看Projector::project到底怎么用,我们去看看其子类LineProjector中的实现(Translate1DDragger中使用的即是LineProjector):
相关推荐:
- [基础教育]2016-2022年中国钢芯铝绞线市场现状调
- [基础教育]语文部编版初一语文下册练习题 句式变
- [基础教育]南京继续教育参考答案--深入学习贯彻习
- [基础教育]国旗下讲话稿——珍惜时间好读书
- [基础教育]北师大版六年级数学下册圆锥的体积教学
- [基础教育]人教版-音乐-四年级下册-四年级下册音
- [基础教育]乔布斯2019年斯坦福大学毕业典礼致辞.d
- [基础教育]2015年加油站安全知识竞赛试题及答案
- [基础教育]2020年教师年度考核个人工作总结
- [基础教育]2019年中考历史试题-2019年大庆市初中
- [基础教育]初三仁爱英语第一轮总复习教案
- [基础教育]SG-A094电气配管安装工程隐蔽验收记录
- [基础教育]冀教版小学数学三年级下册第六单元教材
- [基础教育]青岛版(五制)小学科学二年级下册16《制
- [基础教育]2018-2019年初中科学初一中考真卷测试
- [基础教育]幼儿园大班期末简短评语精选
- [基础教育]2018云南临沧公务员考试申论技巧:这样
- [基础教育]学校食堂经营管理方案
- [基础教育]新中国砥砺奋进的七十年原文
- [基础教育]真空泵的选型及常用计算公式
- 高职田径课程教学现状与对策
- 全髋关节置换术在老年股骨颈骨折患者中
- 青人社厅函〔2016〕576号(附件)工资
- cp101-07砂子检验作业指导书 - secret
- 微观经济学 第八章 博弈论 习题
- 2014高考真题(词语运用)汇编及答案
- 2018年人教版七年级语文下册《第三单元
- 苏教版数学四年级上册第一单元试题 - M
- 四川大学新闻与传播考研2000-2010年真
- 浙江万里学院英语专业四年制本科教学计
- 最新2018马年事业祝福语-范文word版(2
- 最全模具行业术语英文翻译
- 皮亚杰的发展心理学理论
- 64篇高考情景式默写 练习题及答案
- 仿写(学生稿)
- 《SQL Server数据库技术》试卷A
- 第七章作业答案
- 江苏省赣榆县海头高级中学高中语文必修
- 浙江省2001年10月自考正常人体解剖学答
- 2012英语重点短语




