Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Как совместить две трансформации?

Как совместить две трансформации?

Поделиться
Force_MajeureПостоялецwww25 июня 201016:10#0
Подскажите, можно ли оптимизировать трансформации?
class mesh {
public:
D3DXVECTOR3 Position; // Положение
D3DXVECTOR3 Target; // Направление взгляда
D3DXMATRIX TransformMatrixR; // Поворот
D3DXMATRIX TransformMatrixS; // Масштаб
D3DXMATRIX TransformMatrixM; // Перемещение
bool Update() {
D3DXMatrixIdentity(TM);
*TM *= TransformMatrixR;
*TM *= TransformMatrixS;
*TM *= TransformMatrixM;
D3DXVec3TransformCoord(&Position,&Position,TM);
D3DXVec3TransformCoord(&Target,&Target,TM);
}
bool look000() {
 // направление таргета меша в 0,0,0 
// вычисляется матрица TransformMatrixR
 // в три приема: перенос Position в 0, получение матрицы вращения, перенос обратно в Position
}

bool move() {
 // вычисляется матрица TransformMatrixM;
}

}

//  в главном цикле мне нужно переместить меш и повернуть его, я вызываю
mesh* m = new mesh();
m->move();
m->Update(); // вот этот update, он нужен т.к. look000 вычисляет матрицу поворота в зависимости от Position
 // и если не применить к вектору Position матрицы перемещения, поворот будет вычислен неправильно.
 // Можно-ли избавитсья от этого Update() если в look000 есть доступ к матрице TransformMatrixM в которая
 // уже заполнена переносом, просто этот перенос еще не применен к векторам меша ?
m->look000();
m->Update();
slava_mibМодераторwww25 июня 201017:56#1
>можно ли оптимизировать трансформации?
да.
Force_MajeureПостоялецwww25 июня 201018:13#2
slava_mib
> да.
Как это сделать?
У меня есть текущие значения position и target и матрица переноса.
Можно применить ее отдельно к этим двум векторам и считать поворот с результата, но это не кажется оптимальным.
slava_mibМодераторwww25 июня 201018:26#3
Очень просто - понять что такое матрица (просто почитать хелп, скажем?) и спокойно собрать её самому. А когда поймёшь как это всё работает - догадаешься и до того, как это можно ускорить ещё больше. Потому как то, что у тебя написано сейчас - это просто чушь какая-то несусветная.

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

Force_MajeureПостоялецwww25 июня 201018:31#4
Хелп я читаю и с матрицами, насколько смог, разобрался. Но форум вроде бы для того и существует, чтобы можно было спросить то, до чего не можешь дойти сам. Или нет?
-Eugene-Постоялецwww25 июня 201019:04#5
Force_Majeure
> Но форум вроде бы для того и существует, чтобы можно было спросить то, до чего
> не можешь дойти сам. Или нет?
Форум существует НЕ для того, чтобы игнорировать Google.
Force_MajeureПостоялецwww25 июня 201021:28#6
-Eugene-
И какой же запрос вы бы забили в гугл, чтобы получить нужную информацию?
xDimkaПостоялецwww26 июня 20101:34#7
Force_Majeure
> И какой же запрос вы бы забили в гугл, чтобы получить нужную информацию?

Essential Math for Games Programmers

-Eugene-Постоялецwww26 июня 20107:52#8
Force_Majeure
Как создать убийцу крайзиса нубу в программировании за 30 дней...
Я бы поискал вообще книги о программировании игр для начинающих. В 100500 раз советую - фрэнк луна. Введение в программирование...
Force_MajeureПостоялецwww26 июня 20108:53#9
xDimka
Сори, я не силен в английском :(

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

-Eugene-Постоялецwww26 июня 20108:56#10
Force_Majeure
Нет, не вникали :-)
Force_MajeureПостоялецwww26 июня 201010:01#11
Мда, какой раньше доброжелательный форум был. Год не заходил, и на тебе ...
Ну извините, что отвлек великих людей своими ничтожными вопросами :(
Force_MajeureПостоялецwww27 июня 20107:59#12
Cyclone
Можно ведь так и написать - что непонятно задан вопрос.
Я его задал в общем виде т.к. может быть сам подход неправильный и посоветуют другой.
Сформулирую с конкретным кодом.
Вот так у меня считается поворот направления меша в точку xyz
bool TransformObject::LookInto(float X,float Y,float Z,bool Once)
{
  // Повернули ли до заданной точки
bool End = Once;
//D3DXVECTOR3 Pos = Position; // учет переноса
//D3DXVec3TransformCoord(&Pos,&Pos,&TransformMatrixM);
//D3DXVECTOR3 Tar = Target;
//D3DXVec3TransformCoord(&Tar,&Tar,&TransformMatrixM);
  // Перенос в 0,0,0
D3DXVECTOR3 MoveVector;
D3DXVec3Subtract(&MoveVector,&D3DXVECTOR3(0.0f,0.0f,0.0f),&Pos);
D3DXMATRIX Move;
D3DXMatrixIdentity(&Move);
D3DXMatrixTranslation(&Move,MoveVector.x,MoveVector.y,MoveVector.z);
TransformMatrixR *= Move;
  // Расчитать кватернион для поворота
  // Получить угол на которой будет осуществляться поворот
D3DXVECTOR3 Vec1;
D3DXVec3Subtract(&Vec1,&Tar,&Pos);
D3DXVECTOR3 Vec2;
D3DXVec3Subtract(&Vec2,&D3DXVECTOR3(X,Y,Z),&Pos);
D3DXVec3Normalize(&Vec1,&Vec1);
D3DXVec3Normalize(&Vec2,&Vec2);
float Vec1Vec2Dot = D3DXVec3Dot(&Vec1,&Vec2);
float QuatAngle = acos(Vec1Vec2Dot);
if(Once==false) {
  // Получить угол, на который объект должен был повернуться за время итерации (в радианах)
  float Angle = IterationAngle()*M_PI/180;
  // Если угол на который нужно повернуть больше Angle - поворачиваем на Angle
  if(abs(QuatAngle)>Angle) {
    QuatAngle = Angle;
  }
  else End = true;
}
  // Получить ось вокруг которой будет осуществляться поворот
D3DXVECTOR3 vP;
D3DXVec3Cross(&vP,&Vec1,&Vec2);
D3DXVec3Normalize(&vP,&vP);
  // Получить кватернион поворота
D3DXQUATERNION Quat;
D3DXQuaternionRotationAxis(&Quat,&vP,QuatAngle);
D3DXQuaternionNormalize(&Quat,&Quat);
  // Из кватерниона получить матрицу вращения
D3DXMATRIX Rot;
D3DXMatrixRotationQuaternion(&Rot,&Quat);
TransformMatrixR *= Rot;
  // Вернуть обратно в Position
D3DXMatrixIdentity(&Move);
D3DXMatrixTranslation(&Move,Pos.x,Pos.y,Pos.z);
TransformMatrixR *= Move;
return End;
}
Закомментированный участка раньше не было и в программе я вызывал так
mesh->Move(x,y,z);
mesh->Update(); // Умножение векторов меша на матрицы трансформации
mesh->LookInto(x,y,z);
mesh->Update();
Чтобы писать так
mesh->Move(x,y,z);
mesh->LookInto(x,y,z);
mesh->Update();
Я добавил участок, который в примере закомментирован. Правильное ли это решение, умножать вектора на матрицу, или можно включить матрицу уже имеющегося переноса в рассчитываемую матрицу поворота как-то по другому?

/ Форум / Программирование игр / Общее

Тема в архиве.

2001—2017 © GameDev.ru — Разработка игр