文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>OpenGL环境下的射线选择

OpenGL环境下的射线选择

时间:2010-08-26  来源:不一样的精彩

 

用过OpenGL的人,应该都知道,OpenGL是自带拾取功能的,但用过的人应该也知道,这功能确实不好用。代码 int APIENTRY gluUnProject (

    GLdouble       winx, 

    GLdouble       winy, 

    GLdouble       winz, 

    const GLdouble modelMatrix[16], 

const GLdouble projMatrix[16], 

const GLint    viewport[4], 

    GLdouble       *objx, 

    GLdouble       *objy, 

    GLdouble       *objz);

 

 

其中前三个值表示窗口坐标,中间三个分别为模型视图矩阵(Model/View Matrix),投影矩阵(Projection Matrix)和视区(ViewPort),最后三个为输出的世界坐标值。

第二步,首先获得视图矩阵,投影矩阵,视区三个数组值。

 

代码  GLint    viewport[4]; 
 GLdouble modelview[16]; 
 GLdouble projection[16]; 

 

 glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
 glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
 glGetDoublev(GL_PROJECTION_MATRIX, projection); 

 

获取这三个变量的代码,应该放在绘制发生前,三个矩阵定以后。否则glPopMatrix之类的函数,可能导致你无法得到真正的投影矩阵和视图矩阵。

第三步,获取射线。因为两点确定一条线,所以,先通过计算视图最近点和最远点,得到该射线。

 

代码  winX = point.x; 
 winY = screenHeight - point.y; 

//获取像素对应的前裁剪面的点坐标
 bool bResult = gluUnProject(winX, winY, 0.0, modelview, projection, viewport, &posX, &posY, &posZ); 
 FPoint3 nearPoint;
 nearPoint.x = posX; nearPoint.y = posY; nearPoint.z = posZ;
 //获取像素对应的后裁剪面的点坐标
 bResult = gluUnProject(winX, winY, 1.0, modelview, projection, viewport, &posX, &posY, &posZ); 
 FPoint3 farPoint;
 farPoint.x = posX; farPoint.y = posY; farPoint.z = posZ;

 

 

 

第四步,计算待选择目标跟该的关系,将与射线距离最近的对象,作为选择对象。

 

第五步,本文绘制了分布在不同三维空间的5个点,用鼠标右键,可以进行点的选择,如果选中,点会变成黄色,鼠标左键可以随意对这些点进行旋转等。

程序源代码


 

 

相关阅读 更多 +
排行榜 更多 +
幸存者的命运

幸存者的命运

飞行射击 下载
精英战区3d

精英战区3d

飞行射击 下载
货运猎人

货运猎人

飞行射击 下载