xna заставить объект двигаться вокруг своей оси (не вокруг точки 0,0,0) - PullRequest
2 голосов
/ 18 апреля 2011

Как я могу заставить объект вращаться вокруг своей оси? т.е. иметь Луну, вращающуюся ОБА вокруг точки 0, 0, 0 и ее собственную ось? До сих пор мне удавалось лишь набрать 0, 0, 0 баллов, используя компонент игрового времени и создавая матрицу вращения.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Переместите центр объекта в (0,0,0), выполните вращение и транспонируйте обратно.

1 голос
/ 19 апреля 2011

Допустим, у нас есть следующее:

class 2DMoon
{
    Texture2D texture;
    Vector2 axis;
    Vector2 origin;
}

Исходной точкой может быть (0,0), но, скажем, что-то более сложное - что-то вроде (29,43). Теперь допустим, что ширина текстуры равна 50, а высота - 90.

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

axis.X = (.5 * texture.Width); axis.Y = (.5 * texture.Height);

Как вы знаете, это сделало бы ось вектором (25,45).

Как указано выше в BlueRaja, вы можете создать метод, который выглядит следующим образом:

Rotate()
{
    origin.X -= axis.X;
    origin.Y -= axis.Y;
    // rotation goes here
    origin.X += axis.X;
    origin.Y += axis.y;
}

Это должно работать для любой стандартной текстуры. (И, конечно, вам НЕ ДОЛЖНО иметь созданный мной Vector2 под названием «ось» - это просто для справки.

Теперь возьмите ту же логику и примените ее к 3D.

Совет: если вы пытаетесь работать с логикой в ​​3D, сначала посмотрите на логику в 2D. 9 раз из 10 вы найдете ответ, который ищете!

(Если я допустил какую-либо ошибку во время транспонирования в моем методе Rotate (), пожалуйста, дайте мне знать - я немного устал, и я не проверяю это, но вращение должно работать вот так, нет?)

...