【问题标题】:Proper gluLookAt for gluCylindergluCylinder 的正确 gluLookAt
【发布时间】:2015-08-13 12:17:31
【问题描述】:

我正在尝试使用gluCylinder 在特定方向上绘制一个圆柱体。为了指定方向,我使用gluLookAt,但是,正如我之前的许多人一样,我不确定“向上”向量,因此无法让圆柱体指向正确的方向。

我从另一个 SO 答案中读到

gluLookAt 中“向上”向量背后的直觉很简单:看任何东西。现在将头倾斜 90 度。你所在的位置没有改变,你注视的方向没有改变,但你视网膜中的图像却清晰地改变了。有什么不同?头顶指向的地方。那是向上的向量。

这是一个简单的解释,但在我的圆柱体的情况下,我觉得向上向量完全不重要。由于圆柱体可以围绕其轴旋转并且看起来仍然相同,因此不同的向上向量不会改变任何内容。所以我的问题应该有无限多个有效的向上向量:从起点到终点的所有正交向量。

所以这就是我的工作:

  1. 我有圆柱体起点和终点的世界坐标,A_worldB_world

  2. 我将它们投影到视口坐标A_vpB_vpgluProject

    GLdouble A_vp[3], B_vp[3], up[3], model[16], projection[16];
    GLint gl_viewport[4];
    glGetDoublev(GL_MODELVIEW_MATRIX, &model[0]);
    glGetDoublev(GL_PROJECTION_MATRIX, &projection[0]);
    glGetIntegerv(GL_VIEWPORT, gl_viewport);
    
    gluProject(A_world[0], A_world[1], A_world[2], &model[0], &projection[0], &gl_viewport[0], &A_vp[0], &A_vp[1], &A_vp[2]);
    
    gluProject(B_world[0], B_world[1], B_world[2], &model[0], &projection[0], &gl_viewport[0], &B_vp[0], &B_vp[1], &B_vp[2]);
    
  3. 我调用glOrtho将相机重置为默认位置:负z进入图片,x向右,y向上:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, vp_edgelen, vp_edgelen, 0, 25, -25);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    
  4. 我翻译成坐标A_vp,计算向上向量作为向量A_vp — B_vp的法线,并用gluLookAt指定视图:

    glTranslatef(A_vp[0], gl_viewport[2] - A_vp[1], A_vp[2]);
    glMatrixMode(GL_MODELVIEW);
    
    GLdouble[] up = {A_vp[1] * B_vp[2] - A_vp[2] * B_vp[1], 
                     A_vp[2] * B_vp[0] - A_vp[0] * B_vp[2],
                     A_vp[0] * B_vp[1] - A_vp[1] * B_vp[0]};
    
    gluLookAt(0, 0, 0,
              B_vp[0], gl_viewport[2] - B_vp[1], B_vp[2],
              up[0], up[1], up[2]);
    
  5. 我用gluCylinder画圆柱体:

    GLUquadricObj *gluCylObj = gluNewQuadric();
    gluQuadricNormals(gluCylObj, GLU_SMOOTH);
    gluQuadricOrientation(gluCylObj, GLU_OUTSIDE);
    gluCylinder(gluCylObj, 10, 10, 50, 10, 10);
    

这是意想不到的结果:

由于圆柱体从正确的位置开始,并且我能够在位置 B_vp 处画一个圆,唯一肯定是错误的就是 gluLookAt 中的“向上”向量,对吧?

【问题讨论】:

  • 你的系统是什么?使用旧的 OpenGL 真的有充分的理由吗?看看新的,例如在this 教程中。
  • 你能发布更多关于渲染上下文的信息吗?例如。你如何渲染其他的东西?用伪代码发布就足够了。
  • 好的,我想我得到了你的错误。目前,您正在创建一个指向屏幕外的向上向量,但您想要的是一个从A_vpB_vp 的向上向量。所以你只需要改变叉积与差B_vp - A_vp
  • 您的意思是,使用B_vp - A_vp 向量作为上向量,而不是使用叉积作为上向量?但这是不正确的,因为这是我的圆柱体应该所在的向量。在gluCylinder 文档中,它说圆柱体将指向 z 方向。
  • 哦,关于现代 OpenGL,谢谢你的链接。不幸的是,这不是我的私人项目,所以我在这方面受到限制:(

标签: c++ opengl glulookat


【解决方案1】:

gluLookAt() 不是获得正确视角所必需的。旋转当前的 z 向量使其指向圆柱体应指向的方向就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多