正常使用 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));