【问题标题】:Trouble with the use of gluLookAt使用 gluLookAt 的问题
【发布时间】:2019-03-22 13:50:38
【问题描述】:

我已经查看了多个关于此的问题,包括this 一个。我想要的是一个人从走廊往下看,在人的侧面看左右墙的后墙。这是我的代码:

初始化

float lookAtX = 0, lookAtY = 0, lookAtZ = -2.5, posX = 0, posY = 0, posZ = 0;

绘图

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);

    gluLookAt(
        posX, posY, posZ, 
        lookAtX, lookAtY, lookAtZ, 
        0, 0, 1
    );
    // Back
    glBegin(GL_POLYGON);
    glColor3f(255, 0, 0); // Red
    glVertex3f(-2.5, -2.5, 2.5);
    glVertex3f(2.5, 2.5, 2.5);
    glVertex3f(2.5, -2.5, 2.5);
    glVertex3f(-2.5, -2.5, 2.5);
    glEnd();

    // Left
    glBegin(GL_POLYGON);
    glColor3f(0, 255, 0); // Green
    glVertex3f(-2.5, 2.5, 2.5);
    glVertex3f(-2.5, 2.5, -2.5);
    glVertex3f(-2.5, -2.5, 2.5);
    glVertex3f(-2.5, -2.5, -2.5);
    glEnd();

    // Right
    glBegin(GL_POLYGON); 
    glColor3f(0, 0, 255); // Yellow
    glVertex3f(2.5, 2.5, 2.5);
    glVertex3f(2.5, 2.5, -2.5);
    glVertex3f(2.5, -2.5, 2.5);
    glVertex3f(2.5, -2.5, -2.5);
    glEnd();

    glFlush();
    window.pushGLStates();

我确信外部代码是正确的,因为我有另一段具有相同骨架的代码。我也相信这会奏效......但我想它没有 xD。为什么会出现黑屏,为什么不显示墙壁?感谢您抽出宝贵时间阅读本文

【问题讨论】:

  • 那么……你到底想问什么问题?
  • @MichaelKenzel 为什么会出现黑屏,为什么不显示墙壁?
  • glm 是更好的东西。它也有 LookAt() 。不要使用 glfw 等,使用 glew .github.com/alexeyneu/glsl-base/blob/…

标签: c++ opengl sfml


【解决方案1】:

值得注意的是,glBegin/glEnd 序列的绘图已被弃用数年。 阅读Fixed Function Pipeline 并查看Vertex SpecificationShader,了解最先进的渲染方式。


无论如何,你必须设置一个透视投影矩阵。但请注意,gluLookAtgluPerspective 之类的运算不仅定义矩阵。
此操作定义一个矩阵并将矩阵堆栈上的当前矩阵乘以新矩阵。这意味着您必须首先通过单位矩阵初始化矩阵上的矩阵。这可以通过glLoadIdentity 完成。

使用gluPerspective在投影矩阵栈上设置透视投影-glMatrixMode( GL_PROJECTION )

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 90.0f, view_width / view_height, 0.1f, 10.0f );

当你设置了视图矩阵,那么你必须改变视角,看向“走廊”的方向。因为你看的是 z 轴,所以向上的向量必须是 (0, 1, 0):

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
float lookAtX = 0, lookAtY = 0, lookAtZ = 0, posX = 0, posY = 0, posZ = -5;
gluLookAt( posX, posY, posZ, lookAtX, lookAtY, lookAtZ, 0, 1, 0 );

最后你的顶点坐标是混合的。改成这样:

// Back
glBegin(GL_POLYGON);
glColor3ub(255, 0, 0); // Red
glVertex3f(-2.5, -2.5, 2.5);
glVertex3f(-2.5,  2.5, 2.5);
glVertex3f( 2.5,  2.5, 2.5);
glVertex3f( 2.5, -2.5, 2.5);
glEnd();

// Left
glBegin(GL_POLYGON);
glColor3ub(0, 255, 0); // Green
glVertex3f(-2.5,  2.5,  2.5);
glVertex3f(-2.5,  2.5, -2.5);
glVertex3f(-2.5, -2.5, -2.5);
glVertex3f(-2.5, -2.5,  2.5);
glEnd();

// Right
glBegin(GL_POLYGON); 
glColor3ub(0, 0, 255); // Blue
glVertex3f(2.5,  2.5,  2.5);
glVertex3f(2.5,  2.5, -2.5);
glVertex3f(2.5, -2.5, -2.5);
glVertex3f(2.5, -2.5,  2.5);
glEnd();

预览:

【讨论】:

  • 谢谢 :) 我已经为此苦恼很久了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多