鼠标点选通道对象的设计思路是,利用视线碰撞检测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 类
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。