2012-06-25 29 views
1

好吧,所以我得到了一些移動代碼,我想我需要手動輸入何時上坡/下坡。我得到的所有東西都是斜率的正常值,矢量,以及我當前和以前的位置,以及我的偏航。基於偏航上坡/下坡的更好方法?

有沒有更好的方法來旋轉,無論我根據我的偏航上坡或下坡?

Vector3f move = new Vector3f(0,0,0); 
     move.x = (float)-Math.cos(Math.toRadians(yaw)); 
     move.z = (float)-Math.sin(Math.toRadians(yaw)); 

     System.out.println("slopeNormal.z: " + slopeNormal.z + "move.z: " + move.z); 

     move.normalise(); 

     float vx = (float) (Math.sqrt(Math.pow(move.y, 2) + Math.pow(move.z, 2)) * move.x); 
     float vy = (float) (Math.sqrt(Math.pow(move.x, 2) + Math.pow(move.z, 2)) * move.y); 
     float vz = - vx * slopeNormal.x - vy * slopeNormal.y; 
     move.scale(movementSpeed * delta); 

     if(vz < 0) 
      move.y -= slopeVec.y * 1.5f; 

     if(vz > 0) 
      move.y += slopeVec.y * 1.5f; 

     Vector3f.add(pos, move, pos); 

編輯:更新的代碼。

+0

你可以在Stack Overflow的遊戲開發兄弟http://gamedev.stackexchange.com/上獲得更多答案。 – rcdmk

回答

1

首先,下面是不正確的:

move.x = (float)-Math.toDegrees(Math.cos(Math.toRadians(yaw))); 
move.z = (float)-Math.toDegrees(Math.sin(Math.toRadians(yaw))); 

Math.toDegrees轉換弧度到一個在度的角度,但Math.cosMath.sin結果並不角度。

假設零偏航在正x方向...並且定義vx,vy,vz =沿着三個軸的運動速率,s =速度和斜率normal = nx,ny,nz其中nx^2 + ny^2 + nz^2 = 1。所以nx = ny = 0,nz = 1將是平坦的。首先,我定義x',y'=軸相對於平坦的地面(運動被約束到地面)。然後(以下不是有效的Java,但我封閉它的代碼格式反正):

vx' = cos(yaw) * s 
vy' = sin(yaw) * s 

然後,我需要從X「旋轉,Y」座標到真實世界座標。正在使用該斜率正常完成:

vx = sqrt(vy^2 + vz^2) vx' 
vy = sqrt(vx^2 + vz^2) vy' 
vz = - vx' nx - vy' ny 

在此變換的檢查:VX^2 + VY^2 + VZ^2必須等於VX '^ 2 + VY'^2 = S^2。我認爲這可以解決。

所以要回答你的問題:向上還是向下? vz> 0已啓用,vz < 0已關閉。

+0

好的,我在問題中編輯了我的代碼。我的代碼是否正確?也感謝ToDegrees的收穫。 :3 – CyanPrime