Вычислить положение вершины из заданного положения, поворота и масштаба? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть класс с именем Cube, в котором я отображаю основной куб на экране.У меня это работает, так как рендеринг базового куба любого масштаба в начале координат 0, 0, 0.Однако, если я хочу переместить куб, масштабировать любую из его осей или повернуть куб;Я понятия не имею, с чего начать, поскольку мне нужно добиться этого в Vertex объекте.

struct Vertex {
    Vector3 Position;
    Vector3 Normal;
    Vector2 TextureUV;
    Color Color;
}

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

new Vertex(new Vector3(-1000000, -1000000, -1000000), new Vector3(-1, -1, -1), Color.White);

Cube имеет четыре свойства:

  • Положение (Vector3).
  • Шкала (Vector3).
  • Вращение (Vector3).
  • Цвет (SharpDX.Color).

Мой вопрос такой, какой я естьуказав Vertex местоположений, как я могу вычислить новую позицию при применении поворота и положения?

Я попытался выполнить базовое вычитание и сложение, которое просто масштабирует куб по-разному, а начало координат остается на 0, 0, 0 (пожалуйста, некратко)

new Vertex(new Vector3(P.X - S.X, P.Y - S.Y, P.Z - S.Z), new Vector3(1, 1, 1), Color.White);

Вышеприведенный код не является точным, поскольку в настоящее время он используется на другом компьютере.

Если вам нужны дополнительные сведения, пожалуйста, дайте мне знать, и яуточню.


Вопрос

Как установить положение вертальды, основанные на предоставленных векторах положения, масштаба и поворота?


Контрольный пример

Следующие контрольные примеры предназначены только для позиции и показывают, как я буду проверять ответы, данные.

// Renders at origin.
Cube myCube = new Cube(new Vector3(0, 0, 0), new Vector3(100, 100, 100), Color.White);
// Renders to the left.
Cube myCubeLeft = new Cube(new Vector3(-250, 0, 0), new Vector3(100, 100, 100), Color.White);
// Renders to the right.
Cube myCubeRight = new Cube(new Vector3(250, 0, 0), new Vector3(100, 100, 100), Color.White);
// Renders above.
Cube myCubeUp = new Cube(new Vector3(0, -250, 0), new Vector3(100, 100, 100), Color.White);
// Renders below.
Cube myCubeDown = new Cube(new Vector3(0, 250, 0), new Vector3(100, 100, 100), Color.White);

Я добавлю тестовые примеры поворота и масштабирования позже, если потребуется.

...