XNA中的转换矩阵

时间:2013-07-21 19:53:49

标签: c# xna transform matrix-multiplication

好吧,我有点难过。我正在制作一个2D游戏,它有行星绕其他物体运行,并沿着它们的轴旋转。我决定使用Matrices,因为我讨厌我不得不做出笨拙的事情。现在的问题是我希望能够专注于表面的某个部分并能够跟踪它。这是迄今为止的代码:

Planet.UpdateMatrix():

/// <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 = ???;
}

我希望能够设置一个世界变换,让它画出所有漂亮,居中和旋转等等。

照片管理: Planet Solar System 任何人都可以帮我一把吗?它甚至可能吗?

更新:我现在让行星跟踪为特定行星工作,但系统中的其他行星不会相应地改变。

例如,假设我从太阳跟踪下一个行星,视图跟踪表面,但是太阳保持静止(应该在技术上绕行星旋转以模拟行星仍然沿着它自己的轴和轨道恒星转动)

同样,如果我尝试应用旋转,例如以特定角度跟踪行星表面,所有其他行星都会沿着自己的轴旋转,而不是围绕我正在追踪的行星。

新守则:

view.World = Matrix.Invert(TargetPlanet.TotalTransform *
    Matrix.CreateRotationY(MathHelper.ToRadians((float)SurfaceOffset)));

0 个答案:

没有答案