forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Вращение осей координат (http://forum.boolean.name/showthread.php?t=18176)

DarkMedveD 10.05.2013 14:44

Вращение осей координат
 
Друзья, нужна небольшая помощь по поводу вращения объекта.

Код:

    D3DXMATRIX T;
    D3DXMATRIX R;
 
    D3DXMatrixRotationY(&R,-80.0f);
    D3DXMatrixTranslation(&T,0.0f,0.0f,45.0f);
 
    result=R*T;

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


Уверен, что все это элементарно решается.
Заранее спасибо за помощь.

Mr_F_ 10.05.2013 14:51

Ответ: Вращение осей координат
 
д3дх математикой не пользуюсь, но по сути ты можешь умножить вектор "вперед" (0,0,1) на ротационную матрицу и получить локальный "вперёд" для объекта (или ты можешь вытащить этот локальный сразу из матрицы если тебе так проще; или ты можешь умножить глобал вектор на кватернион объекта). Локальный прибавляешь к позиции и едешь куда надо.
Эйлеры не юзай для такой задачи.

jimon 10.05.2013 14:51

Ответ: Вращение осей координат
 
T2 - матрица которая двигает его "в последствии"

result = T2 * (R * T)

DarkMedveD 10.05.2013 15:01

Ответ: Вращение осей координат
 
А что если T*(R*T)?

Просто не знаю, какие координаты в какую из матриц перемещения вкладывать?

DarkMedveD 10.05.2013 16:33

Ответ: Вращение осей координат
 
Спасибо, парни, работает.
Делал через матрицу пост-перемещения.

DarkMedveD 26.05.2013 18:56

Ответ: Вращение осей координат
 
Может кто-нибудь знает, как сделать тоже самое в PhysX?
Там же мировой матрицы нет...

HolyDel 27.05.2013 12:50

Ответ: Вращение осей координат
 
получить можно. задать нет.

вообще это физикс должен считать трансформации объекта.
получаешь трансформацию от физикса и передаешь ее гапи. рисуешь меш.

или что то-же самое? задать родителя?

DarkMedveD 27.05.2013 16:50

Ответ: Вращение осей координат
 
Не-не, родитель не при делах.


Наверно я изначально использовал неправильную концепцию.
Я все изменения объекта делал в PhysX, потом получал матрицу из этого всего и рендерил уже на ее основе меш.
Код:

        if (Actor)
        {
                Actor->getGlobalPose().getColumnMajor44( position );
        }

        result=scale*angle*position;

Грубо говоря - делал так.
Но если я даже буду поворачивать матрицу поворота, то PhysX все равно этого не заметит. То есть мне нужно как-то именно его оси вращать.

Или я не так все делаю?

HolyDel 29.05.2013 00:28

Ответ: Вращение осей координат
 
очень странно видеть ригидбоди в качестве потомка.
обычно это независимый объект.

опиши ситуацию зачем это нужно.
может помогут джойнты?

DarkMedveD 29.05.2013 04:57

Ответ: Вращение осей координат
 
Создаю игрока. Это объект, физический, который управляется пользователем по средствам WASD. Ускориться, притормозить, поворот налево\направо. Так же за объектом летает камера.
Поскольку объект физическое тело, то все его преобразования просчитывал через PhysX. То есть я просто придавал ему ускорение, он перемещался. Я вытаскивал матрицу этого объекта из актера сцены и использовал как мировую. Проблема в том, что изменяя мировую матрицу я не изменяю матрицу объекта в PhysX. То есть все мои преобразования сказывались на графике.

А ригидбоди не потомок. Камера - потомок, а двигаю я именно этот ригидбоди.

Джойны? Даже не знаю, мне кажется это совсем другая история...

HolyDel 29.05.2013 13:10

Ответ: Вращение осей координат
 
Цитата:

Проблема в том, что изменяя мировую матрицу я не изменяю матрицу объекта в PhysX.
т.е. после вытаскивания матрицы из объекта у тебя еще была какая-то причина ее менять? какая?

камера не ригидбоди?

DarkMedveD 29.05.2013 13:21

Ответ: Вращение осей координат
 
Камера вообще не физическая, просто средство создания матрицы вида. Абстрактная такая.

Не так сказал, я ее не менял.
Вот в DirectX можно запросто повернуть оси объекта с помощью матрицы вращения. В PhysX этого нет. Но я нашел какой-то пример, где объект движется туда, куда смотрит камера. Правда мне кажется, что там это реализовано по средствам тригонометрии. То бишь х+а и z+а.
Но точно понять как там реализовано это мне не удалось.
В тоже время помню что в Xors3D запросто поворачивал оси объекта, а не ригидбоди.

HolyDel 29.05.2013 13:40

Ответ: Вращение осей координат
 
я правильно понимаю, что повернуть перса ты хочешь не применяя силы к ригидбоди, а просто повернуть матрицу?
если так - то это непраивльно. все игровые изменения должны производиться над физическим телом.
хочешь передвинуть - прикладываешь силу
хочешь повернуть - прикладываешь силу
хочешь чтобы двигался в направлении камеры - прикладывай две силы, по оси x и z соотвественно.

от физического движка получаешь матрицу и передаешь ее графическому

Mr_F_ 29.05.2013 14:40

Ответ: Вращение осей координат
 
в PhysX есть Character controller, который можно трансформировать как любой графический объект у тебя, при этом у него останется коллизия, но на него не будут действовать силы.

DarkMedveD 29.05.2013 23:04

Ответ: Вращение осей координат
 
Да, как раз про Character controller я и говорил, когда говорил о примере.

Я так и делаю:

Код:

        if (Actor)
        {
                Actor->setLinearVelocity(NxVec3(_x,_y,_z));
        }

Или под применением силы ты подразумеваешь AddForce?
Я просто устанавливал линейную и угловую скорость, благодаря этому персонаж передвигался.

Разве силы иначе воздействуют на объект? Меняют его ориентацию?..

Если не сложно, ткните носом в то место, где в Character controller устанавливается вектор, в который двигается объект?

Между топологией Direct и PhysX, я так понял, есть небольшая разница.
В DirectX я с помощью матрицы вращения могу поменять ориентацию объекта в пространстве, а в PhysX это надо делать через угол к оси У?
То есть если я хочу передвинуть персонажа вперед, то мне нужно передвигать его на Х+а и Z+а, да?
Но как найти угол альфа? Скаляр между осью У и чем? Как получить поворот по оси У для объекта?

Мне почему-то кажется, что все это решается гораздо проще, в обход линейной алгебры и тригонометрии.


Часовой пояс GMT +4, время: 20:23.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot