SoRayPickAction类的基本使用

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


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


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

 

3.设置拾取的方式
(1)用窗口中的点和半径来给定拾取射线
     void setPoint(const SbVec2s &viewportPoint):通过射线所穿过的视口空间中的点来给定射线的位置。该射线从相机的视点射出;视口的大小则定义为一个从左下角(0,0)到右上角(width-1,height-1)的矩形,这里的width和height为视口的宽和长(以像素为单位);
     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/(x2+y2+z2) 1/2,y/(x2+y2+z2) 1/2,z/(x2+y2+z2) 1/2
向量的长度:(x2+y2+z2) 1/2,既坐标原点到点(x,y,z)的距离长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值