好吧,我在这里有点难过。我正在开发一款 2D 游戏,该游戏的行星围绕其他天体运行,并沿着它们的轴旋转。我决定使用矩阵,因为我讨厌我不得不做的东西是多么笨重。现在的问题是我希望能够专注于表面的某个部分并能够跟踪它。这是到目前为止的代码:
行星更新矩阵():
/// <summary>
/// Updates the transformation matrix
/// </summary>
private void UpdateMatrix()
{
rotation = Matrix.CreateRotationY((float)(state.PlanetAngle * (Math.PI / 180D)));
if (settings.OrbitPlanet == null)
{
transform =
Matrix.CreateTranslation(
new Vector3(
(float)extraMath.lengthdir_x(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance),
(float)0,
(float)extraMath.lengthdir_y(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance)
));
}
else
{
transform =
Matrix.CreateTranslation(
new Vector3(
(float)extraMath.lengthdir_x(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance),
(float)0,
(float)extraMath.lengthdir_y(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance)
))
* settings.OrbitPlanet.Transform;
}
}
和Planet.Draw:
/// <summary>
/// Draws this planet
/// </summary>
/// <param name="device">The graphics device to draw with</param>
/// <param name="view">The ViewParameters to use</param>
public void Draw(GraphicsDevice device, ViewParamaters view)
{
effect.View = view.View;
effect.Projection = view.Projection;
effect.World = view.World * TotalTransform; //TotalTransform is rotation * translation
draw stuff...
但我需要的是 Game.Update 中的这个:
//Handle surface tracking
if (TrackSurface)
{
view.World = ???;
}
我希望能够设置一个世界变换,让它画得很好,居中,旋转等等。
Pics: 任何人都可以帮我解决这个问题吗?甚至可能吗?
更新:我现在让行星跟踪为一个特定的行星工作,但系统中的其他行星并没有相应地改变。
例如,假设我从太阳跟踪下一个行星,视图跟踪表面,但太阳保持静止(技术上应该围绕行星旋转以模拟行星仍然沿着它自己的轴和轨道恒星转动)
同样,如果我尝试应用旋转,例如以特定角度跟踪行星的表面,所有其他行星都会沿着它们自己的轴而不是围绕我正在跟踪的行星旋转。
新代码:
view.World = Matrix.Invert(TargetPlanet.TotalTransform *
Matrix.CreateRotationY(MathHelper.ToRadians((float)SurfaceOffset)));