2013-01-24 74 views
4

我已經到了我的應用程序中使用LibGDX構建的情景,我需要相機能夠旋轉,並且也可以由用戶移動,以及能夠被縮放。我的相機控制移動和縮放相機的工作非常漂亮,但是,當相機旋轉時,相機將根據該旋轉進行移動。例如,如果相機向左旋轉45度,並且用戶向右拖動以移動相機,則相機將向右上方移動,因爲這是相機右側正指向的位置。相反,我需要相機始終相對於屏幕/用戶輸入移動,而不管其旋轉。LibGDX移動一個旋轉的相機

我對這個問題有一個解決方案,那就是簡單地使用「世界座標」來定位相機,而不是基於我現在嘗試使用的「窗口座標」。這會產生令人不愉快的用戶體驗,因爲它會使相機變得相當不連貫,並導致我的縮放系統出現問題。我認爲我可以用很多調整來修補這些問題,但是,因爲使用窗口座標已經非常平滑,所以我更願意去那條路線。

我懷疑有一個優雅的解決方案,看似簡單的問題,我可以做一個矩陣或沿着這些線的簡單計算,但我在OpenGL的知識仍然非常缺乏,我似乎無法弄清楚什麼確切需要發生修復它。任何更熟悉OpenGL和所有這些矩陣的人的想法都將不勝感激!

===編輯===

用來在這裏舉行的值的對象基本上只是我的Vector2,這是在應用程序的不同部分所要求的自己的版本。我不太清楚0.7f在那裏的確切原因,但大概是降低運動的敏感度,如果我將它移除,問題仍然存在。

camera.position.set(cameraStartPosition.getX() - ((zoomCurrentPosition.getX() - zoomStartPosition.getX()) * 0.7f), cameraStartPosition.getY() + ((zoomCurrentPosition.getY() - zoomStartPosition.getY()) * 0.7f), 0); 

cameraStartPosition - 攝像頭在用戶開始移動時的X座標和Y座標。

zoomStartPosition - 初始觸摸啓動變焦

zoomCurrentPosition的X和Y座標 - 將X和Y座標,其中控制所述變焦觸摸目前是

在這些x和y值直接從touchDown和touchDragged方法中獲取。如果我將代碼放在下面的代碼後面,代碼就會創建我在原文中提到的問題,它會按照它應該的方式移動,但非常不連貫。

Vector3 vector = new Vector3(x, y, 0); 
    camera.unproject(vector); 
    x = (int) vector.x; 
    y = CanvasAnywhereMain.HEIGHT - (int) vector.y; 
+0

您可以添加一段代碼,顯示您現在如何移動/旋轉攝像頭嗎? –

+0

我的輸入代碼在這一點上相當大,所以現在我只提出移動相機本身的線,以及我用來將x和y轉換爲「世界空間」的塊,主要用於應用程序中的其他觸摸事件。我很高興根據需要發佈更多內容,我只是不想發佈大量不必要的代碼。此外,就目前而言,我只是使用camera.rotate(value)旋轉相機。由於這些問題,我還沒有建立適當的控制系統。 – Synthetik

回答

2

今天我在處理類似的問題,當時我正在編程軌道攝像機。我會試着描述你如何處理這個問題。

我希望我的軌道相機能夠在同一時間圍繞X軸和Y軸旋轉,但它不起作用。我只能分別繞着這個軸旋轉。

把戲對我來說是:

Vector3 target = Vector3.zero 
Vector3 right = new Vector().set(camera.direction).crs(camera.up).nor(); 

// This angles usualy comes from touchDragged event in your input processor 
// class implementing the InputProcessor, where you do your calculations 
deltaAngleX = 1.1f; 
deltaAngleY = 1.9f; 

// Rotate around X axis 
camera.rotateAround(target, right, deltaAngleX); 

// Rotate around Y 
camera.updateRotation(Vector3.Y, deltaAngleY); 

當你圍繞Y軸旋轉的一切是好的,因爲Y軸不取決於你的X軸旋轉而改變。你總是想繞世界Y軸旋轉,而不是任何本地的旋轉。

但是當你圍繞X旋轉時,你不能使用Vector3.X,因爲這個軸不會相對於你的相機位置和方向。所以我們需要計算相機的「本地Y」軸。要做到這一點,我們需要知道兩個向量的交叉積是什麼。請參閱Cross product on wikicrs() on libgdx class reference

以下代碼片段將返回新的Vector3,它將指向相對於當前相機的右側軸。注意nor()調用是存在的,因爲我們想規範化該向量。

長話短說:

Vector3 right = new Vector().set(direction).crs(up).nor(); 

Crs的創建從兩個向量(在我們的例子camera.direction和camera.up)跨產品載體。

我不明白爲什麼的Vector3正確的成員變量不便於暴露或向右爲什麼矢量計算方法是不存在的,但是這也有問題呢

少數代碼編輯作業您可以將您的播放器,相機或世界上圍繞您需要的軸線的任何東西。你只需要瞭解基本的向量運算,所以我建議你去低谷他們

最後一個音符:

必須繞X軸首先是因爲中心繞Y旋轉的變化,這將需要你的本地X軸重新計算(正確的矢量)。

+0

我無法在'Camera'類中找到'updateRotation'函數。它是什麼? – Nolesh