2015-04-02 77 views
1

我有一個非常簡單的模型,可以在x和y方向上移動,而海洋滾動讓飛機看起來像飛機飛行。每當飛機移動時,我都會調整它的俯仰和俯仰。Unity v。4:旋轉導致跳躍

我計算並保持對象腳本內的位置,滾動和俯仰。每一個更新步驟我都將它們重新分配給對象的Unity屬性。

問題來了,我試圖添加桶滾動效果。此代碼工作正常:

transform.Translate(position - transform.position); 

    Vector3 rotChange = new Vector3 (-pitch, 0, -roll) -     
        transform.rotation.eulerAngles; 

    transform.Rotate (rotChange); 

只要我保持在+ - 30度內的所有旋轉。當飛機正在做桶滾,它更新與下面的每一步:

velocity = new Vector3 (barrelRollDirections.x * barrelRollXSpeed,   
       barrelRollDirections.y * barrelRollYSpeed, 0); 

    roll += barrelRollTurnSpeed * Time.deltaTime; 
    if (roll < -(fullRotation/2)) { 
     roll += fullRotation; 
    } 
    if (roll > (fullRotation/2)) { 
     roll -= fullRotation; 
    } 

有趣的是,圍繞旋轉的飛機實際工作正常,如果飛機沒有沿x或y軸移動時我這樣做。但如果是這樣的話,它會跳到所有地方,並且只有在滾動結束後纔會重新出現在適當的最終位置。

我嘗試了許多方法來解決這個問題:

- 轉換我期望的方向使用Quaternion.Euler和分配直接到transform.rotate四元數。這並沒有解決任何問題,也導致飛機在運動範圍內抖動和抖動。

- 將平面的初始方向保存在四元數中,然後每更新一次,將初始旋轉重新分配給平面,然後調用Transform.Rotate(new Vector3(-pitch,0,-roll))。我認爲這會解決我的問題,如果它是像萬向節鎖那樣的話,那麼我就會每走一步,就應用小於180度的旋轉。但沒有骰子。

回答

0

編輯:我找到了!在提出這個問題之後,我想我會去等待一個答案,然後去研究不同的對象。在那裏,我發現transform.Translate函數根據它們的旋轉將對象在不同的​​方向上移動。當我改變只是重新分配的立場,它運作良好。按照慣例,與其他人交談的行爲有助於解決問題。

+0

(很抱歉的隨機回覆要關閉請原諒!) 按[文檔](https://docs.unity3d.com/ScriptReference/Transform.Translate.html): '公共無效翻譯(Vector3 translation,Space relativeTo = Space.Self);' 所以如果你沒有指定'Space.World',它會假設你正在嘗試在本地空間進行翻譯。 – Guest 2017-12-07 00:02:05