Камера DirectX, которой следует следовать на основе матрицы мира 3D-модели?

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

Есть ли способ использовать 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;

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

Спасибо


person J C    schedule 28.03.2012    source источник


Ответы (2)


Есть ли способ использовать 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» («сторона» , "сверху", "спереди" - что зависит от применения) от матрицы. Если последний столбец не "0, 0, 0, 1", то это матрица проекции, и вы не можете легко извлечь из нее данные объекта.

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

person SigTerm    schedule 29.03.2012
comment
Спасибо, что разобрали для меня Матрицу. Вероятно, я так и поступлю. - person J C; 29.03.2012

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

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

person SeventhBullet    schedule 29.03.2012