1

我正在使用 OpenTK for OpenGL 和 monodevelop 为 C# ide 进行简单的太阳系模拟。进展顺利,我有行星围绕太阳运行,照明正常。当我想倾斜行星的轴时,问题就开始了;无论我在我的方法中放置新的旋转,它都不会明显旋转。一旦它使我的球体的发光面以某种方式围绕它旋转。如果我在使行星绕其轴旋​​转的旋转之前或之后进行旋转,行星顶部会奇怪地亮起,就好像法线被破坏了一样。

public void Display (float time)
{
    GL.Rotate (axialTilt, tiltAxis);  // This rotation causes the issues, no matter
                                      // where I put it
    GL.PushMatrix ();                 // This push/pop was added later, but it 
                                      // doesn't help
    rotationalPosition += rotationSpeed * time;
    GL.Rotate (rotationalPosition, Vector3.UnitZ);

    planet.Draw ();

    GL.PopMatrix ();

    if (ring != null) {
        ring.Draw ();
    }
    if (moons != null) {
        foreach (Orbit o in moons) {
            o.Draw (time);
        }
    }
}

这被称为:

public void Draw (float time)
{
    GL.PushMatrix ();

    GL.Rotate (angle, orientation);            // This will allow an angled axis for
                                               // moons and other planetary orbits.
    orbitPosition += orbitSpeed * time;
    GL.Rotate (orbitPosition, Vector3.UnitZ);

    GL.Translate (orbitDistance, 0, 0);

    GL.Rotate (-orbitPosition, Vector3.UnitZ); // Rotate backward, so rotating around
                                               // the orbit axis doesn't rotate the
                                               // planet.
    orbitingBody.Display (time);

    GL.PopMatrix ();
}

因此,这很奇怪。这里没有什么应该引起法线问题,而且倾斜似乎在正确的位置。

4

1 回答 1

1

看起来你是先让行星围绕太阳倾斜,然后再旋转它。这使光线来自与您预期不同的方向。

我不确定是什么planet.Draw(),但这是你的代码在概念上应该做的。

从单位矩阵开始(如果你不从单位矩阵开始,你是围绕场景的中心旋转,而不是行星的轴)

围绕其倾斜轴旋转行星。在此处输入图像描述

将行星相对于太阳的当前位置添加到变换中,以便太阳现在位于场景的原点。(GL.translate)

围绕太阳旋转行星。 在此处输入图像描述

于 2012-03-12T03:09:16.477 回答