我正在使用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 ();
}
因此很奇怪。这里没有任何东西应该导致法线问题,并且倾斜似乎在正确的位置。
答案 0 :(得分:1)
看起来你首先围绕太阳倾斜行星然后旋转它。这使得光线的方向与你预期的不同。
我不确定planet.Draw()
是做什么的,但这就是您的代码应该在概念上做的事情。
以身份矩阵开头 (如果不是以单位矩阵开头,则围绕场景中心而不是行星轴旋转)
围绕其倾斜轴旋转行星。
将行星相对于太阳的当前位置添加到变换中,以便太阳现在位于场景的原点。 (GL.translate)
围绕太阳旋转行星。