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+а, да?
Но как найти угол альфа? Скаляр между осью У и чем? Как получить поворот по оси У для объекта?

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

bersercer26 03.03.2014 03:30

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

result = T2 * (R * T)

хелп....T2 как получить...не знаю

SBJoker 03.03.2014 12:09

Ответ: Вращение осей координат
 
T2 = result / (R * T)

bersercer26 03.03.2014 14:39

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

result = T2 * (R * T)
хелп T2 как получить???

bersercer26 03.03.2014 14:55

Ответ: Вращение осей координат
 
result а как его получить??


T2 = result / (R * T) выкидывает ошибку потому что result не известен

bersercer26 03.03.2014 15:01

Ответ: Вращение осей координат
 
/ знак деления не принемает

impersonalis 03.03.2014 15:06

Ответ: Вращение осей координат
 
Потому что есть "умножение на обратную матрицу"

bersercer26 03.03.2014 15:13

Ответ: Вращение осей координат
 
T2=result/(R*T);
result = T2 * (R * T);

чет не получается

bersercer26 03.03.2014 15:29

Ответ: Вращение осей координат
 
Хелпп..

MiXaeL 03.03.2014 20:22

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

Сообщение от bersercer26 (Сообщение 275910)
Хелпп..

Ботт..

bersercer26 04.03.2014 01:42

Ответ: Вращение осей координат
 
T2=result/(R*T);
result = T2 * (R * T);

кто знает дайте ответ как рассчитать матрицу....уже не знаю как делать

bersercer26 04.03.2014 17:58

Ответ: Вращение осей координат
 
помогите нубу

bersercer26 06.03.2014 18:17

Ответ: Вращение осей координат
 
хелп....мля что никто не знает ...??

mr.DIMAS 06.03.2014 22:20

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

bersercer26 07.03.2014 18:26

Ответ: Вращение осей координат
 
[IMG]C:\Users\Admin\Desktop\tgVP0njBJq8.jpg[/IMG]

bersercer26 07.03.2014 18:32

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

bersercer26 07.03.2014 18:33

Ответ: Вращение осей координат
 
D3DXMATRIX T;
D3DXMATRIX R;

D3DXMatrixRotationY(&R,-80.0f);
D3DXMatrixTranslation(&T,0.0f,0.0f,45.0f);

result=R*T;

bersercer26 07.03.2014 18:35

Ответ: Вращение осей координат
 
Мне нужно чтоб объект ездил во всех направлениях.......спасибо что отозвался

Arton 07.03.2014 18:57

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

Сообщение от bersercer26 (Сообщение 276253)
[IMG]C:\Users\Admin\Desktop\tgVP0njBJq8.jpg[/IMG]

Ты издеваешься да?

Хотя я в своё время принёс другу вместо игры, кучу ярлыков :-D


Цитата:

Сообщение от bersercer26 (Сообщение 276254)

Что бы картинка сохранилась на форуме, она должна быть хотя бы в одном сообщение и не в тегах картинки, а в тегах прикреплённого файла.

mr.DIMAS 07.03.2014 19:15

Ответ: Вращение осей координат
 
2Arton - ошиблись разделом, вам в раздел Болтовня.

Код:

/////////////////////////////////////////
// при инициализации объекта
D3DXVECTOR3 right( 1, 0, 0 );
D3DXVECTOR3 up( 0, 1, 0 );
D3DXVECTOR3 look( 0, 0, 1 );
D3DXVECTOR3 pos( 0, 0, 0 );
/////////////////////////////////////////

/////////////////////////////////////////
// В цикле
D3DXMATRIX out;

// Делаем оси ортогональными
D3DXVec3Normalize(&look, &look);

D3DXVec3Cross(&up, &look, &right);
D3DXVec3Normalize(&up, &up);

D3DXVec3Cross(&right, &up, &look);
D3DXVec3Normalize(&right, &right);

float x = -D3DXVec3Dot(&right, &pos);
float y = -D3DXVec3Dot(&up, &pos);
float z = -D3DXVec3Dot(&look, &pos);

// Строим матрицу
out._11 = right.x;
out._12 = up.x;
out._13 = look.x;
out._14 = 0.0f;

out._21 = right.y;
out._22 = up.y;
out._23 = look.y;
out._24 = 0.0f;

out._31 = right.z;
out._32 = up.z;
out._33 = look.z;
out._34 = 0.0f;

out._41 = x;
out._42 = y;
out._43 = z;
out._44 = 1.0f;

device->SetTransform( D3DTS_WORLD, &out );
/////////////////////////////////////////

