0

我正在尝试用gluCylinder. 但是,要指定我使用的方向gluLookAt,就像我之前的许多人一样,我不确定“向上”向量,因此无法让圆柱体指向正确的方向。

我从另一个 SO 答案中读到

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

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

所以这就是我所做的:

  1. 我有圆柱的起点和终点应该在哪里的世界坐标,A_world并且B_world.

  2. 我将它们投影到视口坐标A_vpB_vp使用gluProject

    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 处画一个圆,唯一肯定是错误的就是 in 中的“向上”向量gluLookAt,对吗?

4

1 回答 1

0

gluLookAt()没有必要获得正确的视角。旋转当前 z 向量以指向圆柱体应指向的方向就足够了。

于 2015-08-16T13:25:59.230 回答