XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
uNmAnNeR

offline
Опыт: 40
Активность:
Поворот вектора относительно вектора
Задача сводится к следующей:


Quat - Вектор оси, вокруг которой следует осуществить поворот.
Vec - Поворачиваемый вектор.
X,Y,Z - координаты их общей точки.

Реализация 1 (по формуле a′ = P · a = cosθa + sinθm × a ):


Код:
set d = SquareRoot(QuatX*QuatX + QuatY*QuatY + QuatZ*QuatZ)
        set QuatX = QuatX/d*Sin(.1)
        set QuatY = QuatY/d*Sin(.1)
        set QuatZ = QuatZ/d*Sin(.1)
        set VecX = VecX*Cos(.1) + QuatY*VecZ
        set VecY = VecY*Cos(.1) - QuatX*VecZ
        set VecZ = VecZ*Cos(.1) + QuatX*VecY - QuatY*VecX
        call SetUnitX(Point, VecX + X)
        call SetUnitY(Point, VecY + Y)
        call SetUnitFlyHeight(Point, VecZ + Z,0)


Реализация 2 (через кватернион):


Код:
set d=SquareRoot(QuatX*QuatX+QuatY*QuatY+QuatZ*QuatZ)
        set QuatX=QuatX/d*Sin(0.1)
        set QuatY=QuatY/d*Sin(0.1)
        set QuatZ=QuatZ/d*Sin(0.1)
        set QuatW = Cos(0.1)
        set VecW = 0

        set A=(QuatW+QuatX)*(VecW+VecX)
        set B=(QuatZ-QuatY)*(VecY-VecZ)
        set C=(QuatX-QuatW)*(VecY+VecZ)
        set D=(QuatY+QuatZ)*(VecX-VecW)
        set E=(QuatX+QuatZ)*(VecX+VecY)
        set F=(QuatX-QuatZ)*(VecX-VecY)
        set G=(QuatW+QuatY)*(VecW-VecZ)
        set H=(QuatW-QuatY)*(VecW+VecZ)

//        set VecW= B + (-E - F + G + H) * 0.5
        set VecX= A - ( E + F + G + H) * 0.5
        set VecY=-C + ( E - F + G - H) * 0.5
        set VecZ=-D + ( E - F - G + H) * 0.5
        call SetUnitX(Point, VecX + X)
        call SetUnitY(Point, VecY + Y)
        call SetUnitFlyHeight(Point,VecZ + Z,0)


Все это дело происходит в таймере с малым периодом.
Результат обоих случаев одинаковый: точка постепенно смещается к центру, т.е начинает вращаться по окружности с центром в X,Y,Z (длина вектора Vec вроде не изменяется, хотя не точно, на глаз смотрел). Проще говоря, угол между осью и вектором постепенно увеличивается до 90°. Прошу указать на ошибку, ибо сам в этом только начал разбираться, не оч шарю ):

П.С. Вращение в сферических координатах и матрицы - не вариант.
Миниатюры
Кликните на картинку для увеличения
Название:  image004.jpg
Просмотров: 266
Размер:  6.3 Кбайт  
Старый 03.06.2009, 11:35
J
expert
offline
Опыт: 48,447
Активность:
попробуй при каждом вращении наращивать угол и создавать кватернион заново, и уножать на вектор, который будет константный
Старый 03.06.2009, 16:11
uNmAnNeR

offline
Опыт: 40
Активность:
Все тоже :( , еще забыл сказать, что QuatZ = 0.
Старый 05.06.2009, 10:18
uNmAnNeR

offline
Опыт: 40
Активность:
С проблемой разобрался. Приведенные выше алгоритмы работают только для ортогональных векторов.
Старый 06.06.2009, 11:21
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 03:57.