Xatory
@Xatory
программист в основном веб

По каким формулам вычислить новые координаты объекта в трёхмерном пространстве при относительном перемещении?

С прошлого года мучаюсь вопросом, ибо своего воображения не хватает.
Дано:
Координаты x, y, z объекта в пространстве - абсолютные;
Углы поворота объекта по всем трём осям в градусах - повороты относительно абсолютного вектора, так сказать.
Задача:
Вычислить смещения по всем осям в абсолютных координатах для смещения в локальных для объекта дельтах: dX, dY, dZ.

Как я понимаю решить сие можно с помощью элементарных познаний в тригонометрии, школьными синусами и косинусами. Но это было давно, воображение у меня не держит три оси одновременно и т.д.
Чувствую матрицы бы решили все проблемы, да и так удобнее хранить данные о координатах и векторе... Но важно решить задачу на таком уровне абстракции: вещественные координаты и углы поворота в градусах.

Нужен метод объекта:
объект->передвинься(на 2 вправо, на 1.5 вверх, на 15 назад)

Может быть что-то из библиотеки Qt уже умеет решать такие задачи? (QTransform увы только для 2D и матриц QMatrix3x3).

public void moveRelativeBy(float deltaX, float deltaY, float deltaZ)
{
this->position.x += // ???
this->position.y += // ???
this->position.z += // ???
}
  • Вопрос задан
  • 16485 просмотров
Пригласить эксперта
Ответы на вопрос 3
@suslik2015
Перенос точки с координатами (x,y,z) на вектор (dx,dy,dz) делается простым сложением всех координат. То есть результат - это (x+dx,y+dy,z+dz).
Но важно решить задачу на таком уровне абстракции: вещественные координаты и углы поворота в градусах.

Поворот на угол alpha вокруг оси Z очевиден:
x' = x*cos(alpha)-y*sin(alpha)
y' = x*sin(alpha)+y*cos(alpha)
z' = z
Аналогичные формулы получатся и для других осей поворота (то есть Ox, Oy). Поворот относительно произвольной оси, проходящей через начало координат, можно сделать с помощью этих поворотов - сделать поворот относительно Ox так, чтобы ось поворота стала перпендикулярна Oy, затем поворот относительно Oy так, чтобы ось поворота совпала с Oz, сделать собственно поворот, а затем обратные повороты относительно Oy и Ox. Можно даже вывести формулы для такого поворота и убедиться в том, что они очень громоздкие. Поэтому и используются матрицы. Кроме того, матрицы дают существенную оптимитизацию.
А вообще лучше сразу юзать кватернионы. У углов Эйлера есть серьезный недостаток - так называемый шарнирный замок.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
транспонирование матриц читайте...
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Сначала вам надо чётко определить, что такое "Углы поворота объекта по всем трём осям". Поскольку повороты не коммутируют, то задание поворота несколькими углами - это всегда последовательность поворотов относительно некоторых осей на определённый угол (или поворот вокруг одного вектора - но это уже кватернионное представление). Например, углы Эйлера - последовательность поворотов относительно OZ, OX и снова OZ.
Если у вас объект получается из базового объекта последовательностью поворотов (OX,a), (OY,b), (OZ,c) (a,b,c - углы в радианах), и есть вектор (dx,dy,dz) в локальной системе координат повёрнутого объекта, то получить сдвиг объекта на этот вектор в глобальной системе координат можно так:
dy1=cos(a)*dy+sin(a)*dz; dz1=-sin(a)*dy+cos(a)*dz; // поворот относительно OX
dx1=cos(b)*dx-sin(b)*dz1; dz2=sin(b)*dx+cos(b)*dz1; // поворот относительно OY
dx2=cos(c)*dx1+sin(c)*dy1; dy2=-sin(c)*dx1+cos(c)*dy1; // поворот относительно OZ
Тогда (dx2,dy2,dz2) - искомый вектор сдвига.
Если углы заданы в градусах, они переводятся в радианы умножением на pi/180.
Общее правило: преобразование координат, которое использовалось для перемещения объекта из его базового состояния в текущее - это то же преобразование, которое используется для перевода координат из текущей локальной системы координат объекта в глобальную.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы