HLFX.Ru Forum
Показать все 7 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Вопросы по 3D математике (https://hlfx.ru/forum/showthread.php?threadid=2741)


Отправлено KiQ 06-04-2011 в 18:18:

Smile Вопросы по 3D математике

В общем засел за написание полностью софтверного движка на (J2ME). Сделал отрисовку полигона с заданным цветом, также бэкграунд цветом и картинкой. Но столкнулся с такой трудностью - вращение полигона вокруг произвольной оси работает очень очень криво. Вот формула(вращение по оси Y):

code:
double x = (double)vec.x+(double)(v.x-vec.x)*cos[r]-(double)(v.z-vec.z)*sin[r]; double z = (double)vec.z+(double)(v.x-vec.x)*sin[r]+(double)(v.z-vec.z)*cos[r];

v - это вершина, которую передвигаем(вращаем), vec - вектор, вокруг которого поворачиваем, то есть ось поворота, r - это градус поворота, а cos[],sin[] - это массивы с заранее посчитанными косинусами и синусами углов от 0 до 360. Проблема заключается в том, что вращение начинается, затем доходит до 1/4 оборота, останавливается, потом полигон съезжает вбок до оси вращения, и в таком же положении - полуразвороте едет в противоположную сторону, затем разворачивается и цикл повторяется. В общем что то расчитыватся не так, а что я никак не могу понять, потому что формулы выверял уже 10 раз. Бьюсь над этим уже третий день. Есть ли у вас какие-нибудь мысли на этот счет?

__________________
-Brain is dead-


Отправлено XaeroX 06-04-2011 в 20:28:

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

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

__________________

xaerox on Vivino


Отправлено KiQ 07-04-2011 в 04:47:

XaeroX благодарствую за ответ. Погуглил по поводу твоих соображений, нашел ошибку в своей формуле Насчет матриц честно говорю - я их делал, но большого толку от них не увидел. Может я неправильно их делал? В моем варианте, матрица - это 2д массив double Matrix[2][2]. Чтобы умножить точку или вектор на матрицу, получается:

code:
newx = vec.x + (v.x-vec.x) * Matrix[0][0] + (v.z-vec.z) * Matrix[0][1]; newz = vec.z + (v.x - vec.x) * Matrix[1][0] + (v.z-vec.z) * Matrix[1][1];

В чем преимущество в конкретной ситуации так и не понял. Может еще не дошел до этого уровня

__________________
-Brain is dead-


Отправлено XaeroX 07-04-2011 в 06:15:

KiQ
Так ты 3д-матрицу используй. В гугле есть такие матрицы для поворотов вокруг всех осей, а последовательным умножением можно делать поворот вокруг нескольких осей сразу.

__________________

xaerox on Vivino


Отправлено Дядя Миша 07-04-2011 в 07:20:

Одно могу сказать точно - реализовать без матриц поворот по всем осям одновременно - крайне нетривиальная задача.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 07-04-2011 в 07:55:

Дядя Миша
Ну, есть еще кватернионы

__________________

xaerox on Vivino


Отправлено Дядя Миша 07-04-2011 в 09:25:

Цитата:
XaeroX писал:
Ну, есть еще кватернионы

угу, и углы эйлера. Но матрицами - прощщщще.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 02:00.
Показать все 7 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024