亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Vector3 中的 eulerAngles 導致奇怪的旋轉

Vector3 中的 eulerAngles 導致奇怪的旋轉

C#
瀟瀟雨雨 2022-06-12 11:19:57
我正在嘗試更改相機旋轉的 eulerAngle X,同時將 y 和 z 保持為 0。但是,以下 IEnumerator 會產生奇怪的 eulerAngles,例如 10、-74.653、0。我不明白 y 值如何在以下函數中發生變化:private IEnumerator LerpCameraNormalRot(){    float duration = 0.5f;    for (float t = 0f; t < duration; t += Time.deltaTime)    {        float f = Mathf.Lerp(camera.transform.eulerAngles.x, 10, t / duration);        Vector3 vNew = new Vector3(f, 0, 0);        camera.transform.eulerAngles = vNew;        yield return 0;    }}這不是很奇怪嗎?我從不改變 Y 和 Z 值!我只想將 X 旋轉 (eulerAngle.x) 從其當前值更改為 10。感謝您的幫助!
查看完整描述

2 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

您正在設置,eulerAngles但這將導致localEulerAngles圖像中的紅色框表示的不同。如果對象有任何旋轉的祖先,它們可能不匹配!


要解決您的直接問題,您可以使用localEulerAngles代替eulerAngles:


float f = Mathf.Lerp(camera.transform.localEulerAngles.x, 10, t / duration);

Vector3 vNew = new Vector3(f, 0, 0);

camera.transform.localEulerAngles= vNew;

這樣做的問題是它沒有考慮從 359 度到 0 度的能力。更好的是使用Quaternion.Euler和Quaternion.Slerp使用四元數而不是歐拉角:


private IEnumerator LerpCameraNormalRot()

{

    float duration = 0.5f;

    Quaternion startRotation = camera.transform.localRotation;

    Quaternion goalRotation = Quaternion.Euler(10f, 0f, 0f);


    for (float t = 0f; t < duration; t += Time.deltaTime)

    {   

        camera.transform.localRotation = Quaternion.Slerp(startRotation, goalRotation, t/duration);

        yield return 0;

    }


    camera.transform.localRotation = goalRotation;

}


查看完整回答
反對 回復 2022-06-12
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

unity使用旋轉、位置、eulerAngles等兩種表示

  • 一個在世界空間

  • 另一個在本地空間

不包括local在其名稱中的值在世界空間中。如果您的對象比任何被旋轉/縮放/平移的父對象具有,您將看不到您在 Unity 中設置的值,因為Transform檢查器顯示本地坐標。

如果要將local坐標設置為精確值,請改用localPosition,localRotationlocalEulerAngles

對我來說,您似乎想x在 0.5 秒內將相機圍繞其局部軸旋轉 10°。

所以我認為你可以改為這樣做

private IEnumerator LerpCameraNormalRot()

{

    float duration = 0.5f;


    float initialRotationX = camera.transform.localEulerAngles.x;

    float targetRotationX = 10;


    for (float t = 0f; t < duration; t += Time.deltaTime)

    {

        float currentX = Mathf.Lerp(initialRotationX, targetRotationX, t / duration);


        camera.transform.localEulerAngles = new Vector3(currentX , 0, 0);


        // Which would be the same as using 

        // camera.transform.localRotation = Quaternion.Euler(new Vector3(currentX, 0, 0));


        yield return null;

    }


    // to be sure you have no overshooting you could set the target rotation fix here as well

    camera.transform.localEulerAngles = new Vector3(targetRotation, 0 ,0);


    // or

    // camera.transform.localRotation = Quaternion.Euler(new Vector3(targetRotation, 0, 0));


查看完整回答
反對 回復 2022-06-12
  • 2 回答
  • 0 關注
  • 260 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號