#c# #math #matrix #xna #matrix-multiplication
#c# #математика #матрица #xna #матрица-умножение
Вопрос:
Я создаю 3D-симуляцию.
Я использую один класс для отображения солнца, планет и Луны с разным размером, текстурой, скоростью и орбитой. Вот мой код, который выполняет волшебную работу по вычислению вращения revolution
world = Matrix.CreateScale(size,size,size) * Matrix.CreateTranslation(0,0,0) *
Matrix.CreateRotationY(rotation) *
Matrix.CreateTranslation(position) *
Matrix.CreateRotationY(revolution);
- размер — это моя переменная для индивидуального масштабирования объекта
- вращение — это моя переменная для поворота объекта вокруг его собственной оси
- position — это моя переменная для позиционирования планеты на орбите, новый Вектор3 (240,0,0)
- revolution — это моя переменная для вращения планеты вокруг начала координат
теперь я хочу отобразить луны вокруг Земли и вокруг других планет, но я просто не могу понять, как это сделать. В терминах умножения матриц.
Сложность в том, что вращение Луны происходит вокруг планеты, которая не является исходной и постоянно меняется.
Как это сделать?
Комментарии:
1. Крайне неясно, что делают ваши матрицы, но я предлагаю вам применить вращение Луны вокруг ее планеты, затем вращение планеты вокруг Солнца.
2. это моя техника обращения вокруг источника, мне нужна техника для обращения вокруг другого тела, я не могу в этом разобраться.
3. Не уверен, но попробуйте умножить на матрицу положения планеты вместо начала координат. Что это должно сделать, так это изменить ваши вычисления, чтобы вместо того, чтобы вычислять, где находится Луна в мировом пространстве, вы делали это в пространстве планеты, а затем переводили это в мировое пространство.
Ответ №1:
В вашем 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
‘s.
Комментарии:
1. cid-641cd5a494d0369d.office.live.com/self.aspx/.Documents / … — рабочий пример использования этого кода.
Ответ №2:
я понял это…
Переведите начало координат в текущее местоположение родительской планеты
и продолжайте делать это в методе обновления
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() );
что я здесь делаю, так это то, что я вращаю луну вокруг источника (Солнца), но я перевожу ее происхождение в текущее местоположение любой планеты… у меня это сработало.
Комментарии:
1. Круто, я был (в основном) прав. Просто чтобы вы знали, что здесь происходит, когда вы выполняете свои первые вычисления, вы работаете в мировом пространстве, где (0, 0, 0) является центром мира. Но, когда вы умножаете на матрицу положения планеты, вы переводите положение вашей луны в мировом пространстве в пространство планеты, где положение планеты является исходным (0, 0, 0). Имеет смысл?