旋转和照明的OpenGL问题

时间:2012-03-11 22:48:20

标签: c# opengl lighting opentk

我正在使用OpenTK for OpenGL进行简单的太阳系模拟,并使用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 ();
}

因此很奇怪。这里没有任何东西应该导致法线问题,并且倾斜似乎在正确的位置。

1 个答案:

答案 0 :(得分:1)

看起来你首先围绕太阳倾斜行星然后旋转它。这使得光线的方向与你预期的不同。

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

以身份矩阵开头 (如果不是以单位矩阵开头,则围绕场景中心而不是行星轴旋转)

围绕其倾斜轴旋转行星。enter image description here

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

围绕太阳旋转行星。 enter image description here