2012-03-28 7 views
0

Ich habe mehrere Objekte in einem 3D-Raum bewegt und bin auf der Suche nach Möglichkeiten, auf Knopfdruck die Kamera einrasten zu lassen und dem gewählten Objekt zu folgen.DirectX-Kamera zu folgen basierend auf 3D-Modell der Welt Matrix?

Gibt es eine Möglichkeit, die WorldMatrix jedes Objekts zu verwenden? (Im Folgenden ein Beispiel für ein Objekt ist. Dieser ist ein Planet, die & Bahnen dreht)

//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; 

Ich versuche wirklich eine elegante Art und Weise zu machen dies geschehen, zu finden, so Anregungen würden sehr geschätzt werden.

Dank

Antwort

1

Gibt es eine Möglichkeit, die WorldMatrix jedes Objekts zu verwenden?

Object Matrix kann auf diese Weise dargestellt werden:

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 

Wo m[][] und _11 .. _44 sind entsprechende Elemente D3DMATRIX, objpos - Objektpositionsvektor, objx - Objekt x ("lokale x“ umgewandelt zum Weltraum) vector, etc.

Solange also die letzte Spalte (m [0..3] [3]) 0, 0, 0, 1 ist, können Sie die Objektposition und ihr "x" extrahieren, "y", "z" Vektoren ("side", "up", "front" - was von appli abhängt Kation) aus der Matrix. Wenn die letzte Spalte nicht "0, 0, 0, 1" ist, handelt es sich um eine Projektionsmatrix, und Sie können Objektdaten daraus nicht einfach extrahieren.

Von dort aus können Sie mit Ihrer Kamera alles machen, was Sie wollen.

+0

Vielen Dank für den Abbau der Matrix für mich, das ist wahrscheinlich die Art, wie ich darüber gehen werde. –

0

ich diese Position ist durch Einstellen der Kamera nähern würde als das Objekt auf das gleiche zu folgen. Wenn Ihre Objekte in einem Vektor gehalten werden, wird es einfacher, das zu verfolgende Objekt zu ändern, indem Sie einfach Ihren Index im Vektor zum nächsten Objekt erhöhen. Nachdem Sie die Position des Objekts auf die Weltposition der Kamera angewendet haben, sollten Sie eine MatrixTranslation nach dem von Ihnen gewünschten Offset für Ihre Kamera aufrufen. Dies wären die Werte, mit denen man spielen muss, um einen guten Effekt zu erzielen. Das Lookat-Element der Kamera sollte der Position des Objekts entsprechen, so dass die Kamera direkt darauf blickt. Und wenn Sie nicht möchten, dass die Kamera direkt auf das Objekt schaut, können Sie das auch übersetzen. Schließlich sollte der Up-Vektor auf der Kamera natürlich nach oben zeigen.

Hoffe, das hilft.