DirectX Camera, чтобы следовать на основе матрицы мира 3D-модели? - PullRequest
0 голосов
/ 28 марта 2012

У меня есть несколько объектов, движущихся в трехмерном пространстве, и я ищу способы, чтобы при нажатии кнопки сделать снимок камеры и следовать выбранному объекту.

Есть ли способ использовать каждый объектworldMatrix?(Ниже приведен пример одного объекта. Это планета, которая вращается и вращается)

//set up matrices for rendering
D3DXMATRIX worldMatrixMer, viewMatrixMer, projectionMatrixMer;
m_Camera->GetViewMatrix(viewMatrixMer);
m_D3D->GetWorldMatrix(worldMatrixMer);
m_D3D->GetProjectionMatrix(projectionMatrixMer);
D3DXMatrixRotationX( &matRotateX, rx/65.0f);
//Rotate about Y axis
D3DXMatrixRotationY( &matRotateY, rotation * 15.0f);
D3DXMatrixRotationZ( &matRotateZ, rz/65.0f); 
//Collate Rot Matrices
D3DXMATRIX rotMatrixMer = matRotateX * matRotateY * matRotateZ;
D3DXVECTOR3 newVecDirMer;
D3DXVec3TransformCoord(&newVecDirMer, &initVecDirMer, &rotMatrixMer);
D3DXVec3Normalize( &currentVecDirMer, &newVecDirMer );
//Create the size of the object
D3DXMATRIX matScaleMer;
D3DXMatrixScaling(&matScaleMer, 0.1f, 0.1f, 0.1f);
//Starting position of object
D3DXMatrixTranslation(&matTranslateMer, 0.0f, 0.0f, 3.5983f * 3);
//Rotate about it's own axis
D3DXMatrixRotationY(&worldMatrixMer, rotation);
worldMatrixMer *= rotMatrixMer * matScaleMer * matTranslateMer;
//'Orbit'
D3DXMatrixRotationY( &matOrbit, (-1000.0f * rotation) / 88);
worldMatrixMer *= matOrbit;

Я действительно пытаюсь найти элегантный способ сделать это, поэтому любые предложения будут с благодарностью,

Спасибо

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Есть ли способ использовать worldMatrix каждого объекта?

Матрицу объекта можно представить так:

objx.x     objx.y     objx.z  0 //m[0][0]..m[0][3] or _11, _12, _13, _14
objy.x     objy.y     objy.z  0 //m[1][0]..m[1][3] or _21, _22, _23, _24
objz.x     objz.y     objz.z  0 //m[2][0]..m[2][3] or _31, _32, _33, _34
objpos.x   objpos.y   objpos.z  1 //m[3][0]..m[3][3] or _41, _42, _43, _44

Где m[][] и _11 .. _44 - соответствующие элементы D3DMATRIX, objpos - вектор положения объекта, objx - вектор объекта x ("локальный x" преобразован в мировое пространство) и т. Д.

Так что, покапоследний столбец (m [0..3] [3]) равен 0, 0, 0, 1, вы можете извлечь позицию объекта и его векторы "x", "y", "z" ("side", "up","front" - это зависит от приложения) из матрицы. Если последний столбец не "0, 0, 0, 1", то это матрица проекции, и вы не можете легко извлечь из нее данные объекта.

Оттуда вы можете делать с камерой все, что захотите.

0 голосов
/ 29 марта 2012

Я бы подошел к этому, установив положение камеры таким же, как и объект, которому нужно следовать.Если ваши объекты содержатся в векторе, это облегчит изменение объекта, которому нужно следовать, просто увеличив индекс в векторе до следующего объекта.После применения положения объекта к мировому положению камеры вы должны вызвать MatrixTranslation со смещением, которое вы хотите для своей камеры.Это будут значения, с которыми можно поиграться, чтобы получить хороший эффект.Элемент lookat камеры должен быть равен положению объекта, чтобы камера смотрела прямо на него.И если вы не хотите, чтобы камера смотрела прямо на объект, вы также можете это перевести.Наконец, верхний вектор на камере должен указывать, конечно.

Надеюсь, это поможет.

...