现在的位置: 首页 > 综合 > 正文

SoRayPickAction类的基本使用

2013年10月09日 ⁄ 综合 ⁄ 共 1506字 ⁄ 字号 评论关闭

     SoRayPickAction 动作会沿着一条从相机射出的光线来查找物体,该射线会通过相机视景体近裁剪面上的一点,并通过由它所穿过给定窗口空间像素坐标确定。


1.
拾取的方式
     默认情况下可以对场景中的所有物体进行拾取操作,甚至包括不可见物体和透明物体。要使拾取动作对场景中的某个物体或物体群组无效,预先插入一个
SoPickStyle节点,然后将其Style域变量设置为UNPICKABLE。此时,对场景中的所有后续物体都将变得不可拾取,直到将SoPickStyle节点中的Style域变量重新设置为SHAPEBOUNDING_BOX时才会改变这种情况。SHAPE表示可以对场景中形状物体上的点进行拾取,BOUNDING_BOX表示可以对场景中物体包围盒上的点进行拾取。


2.
创建拾取动作对象
     使用它的构造函数
SoRayPickAction (const SbViewportRegion &viewportRegion),创建他的实例对象。viewportRegion:视口型参数,表示拾取动作所应用的作用区域。尽管拾取操作或许并不包含窗口自身的操作,但对于一些需要这些信息的节点来说,却可以用来判定他们的尺寸和位置。视口区参数也可以用作计算需要与计算机屏幕对齐的物体的包围盒.

 

3.设置拾取的方式
1)用窗口中的点和半径来给定拾取射线
     void setPoint(const SbVec2s &viewportPoint)
:通过射线所穿过的视口空间中的点来给定射线的位置。该射线从相机的视点射出;视口的大小则定义为一个从左下角(00)到右上角(width-1,height-1)的矩形,这里的widthheight为视口的宽和长(以像素为单位);
     void setRadius (float radiusInPixels)
radiusInPixels表示以给定点为中心的圆的半径,其默认值为5个像素。

(2)在世界坐标中给定拾取射线
     void setRay (const SbVec3f &start, const SbVec3f &direction,
                      float nearDistance=-1.0, float farDistance=-1.0)
    此时,这条射线通过世界空间中的一个点
const SbVec3f &start,一个向量const SbVec3f &direction,包围拾取物体的近裁剪平面float nearDistance和远裁剪平面float farDistance定义。在应用时,Open Inventor会自动对这个向量进行规格化处理(即向量的长度为1、方向与向量direction相同的向量);而近裁剪平面nearDistance和远裁剪平面farDistance两个参数则可用于求出沿射线上出现的两个交点之间的距离,如果该值为负数(如在默认情况下)则意味着不使用面裁剪。

 

4.拾取最近的物体
void setPickAll (SbBool flag)
函数可用来设置物体的拾取范围:
flag=TRUE
时,按照由远及近的顺序,返回所有拾取到的物体的信息;
flag=FALSE
时,只返回最靠近拾取点的那个物体的信息。

注意:要在场景中使用拾取动作SoRayPickAction进行物体对象的拾取时,需要能够提供场景所使用的相机节点。

Ps.向量进行规格化处理
(x,y,z)规格化后为(x/(x
2+y2+z2) 1/2,y/(x2+y2+z2) 1/2,z/(x2+y2+z2) 1/2
向量的长度:
(x2+y2+z2) 1/2,既坐标原点到点(x,y,z)的距离长度

抱歉!评论已关闭.