我正在尝试用gluCylinder
. 但是,要指定我使用的方向gluLookAt
,就像我之前的许多人一样,我不确定“向上”向量,因此无法让圆柱体指向正确的方向。
我从另一个 SO 答案中读到
gluLookAt 中“向上”向量背后的直觉很简单:看任何东西。现在将头倾斜 90 度。你所在的地方没有改变,你注视的方向没有改变,但你视网膜中的图像却清晰地改变了。有什么不同?头顶指向的地方。那是向上向量。
这是一个简单的解释,但就我的圆柱体而言,我觉得向上向量完全不重要。由于圆柱体可以围绕其轴旋转并且看起来仍然相同,因此不同的向上向量不会改变任何东西。所以我的问题应该有无限多个有效的向上向量:从起点到终点的所有正交向量。
所以这就是我所做的:
我有圆柱的起点和终点应该在哪里的世界坐标,
A_world
并且B_world
.我将它们投影到视口坐标
A_vp
并B_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]);
我调用
glOrtho
将相机重置为其默认位置:负z进入图片,x向右,y向上:glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, vp_edgelen, vp_edgelen, 0, 25, -25); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
我转换为坐标
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]);
我用以下方法绘制圆柱体
gluCylinder
:GLUquadricObj *gluCylObj = gluNewQuadric(); gluQuadricNormals(gluCylObj, GLU_SMOOTH); gluQuadricOrientation(gluCylObj, GLU_OUTSIDE); gluCylinder(gluCylObj, 10, 10, 50, 10, 10);
这是意想不到的结果:
由于圆柱体从正确的位置开始,并且由于我能够在位置 B_vp 处画一个圆,唯一肯定是错误的就是 in 中的“向上”向量gluLookAt
,对吗?