Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PhysX + OpenGL, Квантернионы 
V
    Опции темы
Vetos
Дата 24.11.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Здравствуйте!
Изучаю PhysX 3, всё бы ничего но только при получении положения шейпа т.е. позицию и поворот, возникла трудность.
В мануалах написано, что по умолчанию PhysX настроен под OpenGL.
Т.к. OpenGL напрямую непонимает квантернион, в шейдер были введены две доп функции, перемножение квантернионов, и поворот точки с помощью квантерниона:
Код

vec4 quatMul ( in vec4 q1, in vec4 q2 )
{
    vec3  im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );
    vec4  dt = q1 * q2;
    float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );

    return vec4 ( im, re );
}

vec4 quatRotate (  vec3 p,  vec4 q )
{
    vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );

    return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );
}


Этот код я нашел еще когдато давно гдето в недрах сети:)
Но прикол в том что если напрямую передать квантернион в виде как он есть:
Код

                PxTransform pT = PxShapeExt::getGlobalPose(*shapes[nShapes]);
                Location->Position = vec3(pT.p.x, pT.p.y, pT.p.z);
                Location->Rotation = quat(pT.q.x, pT.q.y, pT.q.z, pT.q.w);

то обьекты на сцене(в моем случае кубы) ведут себя как бы неправильно, положение совпадает а вот с вращением беда, вращаются они как бы наоборот. Путем научного тыка, я добился того чтобы обьекты вращались правильно, но для этого пришлось сделать вот что:
Код

                PxTransform pT = PxShapeExt::getGlobalPose(*shapes[nShapes]);
                Location->Position = vec3(pT.p.x, pT.p.y, pT.p.z);
                Location->Rotation = quat(-pT.q.z, pT.q.y, -pT.q.x, pT.q.w);

т.е. поменять местами значения x и z, да еще и их знаки. Вот откуда взялись vec3, quat и Location:
Код

typedef QVector2D vec2;
typedef QVector3D vec3;
typedef QVector4D vec4;
typedef QMatrix4x4 mat4;
typedef QMatrix3x3 mat3;
typedef QMatrix2x2 mat2;
typedef QMatrix4x3 mat4x3;
typedef QMatrix4x2 mat4x2;
typedef QMatrix3x4 mat3x4;
typedef QMatrix3x2 mat3x2;
typedef QQuaternion quat;
typedef struct{
    vec3 Position;
    quat Rotation;
}GLLocation;
 
Раньше с использованием квантерниона небыло никаких проблем(без PhysX), вроде все вращалось как надо.
Но сейчас проблема с освещением, я думаю это связано с неправильным вращением нормалей.
Либо ошибка в функциях в шейдере, либо в передаче квантерниона с PhysX в OpenGL в чем я не сомневаюсь.
я вспомнил откуда коды функций в шейдере, человек писал что взял их с исходников Quake, так что думаю проблема не в них, а именно в передаче квантерниона.
        Прошу помощи, может квантернион с PhysX нужно както по другому передавать в QQuaternion???


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vetos
Дата 24.11.2012, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Странно, при переводе в матрицу поворота и отрисовке с ее помощью, кубы крутятся правильно.Но проблема с освещением не решилась :( Значит квантенионы тут ни при чем, но все равно интересно чем отличаются квантернионы в Qt, и в PhysX?


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vetos
Дата 25.11.2012, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Проблема решена, через связанные функции можно правильно передать квантернион с PhysX  в Qt:
Код

        PxVec3 Axis;
        PxReal Angle;
        pT.q.toRadiansAndUnitAxis(Angle, Axis);
        qreal qAngle = Angle/(22.0f/7.0f/180.0f);
        vec3  qAxis = vec3(Axis.x,Axis.y,Axis.z);

        Location->Rotation = quat::fromAxisAndAngle(qAxis,qAngle);

Теперь квантернион создается как положено и проблем с отображением физики и освещения нет.

Это сообщение отредактировал(а) Vetos - 25.11.2012, 00:47


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0399 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.