|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
Как поворачивать направление движения? (Java)13.01.2016, 16:13. Показов 4923. Ответов 28
Метки нет (Все метки)
У меня есть движение по осям (X, Y, Z) за 1 такт, мне надо сделать так, что-бы вектор направления повернулся на 90° по оси Х (вправо). Как это сделать?
Добавлено через 2 часа 25 минут К примеру направление "1 0 0" (1 еденица/такт по оси Х), я хочу повернуть на 90° и должно выйти "0 1 0" (1 еденица/такт по оси Y) (Вектор направления повернулся направо (90°))
0
|
|
| 13.01.2016, 16:13 | |
|
Ответы с готовыми решениями:
28
направление движения Через случайное количество тактов движения изменять направление движения
|
| 14.01.2016, 08:48 | |
|
Школьные формулы поворота на плоскости (a - угол поворота в радианах)
x_new = x * cos(a) - y * sin(a) y_new = y * cos(a) + x * sin(a) В 3D - все то же самое, просто x, y (и x_new, y_new) - вектора. Если неясно откуда их взять - расскажу
0
|
|
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
| 14.01.2016, 22:53 [ТС] | |
|
X Y понятно, а Z?
0
|
|
| 15.01.2016, 09:03 | ||
|
X = вектор (x, y, z) текущей скорости wY = (0, 1, 0) направление выравнивания Тогда Y = cross(cross(X, wY).normalized(), X); Где cross - векторное произведение. И подставляете вектора X, Y в формулы поворота
0
|
||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
| 15.01.2016, 09:58 [ТС] | |
|
Мне нужна универсальная формула для поворота в трёхмерном пространстве.
Я знаю что найти точку на круге будет так: X = Math.cos(a) Z = Math.sin(a) Для сферы будет так? (Из параметрического уравнения сферы предположение сделал): X = Math.sin(a) * Math.cos(b) Y = Math.sin(a) * Math.sin(b) Z = Math.cos(a) Может как-то определять градусы, а потом их изменять? Просто вы мне пытаетесь намекнуть, но я математику на уровне 10 класса знаю...
0
|
|
| 15.01.2016, 10:51 | ||||
|
x_new = x * cos(a) - y * sin(a) x и у здесь вектора (3 числа), как умножаются и вычитаются вектора Вы знаете. Как найти вектор Y - тоже рассказал. Что неясно - спрашивайте, попробую ответить
0
|
||||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
| 15.01.2016, 12:08 [ТС] | |
|
Так дело в том, что я не понимаю.
x_new = x * cos(a) - y * sin(a) y_new = y * cos(a) + x * sin(a) А Z тогда что? Это поворот в плоскости, если я захочу повернуть на 45° в плоскости XY и на 45° в плоскости XZ? Так что-ли? x_new = x * cos(a) - y * sin(a) y_new = y * cos(a) + x * sin(a) x_super_new = x_new * cos(b) - y * sin(b) z_new = z * cos(b) + x_new * sin(b) ?
0
|
|
| 15.01.2016, 13:21 | ||
Уже 3 раза сказал - в пр-ве (3D) это ВЕКТОРА. Т.е.newV.x = vecX.x * cos(a) - vecY.x * sin(a) newV.y = vecX.y * cos(a) - vecY.y * sin(a) newV.z = vecX.z * cos(a) - vecY.z * sin(a)
0
|
||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
| 16.01.2016, 12:20 [ТС] | |
|
А, ясно
![]() Надо было написать тогда vec1 и vec2, а то X и Y для меня неопределённо было.
0
|
|
| 16.01.2016, 12:25 | ||
|
vecX = вектор (x, y, z) текущей скорости wY = (0, 1, 0) направление выравнивания (ось вращения) Тогда vecY = cross(wY, vecX).normalized(); Др словами ось вращения - мировая Y (вверх)
1
|
||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
| 16.01.2016, 13:00 [ТС] | |
|
Так ничего и не понял...
Так будет в итоге что-ли? vecY = cross(wY, vecX).normalized(); newV.x = vecX.x * cos(a) - vecY.x * sin(a) newV.z = vecX.z * cos(a) - vecY.z * sin(a) Что-то не сходится, а если я потом захочу повернуть по оси X или Z? Добавлено через 1 минуту А, тогда просто изменять wY? Добавлено через 20 секунд Щас попробуем...
0
|
|
| 16.01.2016, 14:09 | |||
|
Добавлено через 8 минут Да, и надо учесть длину vecY = cross(wY, vecX).normalized() * vecX.length(); Строго говоря, это вращение вокруг локальной оси Y, которая выбирается так чтобы быть как можно ближе к мировой
1
|
|||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
||||||
| 20.01.2016, 13:35 [ТС] | ||||||
0
|
||||||
| 20.01.2016, 13:50 | ||
, длины aVec и bVec должны быть одинаковы, после нормализации еще домножьте bVec на длину aVec. И "опять двадцать пять"Поворот вокруг локальной оси меняет все 3 компоненты (x, y, z) Это гарантирует что повернутый вектор (cVec) будет иметь с исходным (aVec) заданный угол поворота (у Вас 90). Это легко проверить, dot(aVec, cVec) должен быть = 0
0
|
||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
||||||
| 20.01.2016, 15:07 [ТС] | ||||||
|
Вот что наделал, но всё равно не работает
![]()
0
|
||||||
| 21.01.2016, 06:28 | |||||||||||
Если нужен поворот только на 90, то можно так
0
|
|||||||||||
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
|
| 21.01.2016, 11:59 [ТС] | |
|
Нет, не только на 90°. А вращаю я и так в радианах, Math.toRadians(90);
Попробую определять угол вектора и затем плюсововать угол. Добавлено через 39 минут Да нет, работает нормально, я наговариваю на вас. Проблема в том, что вращает по мировым, а не локальным осям. К примеру летит энтити по оси Х, что-бы повернуть направление на 90° надо повернуть по оси Y, но если она будет лететь по оси Y, то Z и X будет всегда нулю, и вращение не произойдёт. Добавлено через 1 минуту Надо как-то определить оси вращения, я бы мог предположить что надо изменять rotationVec у меня, но вы сказали что нельзя вращать, если в нём будет задано больше, чем 1 координата. Добавлено через 1 минуту 1 ось вращения будет сам вектор движения, а остальные 2 надо определить, помогите пожалуйста.
0
|
|
| 21.01.2016, 17:27 | |||||||||
0
|
|||||||||
| 21.01.2016, 17:27 | |
|
Помогаю со студенческими работами здесь
20
Как изменить направление движения объекта в лабиринте Найти уравнение траектории точки. Нарисовать траекторию движения точки и показать направление её движения
Изменить направление движения.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|