2013-12-17 33 views
1

我想開始說明我的目標與這個問題, 我目前正在C++和DirectX中創建一個小型遊戲引擎,我目前正處於我需要在廣告牌精靈(總是面對相機的那種)和模型上進行光線投射。如何從矩陣中獲取Vector3

對於我的老式遊戲,在廣告牌精靈處進行光線投射現在更重要一些,所以讓我們把模型光線投射完成。

我目前使用下面的代碼來測試對我的精靈:

for(int i = 0; i < spriteObjs.size();i++) 
    { 
     BOOL hit = FALSE; 
     FLOAT distToHit = 100; 
     D3DXVECTOR3 v1 = D3DXVECTOR3((-2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     D3DXVECTOR3 v2 = D3DXVECTOR3((2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     D3DXVECTOR3 v3 = D3DXVECTOR3((-2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(-5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     D3DXVECTOR3 v4 = D3DXVECTOR3((2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(-5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     if(D3DXIntersectTri(&v1,&v2,&v3,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
     { 
      //cout << "hit target: "<<spriteObjs.at(i)->quad.textureName << " at distance: " << distToHit << endl; 
     } 
     if(D3DXIntersectTri(&v2,&v3,&v4,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
     { 
      //cout << "hit target: "<<spriteObjs.at(i)->quad.textureName << " at distance: " << distToHit << endl; 
     } 
    } 

看着精靈的時候,然後測試該線這導致給人一種真實的,但是,這並不佔由精靈本身的視圖矩陣給出的旋轉,所以這適用於精靈的「前視圖」,但是當它側視時(它是一架飛機,所以它沒有寬度),你將永遠無法擊中它。因爲它是用它的臉朝着相機繪製的,所以仍然可以看到精靈的正面。所以我需要從世界矩陣(或倒轉的視圖矩陣(您的選擇))得到旋轉,並將其與vector3的定義相乘/數學運算(爲什麼來自2.5和5等你拿)頂點的位置(在這種情況下,V1到V4)

對我怎麼在四定義我的頂點一些額外的代碼

VertexPosNorTex triangleVerts[] = 
{ 
    {D3DXVECTOR3(-2.5,5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(0,0)}, 
    {D3DXVECTOR3(2.5,5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(1,0)}, 
    {D3DXVECTOR3(-2.5,-5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(0,1.5)}, 
    {D3DXVECTOR3(2.5,-5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(1,1.5)}, 
}; 

這會導致看起來像一個四方形

5 
---------- 
|  | 
|  | 
|  | 
|  | 10 
|  | 
|  | 
|  | 
---------- 

這將在中間轉動精靈廣告牌錨點,在那裏我只使用上部0.5紫外線空間作爲紋理(下部分離保持透明,所以你不會看到它(這有助於解決問題)就像從一個更高的角度)

看低所以當他們是飛在地面以上。隨着給予足夠的解釋和我的問題半途而廢,這裏是

TL; DR

如何改變我使用旋轉版本(矩陣)的頂點位置以旋轉的形式返回到Vector3,其位置爲 (因此1個頂點wi例如,在(1,0,0)處的第0次旋轉將會像(0.86,0,0.1314)那樣在從矩陣中取回之後。 (例如只是一個隨機數,沒有造成任何代碼或數學)

回答

0

有人我的FB頁面上評論說:

只是D3DXVec3Transform什麼都變換頂點,你得到的Vector4,但你可以簡單地忽略變換矩陣的w分量。我還沒有測試過它(我即將推出),但我100%確定這將與我的代碼一起工作,因爲我已經有99%的實現在同一個函數中,但我沒有正確使用它

+0

所以這有點工作的,它有一個奇怪偏離設定在不同的角度和位置與多然後100上以不同的角度在X改變而子畫面只在寬度5, 我不能完全弄清楚爲什麼.. – Themperror

0

粗略的解決方案,但它的工作原理..它不像從視圖矩陣檢索旋轉(我會得到幾乎不可能轉換爲eulers的四元數),但它的工作..

for(int i = 0; i < spriteObjs.size();i++) 
    { 
     if(Vector3Distance(&spriteObjs.at(i)->position,&camera.position) < 150) 
     { 
      BOOL hit = FALSE; 
      FLOAT distToHit = 100; 

      float x = 1 * std::cos((angleX+90) * 3.141592f/180); 
      float z = 1 * std::sin((angleX+90) * 3.141592f/180); 
      D3DXVECTOR3 v1 = D3DXVECTOR3((-2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(-2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z);// 
      D3DXVECTOR3 v2 = D3DXVECTOR3((2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z); 
      D3DXVECTOR3 v3 = D3DXVECTOR3((-2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(-2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(-2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z); 
      D3DXVECTOR3 v4 = D3DXVECTOR3((2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(-2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z); 

      if(D3DXIntersectTri(&v1,&v2,&v3,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
      { 
       cout << "hit target: "<<spriteObjs.at(i)->objName << " at distance: " << distToHit << endl; 
      } 
      if(D3DXIntersectTri(&v2,&v3,&v4,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
      { 
       cout << "hit target: "<<spriteObjs.at(i)->objName << " at distance: " << distToHit << endl; 
      } 
     } 
    }