По каким формулам вычислить новые координаты объекта в трёхмерном пространстве при относительном перемещении? С прошлого года мучаюсь вопросом, ибо своего воображения не хватает.
Дано:
Координаты 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 += // ???
}

21 Авг 2019 в 06:13
178 +1
0
Ответы
1

Для вычисления новых координат объекта в трехмерном пространстве при относительном перемещении нужно преобразовать смещения в локальных координатах в смещения в абсолютных координатах с учетом углов поворота объекта.

Вам понадобиться использовать тригонометрические функции, такие как синус и косинус, чтобы преобразовать смещения по осям Ox, Oy, Oz в новые смещения dx, dy, dz в абсолютных координатах.

Простое решение может выглядеть примерно следующим образом:

void moveRelativeBy(float deltaX, float deltaY, float deltaZ, float rotationX, float rotationY, float rotationZ)
{
// Преобразование углов поворота в радианы
float radX = rotationX * M_PI / 180.0;
float radY = rotationY * M_PI / 180.0;
float radZ = rotationZ * M_PI / 180.0;
// Вычисление смещений в абсолютных координатах
float dx = cos(radY) * (cos(radZ) * deltaX - sin(radZ) * deltaY) - sin(radY) * deltaZ;
float dy = sin(radX) * (cos(radY) * deltaY + sin(radY) * (sin(radZ) * deltaX + cos(radZ) * deltaY)) + cos(radX) * (cos(radZ) * deltaX - sin(radZ) * deltaY);
float dz = cos(radX) * (cos(radY) * deltaY + sin(radY) * (sin(radZ) * deltaX + cos(radZ) * deltaY)) - sin(radX) * (cos(radZ) * deltaX - sin(radZ) * deltaY);
this->position.x += dx;
this->position.y += dy;
this->position.z += dz;
}

Здесь deltaX, deltaY, deltaZ - это смещения в локальных координатах, а rotationX, rotationY, rotationZ - углы поворота объекта относительно осей Ox, Oy, Oz в градусах. Функция принимает эти параметры и вычисляет новые координаты объекта после относительного перемещения.

Пожалуйста, проверьте этот код и адаптируйте его под ваши нужды. Помните, что вам может понадобится дополнительное тестирование и настройка, в зависимости от специфики вашего приложения.

20 Апр 2024 в 13:22
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир