gluProject 和 2D 显示
Posted
技术标签:
【中文标题】gluProject 和 2D 显示【英文标题】:gluProject and 2D display 【发布时间】:2013-07-10 08:20:25 【问题描述】:我想在使用 gluProject() 从 3D 点计算的 2D 点处显示 2D 图像。 所以我有我的 3D 点,我使用 gluProject 来获取它的 2D 坐标,然后我在这一点上显示我的图像。 它运作良好,但我的 Z 坐标存在问题,这使我的图像在屏幕上出现两次:它应该真正出现的位置和“相反的位置”。
让我们举个例子:相机在 (0,0,0),我看 (0,0,-1) 所以在负 Z 方向。
我为我的对象使用 3D 点 (0,0,-1),gluProject 将我的窗口中心作为 2D 点提供给我,这是一个好点。
所以当我朝 (0,0,-1) 的方向看时,我的 2D 图像出现了,当我旋转时,它会很好地移动,直到点 (0,0,-1) 不可见,这使得 2D 图像走出屏幕所以不显示。
但是当我看 (0,0,1) 时,它也出现了。因此,例如,如果我使用 3D 点 (0,0,-1) 和 (0,0,1),我会得到相同的结果(用于显示我的 2D 图像)。我认为这与 gluProject 返回的 Z 坐标有关,但我不知道是什么。
这是我的代码:我的 zNear=0.1 和 zFar=1000
GLint viewport[4];
GLdouble modelview[16];
GLdouble viewVector[3];
GLdouble projection[16];
GLdouble winX, winY, winZ;//2D point
GLdouble posX, posY, posZ;//3D point
posX=0.0;
posY=0.0;
posZ=-1.0;//the display is the same if posZ=1 which should not be the case
//get the matrices
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
viewVector[0]=modelview[8];
viewVector[1]=modelview[9];
viewVector[2]=modelview[10];
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
int res=gluProject(posX,posY,posZ,modelview,projection,viewport,&winX,&winY,&winZ);
if(viewVector[0]*posX+viewVector[1]*posY+viewVector[2]*posZ<0)
displayMyImageAt(winX,windowHeight-winY);
那么,我需要做些什么来获得我的 2D 图像的良好显示,也就是说要考虑 Z?
【问题讨论】:
我说得对吗:您想显示两张 2D 图像,一张与 pos (0, 0, 1) 相关,另一张与 (0, 0, -1) 相关?但只显示离观看者更近的那个? 我希望每个 3D 点只显示一张图像。如果没有 Vasaka 给出的修正,当我查看 (0,0,1) 和查看 (0,0,-1) 时,我会显示两张图像。 【参考方案1】:gluProject 工作正常,你的投影矩阵在屏幕平面上投影点,你应该检查点是否在后面,你可以通过计算你的视图向量和向量到点的点积来实现这一点,如果它小于 0 然后点落后了。
【讨论】:
谢谢,它工作得很好!我编辑我的消息以提供我的最终代码。但是,有一件事我不明白:当相机位于 (0,0,0) 并查看 (0,0,-1) 时,我得到 viewVector=(0,0,1) ,所以我希望得到 viewVecto=(0,0,-1)。如果 dotProd0,我只显示我的图像以获得我想要的。 你能解释一下“视图向量”和“向量到点”的含义吗?【参考方案2】:你的 DisplayImageAt 函数是什么?
它和我的代码中给出的这个显示函数类似吗? 我也在尝试获取所选 3d 坐标点的 2D 坐标。
这是我的展示几乎所有.. `无效显示() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMultMatrixd(_matrix);
glColor3f(0.5,0.5,0.5);
glPushMatrix(); //draw terrain
glColor3f(0.7,0.7,0.7);
glBegin(GL_QUADS);
glVertex3f(-3,-0.85,3);
glVertex3f(3,-0.85,3);
glVertex3f(3,-0.85,-3);
glVertex3f(-3,-0.85,-3);
glEnd();
glPopMatrix();
glPushMatrix();
myDefMesh.glDraw(meshModel);
glPopMatrix();
glutSwapBuffers();
'
【讨论】:
函数displayMyImageAt(winX,windowHeight-winY);只是在屏幕上显示 2D 元素。在我的例子中,它是一个 Qt 图形项,所以我只是将它的 2D 位置设置为 (winX,windowHeight-winY),由 gluProject 计算得出。以上是关于gluProject 和 2D 显示的主要内容,如果未能解决你的问题,请参考以下文章
cocos2d iOS 中的 Post Path Projection ( trail )
cocos2d-x 3.0正式版 cmd创建project以及一键创建project
Cocos2d-x 3.0游戏开发之win32配置环境搭建project
尝试使用 Equirectangular Projection 将 2D 坐标转换为 3D 坐标。但失败了。我究竟做错了啥?