/////////////////////////////////////////
// Поворот
D3DXMATRIX result,pitchMatrix,yawMatrix,rollMatrix;
D3DXMatrixRotationAxis( &pitchMatrix, &D3DXVECTOR3( 1, 0, 0 ), pitchAngleRadians );
D3DXMatrixRotationAxis( &yawMatrix, &D3DXVECTOR3( 0, 1, 0 ), yawAngleRadians );
D3DXMatrixRotationAxis( &rollMatrix, &D3DXVECTOR3( 0, 0, 1 ), rollAngleRadians );

result = pitchMatrix * yawMatrix * rollMatrix;
D3DXVec3TransformCoord( &right, &D3DXVECTOR3( 1, 0, 0 ), &result );
D3DXVec3TransformCoord( &look, &D3DXVECTOR3( 0, 1, 0 ), &result );
D3DXVec3TransformCoord( &up, &D3DXVECTOR3( 0, 0, 1 ), &result );
/////////////////////////////////////////

/////////////////////////////////////////
// Перемещение в зависимости от направления
pos += right * xSpeed;
pos += up * ySpeed;
pos += look * zSpeed;
/////////////////////////////////////////

/////////////////////////////////////////
// Перемещение по осям
pos += xSpeed;
pos += ySpeed;
pos += zSpeed;
/////////////////////////////////////////


bersercer26 07.03.2014 22:06

Ответ: Вращение осей координат
 
Честно чет не могу разобраться....

bersercer26 07.03.2014 22:08

Ответ: Вращение осей координат
 
/////////////////////////////////////////
// Поворот
D3DXMATRIX result,pitchMatrix,yawMatrix,rollMatrix;
D3DXMatrixRotationAxis( &pitchMatrix, &D3DXVECTOR3( 1, 0, 0 ), pitchAngleRadians );
D3DXMatrixRotationAxis( &yawMatrix, &D3DXVECTOR3( 0, 1, 0 ), yawAngleRadians );
D3DXMatrixRotationAxis( &rollMatrix, &D3DXVECTOR3( 0, 0, 1 ), rollAngleRadians );

result = pitchMatrix * yawMatrix * rollMatrix;
D3DXVec3TransformCoord( &right, &D3DXVECTOR3( 1, 0, 0 ), &result );
D3DXVec3TransformCoord( &look, &D3DXVECTOR3( 0, 1, 0 ), &result );
D3DXVec3TransformCoord( &up, &D3DXVECTOR3( 0, 0, 1 ), &result );
/////////////////////////////////////////

/////////////////////////////////////////
// Перемещение в зависимости от направления
pos += right * xSpeed;
pos += up * ySpeed;
pos += look * zSpeed;
/////////////////////////////////////////

/////////////////////////////////////////
// Перемещение по осям
pos += xSpeed;
pos += ySpeed;
pos += zSpeed;
/////////////////////////////////////////






Здесь поворот идет камеры, а мне надо фигуры..... можешь весь исходник кинуть, если не трудно я уже запутался.....

mr.DIMAS 07.03.2014 23:00

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

Здесь поворот идет камеры, а мне надо фигуры..... можешь весь исходник кинуть, если не трудно я уже запутался.....
Ты не прав. Поворот( точнее преобразование ) будет именно того что ты укажешь вызовом



Код:

device->SetTransform( ... )
Например
Код:

device->SetTransform( D3DTS_WORLD, &matrix )
Задаст преобразование которое применится к отрисовываемому объекту( device->DrawIndexedPrimitive, device->DrawPrimitive и т.д. )

Преобразование
Код:

device->SetTransform( D3DTS_VIEW, &matrix )
задает дополнительное преобразование вида( камеры ). В DirectX преобразования вынесены в отдельные матрицы, в OpenGL же есть матрицы GL_MODELVIEW - тут две матрицы( видовая и мировая ) уже объединены в одну.

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

Для объекта код будет таким, каким я привел его выше.

Для камеры все то же самое, только вызов

Код:

device->SetTransform( D3DTS_WORLD, &out );
Заменяется на

Код:

device->SetTransform( D3DTS_VIEW, &out );
А общий порядок операций примерно такой

Код:

device->SetTransform( D3DTS_WORLD, &worldMatrix );
device->SetTransform( D3DTS_VIEW, &viewMatrix );
device->DrawPrimitive( ... )

В таком варианте при отрисовке задействуются только что установленные матрицы.

Вообще DX и OGL это что-то типа конечного автомата( FFP часть естественно - на то она и Fixed Function Pipeline :-D ). Тоесть задаешь какие-то определенные свойства всему конвееру и видеокарта производит отрисовку именно с такими параметрами.

И да исходника не будет, я для тебя написал приведенный выше кусок кода.

Ну вот вроде и все. Если где ошибся не серчайте.

bersercer26 08.03.2014 10:10

Ответ: Вращение осей координат
 
Спасибо за объяснение...буду разбираться


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

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