2012-12-12 31 views
2

請參閱我的編輯如下。球形相機

我在原點繪製了一個球體。我的相機正在以3個單位的半徑查看球體。我正試圖讓相機使用2D操縱桿圍繞球體運行。我目前使用下面的代碼繞着球體運行,但我不確定如何讓遊戲杆控制遊戲杆指向的旋轉方向。我的操縱桿提供0度的角度,當你逆時針旋轉時,度數增加到360度。操縱桿距離它的中心起點越遠,旋轉速度也會增加。我只是不知道該怎麼做。

PIOVER180 = Math.PI/180; 
rho = 3; 
theta = (theta+1)%360; 
phi = (theta+1)%360; 

camera.position.x = (float) (rho * Math.sin(theta * PIOVER180) * Math.cos(phi * PIOVER180)); 
camera.position.y = (float) (rho * Math.cos(theta * PIOVER180)); 
camera.position.z = (float) (rho * Math.sin(theta * PIOVER180) * Math.sin(phi * PIOVER180)); 
camera.normalizeUp(); 

libGDX提供了一個很好PerspectiveCamera類的,我希望把它擴大爲SphericalCamera,並用它來打電話給我轉,當我需要他們。

編輯:

我想,如果我可以想出如何使一個2D操縱桿操縱thetaphi變量正確那麼它應該工作的罰款。 theta是正x軸與球體上的點之間的夾角,phi其中z軸上的點位於正(正或負),而rho是從中心點(0,0,0)到指向球體(基本上是半徑)

+0

在場景中使用'glRotate(sensitivity,joystickMovementY,joystickMovementX,0.0f)'通常會更好,而不是移動相機 –

+0

我一直在考慮這樣做,但我將會有一堆模型繞着我的球體子彈以及。我認爲只是改變相機的視角會更容易些? – DRiFTy

+0

移動相機本身沒有任何問題。只是你最終會實現一些數學方法來完成'glRotate()','glTranslate()'等已經做的事情。 –

回答

2

您正在嘗試圍繞球體以由操縱桿控制的方式旋轉,同時查看中心,對嗎?

那麼如果操縱桿讓你在度角「昂」,其中0爲最高,然後爲每個軸的分量將是:

double x = Math.sin(ang*Math.PI/180.); 
double y = Math.cos(ang*Math.PI/180.); 

什麼,那麼你可以做的是翻譯你的相機其自己UP/LEFT平面通過這些金額,可能使用「速度」參數:

Vector3 left = new Vector3(camera.up).crs(camera.direction).scl((float)(speed*x)); 
Vector3 up = new Vector3(camera.up).scl((float)(speed*y)); 
camera.position.add(left).add(up); 

此時你的相機將離開預定軌道,所以你需要把它帶回來:

camera.position.nor().scl(rho); 

在您的代碼示例中,您在更改位置後不更新攝像機的方向,但根據您的描述需要更新攝像機的方向。爲了看產地:

camera.direction.set(camera.position).scl(-1).nor(); 

最後更新了向量和模型矩陣:

camera.normalizeUp(); 
camera.update(false); 

希望這有助於!

+0

我已經從libGDX切換到Unity3D,但理論實際上是相同的(查看我的Unity3D代碼後,我有一個非常類似的過程,因爲你發佈的東西減去一個稍微不同的API)...我會標記這個作爲接受的答案,因爲它是正確的,並將爲libGDX工作。欣賞它。 – DRiFTy

+0

如果我評論'camera.direction.set(camera.position).scl(-1).nor();'線,這個func允許我移動相機。如何改變它與偏移量一起工作的函數?問題是每次重置中心的偏移和球體。 – Nolesh

+0

有沒有辦法將這個代碼用於物體繞軌道而不是相機,相機處於固定位置? – Jammo