ユニティベクトル回転は、点に従って実施しました

回転のA、団結

あなたが最終的な結果を見つけることができますオブジェクトの回転の直接の割り当ては、あなたが望む結果ではないかどうかを知ることがまず最初は、回転で回転四元ユニティで使用されており、今回は回転させるようにクォータニオンの助けに行く必要があります。

第二には、元のベクトルに回転します

Unityはビルトイン方式Quaternion.AngleAxis(フロート角のVector3軸)を使用し
、最初の引数は、我々が0よりも回転角以上の角を必要とするということである時計方向に回転され、回転角度は、反時計方向に応じて0以上でありますここでは回転の回転の座標原点。
第2のパラメータは、一つの軸の周りを回転する回転軸です。

注:今度は自身のベクトルは、*四元Unityは、コンパイルエラーで発生した場合は、この方法を用いて得られる四元数は、我々はのVector3はその座標(四元*ベクター自体、乗算され、ベクトルに変換しますここで注意すべき)
ケース:回転45の起源に応じするVector3(1,0,1)°、90°、180°、270°、それぞれ試験黒、黄、青、緑の色が表します

ここに画像を挿入説明
コードは以下の通りであります:

using UnityEngine;

[ExecuteInEditMode]
public class VectorDirTest : MonoBehaviour {

	// Update is called once per frame
	void Update () {
        Debug.DrawLine(Vector3.left * 5f,Vector3.right * 5f,Color.red);
        Debug.DrawLine(Vector3.up * 5f,Vector3.down * 5f,Color.green);
        Debug.DrawLine(Vector3.forward * 5f,Vector3.back * 5f,Color.blue);

       
        Vector3 dir = new Vector3(1,0,1);
        Debug.DrawLine(Vector3.zero,dir,Color.white);

        Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(45,Vector3.up) * dir,Color.black);

        Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(90,Vector3.up) * dir,Color.yellow);

        Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(180,Vector3.up) * dir,Color.blue);

        Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(270,Vector3.up) * dir,Color.green);

    }
}

第三に、所定の回転位置ベクトルに従って


    /// <summary>
    /// 围绕某点旋转指定角度
    /// </summary>
    /// <param name="position">自身坐标</param>
    /// <param name="center">旋转中心</param>
    /// <param name="axis">围绕旋转轴</param>
    /// <param name="angle">旋转角度</param>
    /// <returns></returns>
    public Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
    {
        return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
    }
ケース:、赤、黄、青で試験した°のVector3(1,0,1)(2,0,2)は、ベクトル45に回転させる°、90°、180°、270、緑色が表します

ここに画像を挿入説明

コードは以下の通りであります:

using UnityEngine;

[ExecuteInEditMode]
public class VectorDirTest : MonoBehaviour {



	
	// Update is called once per frame
	void Update () {
        Debug.DrawLine(Vector3.left * 5f,Vector3.right * 5f,Color.red);
        Debug.DrawLine(Vector3.up * 5f,Vector3.down * 5f,Color.green);
        Debug.DrawLine(Vector3.forward * 5f,Vector3.back * 5f,Color.blue);

        Vector3 dir = new Vector3(1,0,1);
        Vector3 point = new Vector3(2,0,2);

        Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 45), Color.red);
        Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 90), Color.yellow);
        Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 180), Color.blue);
        Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 270), Color.green);
        Debug.DrawLine(Vector3.zero, dir, Color.black);

        
    }

    

    /// <summary>
    /// 围绕某点旋转指定角度
    /// </summary>
    /// <param name="position">自身坐标</param>
    /// <param name="center">旋转中心</param>
    /// <param name="axis">围绕旋转轴</param>
    /// <param name="angle">旋转角度</param>
    /// <returns></returns>
    public Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
    {
        return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
    }
}

公開された62元の記事 ウォンの賞賛5 ビュー3898

おすすめ

転載: blog.csdn.net/qq_42194657/article/details/104019679