xna заставляет объект перемещаться вокруг СВОЕЙ оси (не вокруг точки 0,0,0)

#c# #visual-studio #xna

#c# #visual-studio #xna

Вопрос:

Как я могу заставить объект вращаться вокруг своей оси? т. Е. заставить луну вращаться как вокруг точки 0, 0, 0, так и вокруг своей собственной оси? До сих пор я смог выполнить только точку 0, 0, 0, используя компонент gametime и создавая матрицу вращения.

Ответ №1:

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

Ответ №2:

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

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

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

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

ось.X = (.5 * текстура.Ширина); ось.Y = (.5 * текстура.Высота);

Как вы знаете, для этого потребовалось бы придать оси вектор, равный (25,45).

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

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

Это должно работать для любого вида стандартной текстуры. (И, конечно, вам не обязательно иметь Вектор2, который я придумал, под названием «ось» — это просто для удобства использования.

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

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

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