繁体   English   中英

C# XNA 矩阵 - 用矩阵计算月球绕轴旋转

[英]C# XNA Matrices - Calculate moon rotation around axis with matrices

我正在构建一个 3D 模拟。

我正在使用一个 class 来显示不同大小、纹理、速度和轨道的太阳、行星和月亮。 这是我的代码,它完成了计算旋转+旋转的神奇工作

world = Matrix.CreateScale(size,size,size) * Matrix.CreateTranslation(0,0,0) * 
 Matrix.CreateRotationY(rotation) * 
 Matrix.CreateTranslation(position) * 
 Matrix.CreateRotationY(revolution); 
  • size是我单独缩放 object 的变量
  • 旋转是我的变量,用于围绕自己的轴旋转 object
  • position是我在轨道上的行星 position 的变量,新 Vector3(240,0,0)
  • 革命是我的变量,使地球围绕原点旋转

现在我想展示围绕地球和其他行星的卫星,但我不知道该怎么做。 就矩阵乘法而言。

复杂之处在于月球的公转是围绕着一个不属于起源并且一直在变化的行星。

怎么做?

在您的Draw方法中,在您绘制了您想要绕其运行的行星/月球之后:

Matrix satellite = Matrix.Identity
                 * Matrix.CreateScale(orbitScale)
                 * Matrix.CreateRotationY(orbitSpin)
                 * Matrix.CreateTranslation(0f, orbitDistance, 0f)
                 * Matrix.CreateFromAxisAngle(orbitAxis, orbitRotation);
effect.View = satellite * camera.View;

因此,在您的Update方法中,您可以执行以下操作:

orbitRotation += MathHelper.PiOver2 * (float)gameTime.ElapsedGameTime.TotalSeconds;
orbitRotation = MathHelper.WrapAngle(orbitRotation);
orbitSpin += MathHelper.TwoPi * (float)gameTime.ElapsedGameTime.TotalSeconds;
orbitSpin = MathHelper.WrapAngle(orbitSpin);

我已将orbitAxis定义为Vector3 orbitDistanceorbitRotationorbitScaleorbitSpin作为float的。

我想到了...

将原点翻译成母行星的当前位置

并在更新方法中继续这样做

world = Matrix.CreateScale(size,size,size)
        * Matrix.CreateTranslation(0,0,0) 
        * Matrix.CreateRotationY(rotation)
        * Matrix.CreateTranslation(position)
        * Matrix.CreateRotationY(revolution); 

world *= Matrix.CreateTranslation( parent.getPosition() );

我在这里做的是我围绕原点(太阳)旋转月球,但我将它的原点转换为任何行星的当前位置......这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM