2013-05-02 26 views
-1

介紹: 我開發在OpenGL一個小的塔防遊戲,目前我只是絕望有點問題....調整glRotate,使用點積

我想從塔樓到彈瞄準頭部朝向單位。所以我的問題更多是一個數學上的問題,但它屬於opengl :)

我有以下想法;我可以使用點積來獲得繞x軸旋轉的角度以獲取頭部,這取決於剛直線向下或與地面平齊的距離,然後繞y軸旋轉額外的角度以使箭頭處於每次調整到它所瞄準的單位。

我對繞X軸旋轉的角度碼(ⅰ稱之爲m_fYNeigung由於通過繞x軸旋轉頭的高度改變(Y))是這樣的:

plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_fYNeigung = 
RADIANS_TO_DEGREES (acos ((float) 
     (
      (faTowerPosition[0]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) + 
      (faTowerPosition[1] - 1) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) + 
      (faTowerPosition[2]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2]) 
     ) 
     /
     (
      fabs (faTowerPosition[0]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) + 
      fabs (faTowerPosition[1] - 1) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) + 
      fabs (faTowerPosition[2]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2]) 
     ) 
));  

其中faTowerPosition是從塔頂指向下的第一個向量(箭頭也從faTowerPosition [X/Y/Z]開始),點積的第二個向量是m_faProDirectionVector,它是一個歸一化方向向量,描述從塔的箭頭到單位。

的OpenGL繪圖部分看起來就像這樣簡單:

 for (sizeJ = 0; sizeJ < localTowerArray[sizeI].m_byteProjectilAmount; sizeJ++) 
     { 
      if (localTowerArray[sizeI].Projektils[sizeJ].m_bOnFlight == true) 
      { 
       glPushMatrix(); 
       glTranslatef (localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[0], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[1], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[2]); 
       //glRotatef (360.0f - localTowerArray[sizeI].Projektils[sizeJ].m_fXNeigung, 0, 1, 0); 
       glRotatef (localTowerArray[sizeI].Projektils[sizeJ].m_fYNeigung, 1, 0, 0); 
        DrawWaveFrontObject (m_pArrowProjektilObject); 
       glPopMatrix(); 
      } 
     } 

不理會我做的角度計算,我只是做它用箭頭的作用做實驗,我只注意到看起來箭頭的行爲根據(我得說:可建立的地圖由x:-3.4到3.4和z從4到-4縮放)的不同取決於行爲,塔的構建在-x/z,-z/x,z/x,-z/-x所有這些情況我都是不同的,至少取決於單位是在塔的左側還是右側,演技也不同....所以我忘記了通過這種方式使用點產品提醒?

+1

你的代碼有太多錯誤,很難回答這個問題。爲什麼使用size作爲索引的前綴?德國人的名字是什麼?爲什麼有這麼多重複的代碼?你爲什麼不使用結構來得分?最重要的是,如果你問數學問題,爲什麼還要發佈你的代碼?無論如何。檢查了這一點:http://stackoverflow.com/questions/11008303/lookat-implementation-misbehaviors。大小前綴 – 2013-05-02 19:48:50

+0

,因爲它們是size_t類型。德文名字「s」......唯一的德文名字是var「neigung」。我解釋了它。它的天使和neigung意味着像音高。即時通訊不知道你的意思是重複的代碼....我只是這樣寫了它,以保持點積的形式,它更容易得到即將做的事情....你是什麼意思與結構的點?我張貼我的代碼來解釋我的問題,提到一個問題,因爲我不知道什麼導致我的問題。至少...我發佈的鏈接絕對沒有與我的問題無關,但無論如何感謝:) – dhein 2013-05-02 20:07:46

+0

之前downvoting,也許告訴我什麼「這麼多」是錯誤的我的代碼?它自己運行的代碼沒有任何問題....它只是點積的工作。爲什麼它不應該做它的行爲?! – dhein 2013-05-03 03:43:12

回答

2

首先,你的代碼很難理解,所以我想了很多試圖回答你。如果我認爲出了什麼問題,我爲此表示歉意。

我假設你想使用歐拉角旋轉來正確對齊你的射彈。所以,首先你會做一個X旋轉,然後是Y旋轉。

要進行X旋轉,對於點積,您的矢量必須位於YZ平面上,並假設您的子彈在Z方向上開始,則第一個矢量爲(0,0,1)。如你所說,第二個向量是一個指向單位的向量,可以用(px,py,pz)表示。你必須突出這一載體的平面YZ得到您的點積第二矢量,所以這個載體將是(0,PY,PZ)

現在,來計算應用以下一級方程式

點積

x1.x2 + y1.y2 + z1.z2 = | p1 |。| p2 | .cos a,其中| p1 |和| p2 |是矢量的模塊(其長度)

在此示例中,第一個矢量是單位的,但第二個矢量不是。所以| p2 | = sqrt(py^2 + pz^2)。此後:

ACOS(A)= PZ/SQRT(PY^2 + PZ^2)

這將使您圍繞X軸的角度。做相同的計算以實現Y角度旋轉

PS。在我寫這個答案後,我注意到你使用了「晶圓廠」功能。我想你想找到你的第二個向量模塊,但晶圓廠給你一個Escape的絕對值。要計算一個向量的模塊(它的長度),你需要使用上面的公式。

+0

即時通訊使用晶圓廠,因爲我認爲| x |等於sqrt(x^2)你的解釋聽起來相當不錯,下次提示你的「如何提問」提示:)但它看起來也是同樣的問題在做...好g2g現在生病了試試看今天晚上或明天,也許我只是有一點mindtrap:D生病讓你知道,謝謝:) – dhein 2013-05-04 13:49:48