游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7842|回复: 7

视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

[复制链接]

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2006-11-24 15:47:00 | 显示全部楼层 |阅读模式
我做的一个三维点显示、旋转、平移、拾取等操作。
相关资料如下:

旋转 : 刚开始是通过glRotatef()函数控制,可是在点选拾取的过程中,出错误了.
现在要通过通过改变gluLookAt()的参数,来控制.

平移 : 刚开始是通过glTranslatef()函数控制,可是在点选拾取的过程中,出错误了.
现在要通过通过改变gluLookAt()的参数,来控制.

缩放 :
缩小放大是通过改变参数m_fViewWidth,m_fViewWidth,-m_fViewHeight,m_fViewHeight来实现的。

投影方式
glOrtho(-m_fViewWidth,m_fViewWidth,-m_fViewHeight,m_fViewHeight,m_fViewNear,m_fViewFar);

拾取操作是通过gluUnProject();实现的。

现在出了个错误,就是三维点在平移、旋转时,在渲染的过程中调用了glRotatef(),glTranslatef()。之后,再调用gluUnProject()结果就不对了。看了一些帖子(http://dev.csdn.net/develop/article/53/53414.shtm),说是glRotatef(),glTranslatef()改变了视图矩阵,gluUnProject的应有相关变动(射线应该反向变化)。

我想问问“gluUnProject的应有相关变动(射线应该反向变化)”具体是什么意思??  

请做过相关程序的前辈指教!!(下面是效果图)
sf_20061124154726.jpg

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2006-11-24 16:12:00 | 显示全部楼层

Re:视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

我找到DirectX的pick例子,先看看.欢迎操作过opengl的前辈指教!!

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2006-11-24 20:52:00 | 显示全部楼层

Re:视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

OPENGL里面直接有支持 select/feedback的 函数。能够用来返回一些当前在视锥里的物体的名字。

http://www.lighthouse3d.com/opengl/picking/

“gluUnProject的应有相关变动(射线应该反向变化)”我想应该不要做什么变化的。

        如果矩阵模式是: GL_MODELVIEW or GL_PROJECTION,glTranslate会改变modelview,或者project矩阵吧。只要glunproject里面的矩阵是改变过后的据政就没问题了吧
但是gluUnProject

1

主题

102

帖子

108

积分

注册会员

Rank: 2

积分
108
QQ
发表于 2006-11-26 23:36:00 | 显示全部楼层

Re:视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

可我的就没有问题
只不过是gluPerspective

摄像机类也全是glRotate glTranslate
vb.net

        '得到射线的起点和终点
        Public Shared Sub PickRay(ByVal CursorPos As Point2Di, ByRef RayStart As Point3D, ByRef RayEnd As Point3D)

            Dim o1x, o1y, o1z As Double
            Dim o2x, o2y, o2z As Double

            Dim Viewport(0 To 3) As Integer
            GL.glGetIntegerv(GL.GL_VIEWPORT, Viewport)

            GL.gluUnProject(CursorPos.x, (Viewport(3) - CursorPos.y - 1), 0.0, Render3D.Frustum.mv_mat, Render3D.Frustum.p_mat, Viewport, o1x, o1y, o1z)
            GL.gluUnProject(CursorPos.x, (Viewport(3) - CursorPos.y - 1), 1.0, Render3D.Frustum.mv_mat, Render3D.Frustum.p_mat, Viewport, o2x, o2y, o2z)

            RayStart = ExpressVtr(o1x, o1y, o1z)
            RayEnd = ExpressVtr(o2x, o2y, o2z)
        End Sub

此过程获得从鼠标出去到远裁减平面的射线,和我写的东西的别的地方联系着,
Render3D.Frustum.mv_mat : modelview matrix
Render3D.Frustum.p_mat: projection matrix
Point3D : 结构体 ,表示空间点,向量
RayStart = ExpressVtr(o1x, o1y, o1z):相当于RayStart  = New Point3D(o1x, o1y, o1z)

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2006-12-1 08:19:00 | 显示全部楼层

Re:视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

/**
*world coordinate to scene coordinate;
*@param[in] objX world coord: X
*@param[in] objY world coord: Y
*@param[in] objZ world coord: Z
*return RETURN the scene coord.
**/
Tuple3f SceneOBJ::WorldToScene(float objX,float objY,float objZ)
{

GLint realy;
GLdouble win_x,win_y,win_z;
int viewport[4];
double mvmatrix[16],projmatrix[16];

//::wglMakeCurrent(m_hDC,m_hRC);

glGetIntegerv(GL_VIEWPORT,viewport);

for(int i=0;i<16;i++)
mvmatrix = Trans_Matrix.m;
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);


gluProject((GLdouble)objX,(GLdouble)objY,(GLdouble)objZ,mvmatrix,projmatrix,viewport,&win_x,&win_y,&win_z);

realy = viewport[3]-(GLint)win_y -1;// 左上角为坐标原点

Tuple3f temp(win_x,realy,win_z);

//::wglMakeCurrent(NULL,NULL);

return temp;
}

//========================================================
I think you have two ways to get the model matrix.
1)just like what I do ,calculate the tranform Matrix by yourself,and not use the opengl function like "glTranlate/glRotate...",and then you can get the tran_matrix anywhere.
2)if you don't like the fist way.you can do it like this :
fist,create a global matrix array "float gModelMatrix[16];"
and then ,use this function "glGetFloatv(GL_MODELVIEW_MATRIX, gModelMatrix);" in the renderning callback , between glPushMatrix and glPopMatrix.

void Render()
{
glPushMatrix()
glTrinslatef(...)
glRotatef(....)

glGetFloatv(GL_MODELVIEW_MATRIX, gModelMatrix);"
draw_obj();

glPopMatrix();


}

you know,this way would slow down the render speed.

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2006-12-1 08:25:00 | 显示全部楼层

Re:视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

简单地说,就是在调用了“glTranslate,glRotate”之后要调用下面这个函数来取得,模型变换矩阵。如果你在glPopMatrix之后再来取得变换矩阵,取到的是单位矩阵,这样当然会拾取不到。


glGetFloatv(GL_MODELVIEW_MATRIX, gModelMatrix);"

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2006-12-1 11:13:00 | 显示全部楼层

Re: 视图平移后,拾取操作出问题了,请教OpenGL拾取操作

huawenguang;Canbitwell;lanlan  谢谢你们,这个问题我已经解决了,是用的opengl里面标准的拾取方法.gluPickMatrix()解决的.

我的qq是 332905873

希望能和你们常讨论问题.
问题解决后的截图如下:
sf_2006121111329.jpg

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2008-11-28 14:50:00 | 显示全部楼层

Re:视图平移后,拾取操作出问题了,请教OpenGL拾取操作!!

opengl里面标准的拾取方法 效率如何?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 20:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表