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 )

coco2d-x怎样创建project

cocos2d-x 3.0正式版 cmd创建project以及一键创建project

Cocos2d-x 3.0游戏开发之win32配置环境搭建project

尝试使用 Equirectangular Projection 将 2D 坐标转换为 3D 坐标。但失败了。我究竟做错了啥?

cocos2d-x-3.2 怎样创建新project