2013-10-28 61 views
0

我在世界X,Z軸上有一塊板。 我有一臺相機可以旋轉以向下或向上看,並使用世界Y軸從左到右旋轉。在X,Z平面上使用相對於攝像機方向的可變軸進行平移

這裏的攝像頭旋轉代碼:

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod; 
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World); 

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod; 
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self); 

使用鼠標鍵和鼠標位置輸入(拖動&丟棄)我的相機在世界翻譯。它會收到一個2D矢量,其中包含鼠標的X和Y值(拖放&)操作。下面是我使用的方法的代碼:

private void CameraOnPlaneTranslation(Vector2 myVector) 
{ 

    float cameraYPos = Camera.main.transform.position.y; 

    Camera.main.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1])); 

    Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z); 
} 

問題:當我的相機不是直接面向朝Z軸(0.0F,Z,0.0F)我計算平移向量不正確。我需要改變矢量的Y值,以便相機不會在世界Y軸上移動。

感謝

+1

你的問題中有一些模糊之處,你不太可能得到答案,直到你問題更清楚。通過「拖放」,你真的意思是「鼠標移動,而左鍵按下」?在第二段中,當你說「我的問題是」時,你的意思是你的問題陳述(你希望它的工作方式),或者「譯文長度改變但它不應該」? Vector2 myVector從哪裏來?它是否在mouseMove eventHandler中被調用?這也是從其他屏幕點減少鼠標移動屏幕DeltaX,DeltaY嗎? – philologon

+0

通過「拖放」,你真的意思是「鼠標移動,而左鍵按下」? - >是< - 在第二段中,當你說「我的問題是」你的意思是你的問題的陳述(你怎麼想它的工作) - >我的意思是相同的鼠標拖放移動不會根據相機方向轉換相同距離的相機。< - Vector2 myVector從哪裏來? - >它來自拖放方法,它返回鼠標在x軸和y軸上的距離。所以基本上我創建了一個具有這些值的新矢量3並用它來移動相機。< - – user2917126

+0

謝謝。基於此,我認爲我的答案適用。我預計Translate方法會爲您更新相機位置值,因此請將此調用消除到Camera.main.transform.position = – philologon

回答

0

我已經解決了這個問題,方法是添加另一個只受相機右/左旋轉(世界向上)和相機轉換影響的GameObject。

在清醒方法

cameraOrientation = new GameObject("cameraOrientation"); 
cameraOrientation.transform.position = Camera.main.transform.position; 
cameraOrientation.transform.localEulerAngles = new Vector3(0.0f, Camera.main.transform.localEulerAngles.y, 0.0f); 

在旋轉法

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod; 
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World); 
cameraOrientation.transform.Rotate(0.0f, angle, 0.0f, Space.World); 

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod; 
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self); 

最後的翻譯方法

cameraOrientation.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1])); 
Camera.main.transform.position = cameraOrientation.transform.position; 
1

我不熟悉的團結,但假設它類似於在這些問題上的其他3D系統,我會嘗試回答,希望不爲難自己。

它看起來像你/翻譯/相機位置,然後立即/設置/相機位置,從而覆蓋翻譯完成的工作。如果是這種情況,您應該嘗試設置camera.main.transform.position一次(在創建相機後在線中)。然後通過翻譯調用僅應用myVector(如您所知)。因此,您應該消除該方法的第三行Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);

嘗試此操作後,如果它仍然沒有達到您的預期,請查看是否需要您更新視圖或刷新或ApplyTransform。 。 。任何能夠讓你理解你已經完成了改變的東西,你已經準備好再次使用更新後的轉換進行處理。

+0

我需要在翻譯之前獲取凸輪的y位置並將其重新定位到之前的值,以便相機不會在世界Y值上移動。這就是.transform.positon的用法... 當我重新定位相機時,我失去了一些平移向量的長度。 這意味着我實際使用的平移矢量是不正確的,因爲我希望它平行於板的X,Z平面。 – user2917126

+0

當你說「所以相機不能在世界Y值上移動」時,我的意思有點麻煩。您是否打算將相機圍繞距相機位置固定距離的一個點旋轉一圈?如果你不是在一個圓圈內移動,並且發送transform.Y = 0.0f,那麼在Y中移動攝像機的是什麼? (注意:美國東部時間美國東部時間上午8點前,我將無法回覆。) – philologon

+0

好的,我將重新制定。 我有一個使用X,Z世界軸的2D板。 我有一臺相機可以在任何方向旋轉,只要它對準主板 - > float angle =(mouseX_Current - mouseX_ActionStart)* camRotationSpeedMod; Camera.main.transform.Rotate(0.0f,angle,0.0f,Space.World); - > angle =(mouseY_Current - mouseY_ActionStart)* camRotationSpeedMod; - > Camera.main.transform.Rotate(angle,0.0f,0.0f,Space.Self); 你有翻譯代碼。 我希望這個澄清幫助 – user2917126

相關問題