正常使用 gluDisk?
Get normal of a gluDisk?
我正在用 OpenGL 编写太阳系模拟器。因此,太阳系的组成部分之一是地球轨道(围绕太阳的简单圆圈,由 gluDisk 函数创建)。
我想知道如何检索此圆盘的法向量,因为我需要将它用作相机的旋转向量(需要跟随地球绕太阳自转)。
这是创建轨道的代码(Java),效果很好。
使用此代码,我如何检索此磁盘的法线? (因为磁盘包含在某个平面中,该平面由一些法线定义)。
gl.glPushMatrix();
// if tilt is 0, align the orbit with the xz plane
gl.glRotated(90d - orbitTilt, 1, 0, 0);
gl.glTranslated(0, 0, 0); // orbit is around the origin
gl.glColor3d(0.5, 0.5, 0.5); // gray
// draw orbit
glu.gluQuadricDrawStyle(quad, GLU.GLU_SILHOUETTE);
glu.gluDisk(quad, 0, position.length(), slices, 1);
gl.glPopMatrix();
变换前,圆盘处于xy平面。这意味着法线指向 z 方向,(0, 0, 1)
。事实上,gluDisk()
会在渲染期间发出这些法线,并且您指定的变换将应用于它们,因此对于渲染您无需执行任何操作。
要自己计算变换后的法线,只需应用旋转即可。平移不用于变换法线。
因此我们需要对向量 (0, 0, 1)
绕 x 轴旋转 90 - t
。应用相应的旋转矩阵给出:
[ 1 0 0 ] [ 0 ] [ 0 ]
[ 0 cos(90-t) -sin(90-t) ] * [ 0 ] = [ -sin(90-t) ]
[ 0 sin(90-t) cos(90-t) ] [ 1 ] [ cos(90-t) ]
应用几个三角恒等式:
cos(90 - t) = sin(t)
sin(90 - t) = cos(t)
给出:
[ 0 ] [ 0 ]
[ -sin(90-t) ] = [ -cos(t) ]
[ cos(90-t) ] [ sin(t) ]
当您在代码中应用 sin()
和 cos()
函数时,请记住角度是以弧度指定的。因此,如果您的 orbitTilt
角度当前以度为单位,则法线将为:
xNormal = 0.0;
yNormal = -cos(orbitTilt * (M_PI / 180.0));
zNormal = sin(orbitTilt * (M_PI / 180.0));
我正在用 OpenGL 编写太阳系模拟器。因此,太阳系的组成部分之一是地球轨道(围绕太阳的简单圆圈,由 gluDisk 函数创建)。
我想知道如何检索此圆盘的法向量,因为我需要将它用作相机的旋转向量(需要跟随地球绕太阳自转)。
这是创建轨道的代码(Java),效果很好。 使用此代码,我如何检索此磁盘的法线? (因为磁盘包含在某个平面中,该平面由一些法线定义)。
gl.glPushMatrix();
// if tilt is 0, align the orbit with the xz plane
gl.glRotated(90d - orbitTilt, 1, 0, 0);
gl.glTranslated(0, 0, 0); // orbit is around the origin
gl.glColor3d(0.5, 0.5, 0.5); // gray
// draw orbit
glu.gluQuadricDrawStyle(quad, GLU.GLU_SILHOUETTE);
glu.gluDisk(quad, 0, position.length(), slices, 1);
gl.glPopMatrix();
变换前,圆盘处于xy平面。这意味着法线指向 z 方向,(0, 0, 1)
。事实上,gluDisk()
会在渲染期间发出这些法线,并且您指定的变换将应用于它们,因此对于渲染您无需执行任何操作。
要自己计算变换后的法线,只需应用旋转即可。平移不用于变换法线。
因此我们需要对向量 (0, 0, 1)
绕 x 轴旋转 90 - t
。应用相应的旋转矩阵给出:
[ 1 0 0 ] [ 0 ] [ 0 ]
[ 0 cos(90-t) -sin(90-t) ] * [ 0 ] = [ -sin(90-t) ]
[ 0 sin(90-t) cos(90-t) ] [ 1 ] [ cos(90-t) ]
应用几个三角恒等式:
cos(90 - t) = sin(t)
sin(90 - t) = cos(t)
给出:
[ 0 ] [ 0 ]
[ -sin(90-t) ] = [ -cos(t) ]
[ cos(90-t) ] [ sin(t) ]
当您在代码中应用 sin()
和 cos()
函数时,请记住角度是以弧度指定的。因此,如果您的 orbitTilt
角度当前以度为单位,则法线将为:
xNormal = 0.0;
yNormal = -cos(orbitTilt * (M_PI / 180.0));
zNormal = sin(orbitTilt * (M_PI / 180.0));