2014-12-10 22 views
0

我工作的一個遊戲,包括周圍的行星移動,並已得到了目前使用的前進和後退播放器朝着一個方向使用:移動在不同的方向繞點(地球)

if(forward) 
    yAngle = yAngle + 0.005f; 
if(backward) 
    yAngle = yAngle - 0.005f; 
if(left) 
    zAngle = zAngle - 0.005f; 
if(right) 
    zAngle = zAngle + 0.005f; 

然後這些角度被放入矩陣中。

角色使用Z旋轉完美旋轉,並使用Y旋轉向前和向後移動繞行星旋轉,但只會沿該方向移動。

我該如何計算X和Y旋轉,這樣角色會在正確的方向上繞着行星移動?

+0

目前尚不清楚角度的定義是什麼,但您只需要兩個角度來描述相對於3D座標系統的軸向量(例如從座標原點到玩家的船)的方向。你也可以用任何兩個笛卡爾座標軸的旋轉來描述它,但是你不能獨立地圍繞這三個座標旋轉。你也可以考慮定義你的旋轉關於[球形極座標](http://en.wikipedia.org/wiki/Spherical_coordinate_system)。 – 2014-12-10 21:39:59

回答

1

用於圍繞三維笛卡爾座標系的x軸的旋轉的旋轉矩陣是

 1   0   0 
    0  cos(xAngle) sin(xAngle) 
    0  -sin(xAngle) cos(xAngle) 

爲繞y軸的旋轉的矩陣是

cos(yAngle)  0  -sin(yAngle) 
    0   1   0 
sin(yAngle)  0  cos(yAngle) 

的矩陣圍繞z軸的旋轉是

cos(zAngle) sin(zAngle)  0 
-sin(zAngle) cos(zAngle)  0 
    0   0   1 

您可以反轉任何o通過反轉正弦項的符號來反轉這些矩陣。

但是,由於結果取決於執行旋轉的順序,因此沒有關於兩個軸的組合旋轉的唯一定義或矩陣。與你的情況特別相關的是,如果旋轉是在一系列小的交替步驟中執行的話,它仍然是不同的。因此,我建議保留描述當前方向的變換矩陣(以便例如當前船的方向爲M *(1,0,0)),而不是跟蹤整體旋轉角度。請更新每個勾號,或根據需要更新,方法是將其與上述表格的增量旋轉矩陣相乘,以描述自上次更新後的移動。這應該能讓您順暢的移動與直觀的控制一致。

+0

好的,謝謝。使用它來實現它,現在可以很好地移動它 – Chris 2014-12-14 15:35:57

1

我建議嘗試這樣的事:

if (forward) { 
    xAngle += 0.005f * (cos(zAngle)); 
    yAngle += 0.005f * (sin(zAngle)); 
} 
if (backward) { 
    xAngle -= 0.005f * (cos(zAngle)); 
    yAngle -= 0.005f * (sin(zAngle)); 
} 

我會在這裏預感,但嘗試一下!

+0

謝謝,這是類似的東西 – Chris 2014-12-14 15:35:07