C # XNA Matrices - вычисление вращения луны вокруг оси с помощью матриц - PullRequest
1 голос
/ 31 мая 2011

Я строю 3D-симуляцию.

Я использую один класс для отображения Солнца, планет и Луны с разным размером, текстурой, скоростью и орбитой.Вот мой код, который выполняет магическую работу по вычислению вращения + оборота

world = Matrix.CreateScale(size,size,size) * Matrix.CreateTranslation(0,0,0) * 
 Matrix.CreateRotationY(rotation) * 
 Matrix.CreateTranslation(position) * 
 Matrix.CreateRotationY(revolution); 
  • размер - это моя переменная для индивидуального масштабирования объекта
  • вращения - моя переменная для поворота объекта вокруг своей оси
  • position - моя переменная для позиционирования планеты на орбите, новый Vector3 (240,0,0)
  • революция - моя переменная, чтобы вращать планету вокруг источника

Теперь я хочу показать спутники вокруг Земли и вокруг других планет, но я просто не могу понять, каксделать это.С точки зрения умножения матриц.

Сложность в том, что вращение Луны происходит вокруг планеты, которая не имеет происхождения и постоянно меняется.

Как это сделать?

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

В вашем методе 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.orbitDistance, orbitRotation, orbitScale и orbitSpin как float.

0 голосов
/ 31 мая 2011

Я понял это ...

Перевести Происхождение в текущее местоположение Родительской планеты

и продолжайте делать это в методе обновления

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() );

Что я здесь делаю, так это то, что я вращаю Луну вокруг источника (Солнца), но я перевожу ее источник в текущее местоположение любой планеты ... это сработало для меня.

...