2010-09-22 21 views
0

J'essaie de trouver un algorithme approprié pour créer une matrice qui permet au quad de faire face au camer mais je rencontre des difficultés.Création d'une matrice pour un quad billboarded?

Le quad je dessine est vers le bas, voici le code que j'ai jusqu'à présent:

D3DXVECTOR3 pos; 
pos = D3DXVECTOR3(-2.0f, 6.0f, 0.1f); 
D3DXMATRIX transform; 
D3DXMatrixTranslation(&transform, pos.x, pos.y, pos.z); 

D3DXVECTOR3 axis = D3DXVECTOR3(0, -1, 0); 
D3DXVECTOR3 quadtocam = pos - EmCameraManager::Get().GetPosition(); 

D3DXVec3Normalize(&quadtocam,&quadtocam); 

D3DXVECTOR3 ortho; 
D3DXVec3Cross(&ortho, &axis, &quadtocam); 

float rotAngle = acos(D3DXVec3Dot(&axis,&quadtocam)); 
D3DXMATRIX rot; 
D3DXMatrixRotationAxis(&rot,&ortho,rotAngle); 

transform = rot*transform; 

Cela fonctionne quand il vient à faire du quad face à la caméra mais il ne reste pas raison quand face à tous les angles.

Sur cette capture d'écran: http://imgur.com/hFmzc.png Sur la gauche, le quad est vu tout droit (le vecteur est 0,0,1), dans l'autre il est vu d'un angle arbitraire.

Les deux fois, il fait face à la caméra, mais quand d'un angle arbitraire, il est incliné le long de son axe z local. Je ne suis pas sûr de savoir comment y remédier et je me demandais quelle serait la prochaine étape?

Répondre

1

La rotation autour d'un axe arbitraire fera toujours cela. Vous devez d'abord faire pivoter votre modèle autour de l'axe y pour le faire pointer (vers le haut) sur votre caméra et après l'avoir fait pivoter autour de votre axe ortho qui sera aligné avec le vecteur droit du modèle.

En supposant que l'axe z sort de l'écran est un code ici:

D3DXVECTOR3 Zaxis = D3DXVECTOR3(0, 1, 0); 
D3DXVECTOR3 flattenedQuadtocam = quadtocam; 
flattenedQuadtocam.y = 0; 
float firstRotAngle = acos(D3DXVec3Dot(&Zaxis,&flattenedQuadtocam)); 

D3DXMATRIX firstRot; 
D3DXMatrixRotationAxis(&firstRot,&Zaxis,firstRotAngle); 

transform = firstRot*transform; 

Cela devrait être mis juste après cette ligne:

D3DXVec3Normalize(&quadtocam,&quadtocam); 

Ensuite, le reste de votre code devrait fonctionner.

+0

Hmm, je ne peux pas mettre le code que vous avez fourni sous la ligne normalize parce que 'rotAngle' n'a pas encore été déclaré. – tweetypi

+0

Mon erreur, RotAngle devait être firstRotAngle. C'est corrigé maintenant. –

+0

La solution a-t-elle fonctionné? –