理论教育 Picker类设计实现:VegaPrime虚拟现实开发技术

Picker类设计实现:VegaPrime虚拟现实开发技术

时间:2023-11-25 理论教育 版权反馈
【摘要】:Picker 类包含两个私有成员,第一个是视线碰撞检测对象m_isector,另一个是自定义的节点类型对象m_mode。物体对象MODE_OBJECT 包含整个的目标对象,是本书设计中默认使用的值;几何体对象MODE_GEOMETRY 可以为物体对象的某一部分的几何体。Picker 类的核心功能函数为:vsNode *pick;该函数较为复杂,第一个参数为当前场景通道,mx 和my 分别为鼠标点击处的通道屏幕平面坐标的x 值和y 值。pick 函数首先解决的问题是投影问题。具体代码如图9.5.1所示。图9.5.1通道挑选Picker 类

Picker类设计实现:VegaPrime虚拟现实开发技术

鼠标点选通道对象的设计思路是,利用视线碰撞检测vpIsectorLOS 检测鼠标点击位置是否与通道内三维空间物体发生碰撞,如果发生了碰撞,以碰撞点为起点,寻找父节点,找到鼠标点选的对象,然后使用不同的渲染策略,对选中的对象进行不同的渲染。该功能的核心是视线碰撞检测vpIsectorLOS,该碰撞检测以当前通道场景为检测对象,以碰撞检测体的位置和方向为基准,沿着Y 坐标正向设置检测线段,在碰撞检测中该线段进行了H 和P 方向360°旋转检测。

Picker 类包含两个私有成员,第一个是视线碰撞检测对象m_isector,另一个是自定义的节点类型对象m_mode。这里,对于鼠标点选的目标类型Mode 分为四种,分别为物体对象MODE_OBJECT、几何体对象MODE_GEOMETRY、DOF 对象MODE_DOF 和LOD 对象MODE_LOD。物体对象MODE_OBJECT 包含整个的目标对象,是本书设计中默认使用的值;几何体对象MODE_GEOMETRY 可以为物体对象的某一部分的几何体。

构造函数Picker 包含两个参数:一个是视线碰撞检测对象,另一个为视线碰撞检测掩码。在该函数中,对节点类型m_mode 初始化为MODE_OBJECT;对视线碰撞检测对象m_isector进行实例化和设置。

Picker 类的核心功能函数为:

vsNode *pick(vpChannel *channel,float mx,float my);

该函数较为复杂,第一个参数为当前场景通道,mx 和my 分别为鼠标点击处的通道屏幕平面坐标的x 值和y 值。

pick 函数首先解决的问题是投影问题。获取当前视觉矩阵,如果为正射投影orthographic projection,则直接计算视线碰撞检测的相关参数;如果为透视投影perspective projection,则需要对鼠标坐标进行矩阵转换,由世界坐标转换计算得到视线碰撞检测的相关参数。

得到视线碰撞检测对象m_isector的相关参数后,就可以利用以下代码设置碰撞参数:

m_isector->setTranslate(x,y,z);

m_isector->setRotate(h,p,0.0);

m_isector->setSegmentRange(range);(www.daowen.com)

然后利用以下代码实施碰撞检测,查看碰撞是否发生:

vsNode *node=NULL;

m_isector->update();

如果碰撞发生,就根据设置的节点类型返回vsNode 类型的目标节点对象node。

具体代码如图9.5.1所示。

图9.5.1 通道挑选Picker 类

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