В общем засел за написание полностью софтверного движка на (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 раз. Бьюсь над этим уже третий день. Есть ли у вас какие-нибудь мысли на этот счет?
Попробуй без таблиц синусов и косинусов, а вычислять их напрямую.
Попробуй реализовать через умножение на матрицу.
Попробуй вращать по формуле Родригеса.
И вообще, неплохо бы записать видео или хотя бы нарисовать, а то я не могу представить себе, что именно у тебя там едет и в какую сторону.
XaeroX благодарствую за ответ. Погуглил по поводу твоих соображений, нашел ошибку в своей формуле Насчет матриц честно говорю - я их делал, но большого толку от них не увидел. Может я неправильно их делал? В моем варианте, матрица - это 2д массив double Matrix[2][2]. Чтобы умножить точку или вектор на матрицу, получается:
KiQ
Так ты 3д-матрицу используй. В гугле есть такие матрицы для поворотов вокруг всех осей, а последовательным умножением можно делать поворот вокруг нескольких осей сразу.