По каким формулам вычислить новые координаты объекта в трёхмерном пространстве при относительном перемещении? С прошлого года мучаюсь вопросом, ибо своего воображения не хватает.
Дано:
Координаты 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
153 +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 Апр в 13:22
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 93 190 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир