2010-09-22 61 views
0

我試圖想出一個適當的算法來創建一個矩陣,它可以直接面對camer,但我有困難。爲billboarded四邊形創建矩陣?

我畫朝下的四,這裏的代碼,我到目前爲止:

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; 

這工作,當談到使得四面對鏡頭但它不熬夜權當從各個角度面對它。

在此屏幕截圖中:http://imgur.com/hFmzc.png左側四邊形正在直接觀察(矢量爲0,0,1),另一個從任意角度觀察。

兩次它都面向相機,但是從任意角度時,它沿着它的局部z軸傾斜。我不知道如何解決它,並想知道下一步會是什麼?

回答

1

圍繞任意軸旋轉將永遠做到這一點。您應該首先圍繞y軸旋轉模型,使其指向(向上)到您的相機,然後繞着您的鄰軸旋轉,並與模型的右向量對齊。

假設Z軸是走出這裏的屏幕是一些代碼:

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; 

這應該這條線之後放:

D3DXVec3Normalize(&quadtocam,&quadtocam); 

那麼你的代碼的其餘部分應該工作。

+0

嗯,我不能把你提供的代碼放在normalize行下,因爲'rotAngle'還沒有被聲明。 – tweetypi 2010-09-22 13:46:29

+0

我的錯誤,rotAngle是第一個角色。現在已經糾正了。 – 2010-09-22 13:58:28

+0

解決方案是否正常工作? – 2010-09-22 18:18:07