Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.
2015-01-01 23:32
363 查看
在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点显示虽然不在一起,但是是一个Mesh.Ogre本身的检测只能检测到这里,在我们这不满足要求,相应的点,线,面检测都需要自己来计算.
在讲解本文之前,先看下射线的相关生成代码,只有先明白射线如何生成,生成最后是相对什么空间.
鼠标移动事件
结合前面讲解Ray的生成过程,我们知道,ray.Origin是鼠标点击的近截面上的点,而Direction是方向,因为已经归一化,也就是说这个是单位向量,那么我们只需要知道移动的目标与近截面的距离,就能得到我们点击z值了.
效果就是鼠标左键按下是确定与近截面的距离,然后移动的时候,在视截体里,x,y是变化的,z固定的.测试了一下,效果不错,很满意,如我视点移到Y轴上,与x,z面垂直,就能保证移动物体在x,z面,根据不同的视角移动,现实感还是很强,也没有感觉不合理的位置.
旋转就比较简单了,直接把鼠标的二维坐标映射过去就成,效果也还行.代码也在上面,不单独说了,缩放感觉放鼠标滚轮处理比较好,暂时不管了,就个很容易.最后是没选择物体是,摄像机会围绕模型旋转,具体实现大家看下代码就明白了.
新的一年第一天,确定今年主要自学内容,C++ 11与Ogre,在这个项目完成后,主要重新啃C++,最好能用Ogre实现一些功能.
在讲解本文之前,先看下射线的相关生成代码,只有先明白射线如何生成,生成最后是相对什么空间.
public override void MouseMove(MouseEventArgs e) { int offsetX = e.X - prePoint.X; int offsetY = e.Y - prePoint.Y; if (offsetX == 0 && offsetY == 0) return; if (Control.MouseButtons == MouseButtons.Left) { if (EngineCore.Instance.Select) { var node = EngineCore.Instance.ViewNode; if (EngineCore.Instance.ActionType == ActionType.Translate) { var ray = this.CreateViewportRay(e.X, e.Y); var pos = ray.Origin + ray.Direction * this.viewZ; node.DerivedPosition = pos; } else if (EngineCore.Instance.ActionType == ActionType.Rotate) { node.Yaw((Real)(new Degree((Real)(offsetX * 0.15f)))); node.Pitch((Real)(new Degree((Real)(offsetY * 0.15f)))); } else if (EngineCore.Instance.ActionType == ActionType.Scale) { } } else { Real dist = (this.camera.Position - EngineCore.Instance.ViewNode.DerivedPosition).Length; this.camera.Position = EngineCore.Instance.ViewNode.DerivedPosition; this.camera.Yaw((Real)(new Degree((Real)(-offsetX * 0.25f)))); this.camera.Pitch((Real)(new Degree((Real)(-offsetY * 0.25f)))); this.camera.MoveRelative(new Vector3(0, 0, dist)); EngineCore.Instance.AxisNode.Yaw((Real)(new Degree((Real)(-offsetX * 0.25f)))); EngineCore.Instance.AxisNode.Pitch((Real)(new Degree((Real)(-offsetY * 0.25f)))); } } this.renderWindow.Update(); prePoint = e.Location; base.MouseMove(e); }
鼠标移动事件
结合前面讲解Ray的生成过程,我们知道,ray.Origin是鼠标点击的近截面上的点,而Direction是方向,因为已经归一化,也就是说这个是单位向量,那么我们只需要知道移动的目标与近截面的距离,就能得到我们点击z值了.
效果就是鼠标左键按下是确定与近截面的距离,然后移动的时候,在视截体里,x,y是变化的,z固定的.测试了一下,效果不错,很满意,如我视点移到Y轴上,与x,z面垂直,就能保证移动物体在x,z面,根据不同的视角移动,现实感还是很强,也没有感觉不合理的位置.
旋转就比较简单了,直接把鼠标的二维坐标映射过去就成,效果也还行.代码也在上面,不单独说了,缩放感觉放鼠标滚轮处理比较好,暂时不管了,就个很容易.最后是没选择物体是,摄像机会围绕模型旋转,具体实现大家看下代码就明白了.
新的一年第一天,确定今年主要自学内容,C++ 11与Ogre,在这个项目完成后,主要重新啃C++,最好能用Ogre实现一些功能.
相关文章推荐
- 菜鸟学习OGRE和天龙八部之十六: 网游视角跑图功能基本实现,包括人物,射线查询,鼠标decal等等
- 3D模型下的鼠标拣选和碰撞检测-射线与圆的相交算法
- 3D空间中射线与三角形的交叉检测算法
- 关于3D物体坐标转换为UI坐标,随着鼠标拖拽等操作
- hdu1174(3维射线与圆是否相交)
- 3D游戏基础 空间几何(三) 变换、平面、射线
- Axiom3D:Ogre地形组件代码解析
- Axiom3D:Ogre地形组件代码解析
- Axiom3D:Ogre动画基本流程与骨骼动画
- 菜鸟学习OGRE和天龙八部之十六: 网游视角跑图功能基本实现,包括人物,射线查询,鼠标decal等等
- 一个java3d程序,作为熟悉3d技术的基础(可以使用鼠标对场景内的3d对象进行操作)
- DirectX 3D_基础之拾取 屏幕到投影窗口的变换 对射线进行变换 射线/物体相交判断
- 3D空间中射线与轴向包围盒AABB的交叉检测算法 【转】
- Axiom3D:Ogre动画基本流程与骨骼动画
- Ogre中级教程(二):射线场景查询及基础鼠标用法
- Unity 3d 射线(获得鼠标点击的坐标[x,y,z])
- ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)
- 3D空间中射线与三角形的交叉检測算法
- Unity 3D鼠标操作实现旋转、缩放观察物体
- 3D空间中射线与轴向包围盒AABB的交叉检测算法