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=18211)

DarkMedveD 24.05.2013 17:50

Родитель объекта
 
Снова нубо-проблема, взываю к терпению форумчан.

Есть объект, есть камера.
У каждого из них формируется результирующая матрица, путем умножения масштабирования, поворота и позиции. С этой матрицей объект визуализируется, с этим проблем нет.

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

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

И как можно более простым языком. Заранее спасибо.

Mr_F_ 24.05.2013 18:05

Ответ: Родитель объекта
 
умножаешь локальную матрицу чайлда на глобальную парента ну и получаешь глобальную чайлда.
токо надо в правильной последовательности перемножать.

инвертируешь глобальную матрицу камеры - получаешь её матрицу вида.

DarkMedveD 24.05.2013 20:37

Ответ: Родитель объекта
 
Вот локальные координаты у меня хранятся в переменных, потом я их кладу в матрицу. Потом эту матрицу я использую как матрицу мира и вывожу объект. (Если совсем просто).

Как мне узнать узнать глобальную матрицу объекта?

Можешь более развернуто ответить..?

Я правильно понял - мне нужно для вывода камеры использовать результирующую матрицу объекта?

DarkMedveD 24.05.2013 22:52

Ответ: Родитель объекта
 
И тут же еще один вопрос:

Код:

        D3DPRESENT_PARAMETERS d3dpp;
        d3dpp.BackBufferWidth            = width;
        d3dpp.BackBufferHeight          = height;
        d3dpp.BackBufferFormat          = D3DFMT_A8R8G8B8;
        d3dpp.BackBufferCount            = 1;
        d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality        = 0 ;
        d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow              = hwnd;
        d3dpp.Windowed                  = 0;
        d3dpp.EnableAutoDepthStencil    = true;
        d3dpp.AutoDepthStencilFormat    = D3DFMT_D24S8;
        d3dpp.Flags                      = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
        d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval      = D3DPRESENT_INTERVAL_DEFAULT;

При изменении
Код:

        d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality        = 0 ;

на любые другие значение приложение не взлетает. Как включить мультисемплинг?

Mr_F_ 24.05.2013 23:11

Ответ: Родитель объекта
 
Цитата:

Вот локальные координаты у меня хранятся в переменных, потом я их кладу в матрицу. Потом эту матрицу я использую как матрицу мира и вывожу объект. (Если совсем просто).

Как мне узнать узнать глобальную матрицу объекта?
которой рисуешь объект я и назвал глобальной (мировой).
а локальная - относительно координат парента.

Цитата:

D3DPRESENTFLAG_LOCKABLE_BACKBUFFER
этот момент крайне сомнителен

DarkMedveD 24.05.2013 23:40

Ответ: Родитель объекта
 
Спасибо, с мультисемплингом разобрался!

А вот с матрицей все никак не соображу.
Я рисую объект одной матрицей. Этой же матрицей рисовать и его детей?

Mr_F_ 25.05.2013 00:51

Ответ: Родитель объекта
 
Цитата:

Я рисую объект одной матрицей. Этой же матрицей рисовать и его детей?
нет, детей ты рисуешь матрицей, которая равна умножению локальной (относительной) матрицы чайлда на рисовательную матрицу парента.

DarkMedveD 25.05.2013 00:56

Ответ: Родитель объекта
 
Так, может я туплю, но мировая матрица получается при умножении всех матриц преобразования - позиции на поворот на масштаб (может порядок спутал).

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

Mr_F_ 25.05.2013 01:01

Ответ: Родитель объекта
 
Цитата:

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

DarkMedveD 25.05.2013 01:16

Ответ: Родитель объекта
 
Получается так:
rezult - матрица, которую я применю к чилду.
parentrezult - мировая матрица родителя.

result=result*parentresult;

Правильно?

И мини-вопросик - как в PhysX вращать актера? Чтобы он поворачивался и линейная скорость действовала уже в другом направлении?

Код:

                NxMat33 rot;
                rot=Actor->getGlobalOrientation();
                rot.rotZ(200);       
                Actor->setGlobalOrientation(rot);

Поворачивает объект, но не оси.
В Blitz3D это называлось "RotateMesh". А мне нужно то, что называлось "TurnEntity".

Mr_F_ 25.05.2013 02:45

Ответ: Родитель объекта
 
Цитата:

Правильно?
ну типа того, может быть последовательность умножаемых придётся поменять.

DarkMedveD 25.05.2013 04:54

Ответ: Родитель объекта
 
Спасибо, завтра попробую, но вроде не получалось.

А как быть с поворотом в PhysX?


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

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