quaternion*Vector3的新理解

星塵發表於2013-08-16
using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {
    
    public GameObject cameraObject;
    public float cameraDistance;//the distance the camera should be palced from the palyer
    public float cameraHeight;//how heigh the camera should be
    private float cameraAngleToPlayer;// the current angle the camera is to the palyer
    private Vector3 tempVector; // the temporary vector we shall use for calcuations
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        tempVector = Vector3.left;
        if(Input.GetKey ("left")) //rotation the angle based on input
        {
            cameraAngleToPlayer = cameraAngleToPlayer - (Time.deltaTime * 50f);
        }else if(Input.GetKey("right")){
            cameraAngleToPlayer = cameraAngleToPlayer +(Time.deltaTime *50f);
        }
        Debug.Log("Quaternion:"+Quaternion.AngleAxis(90f,Vector3.up)+";tempVector:"+tempVector);
        
        tempVector = Quaternion.AngleAxis(cameraAngleToPlayer,Vector3.up)*tempVector;//We are now rotating the Vector around the vertical(y) axis by an angle specificed in the variable 'cameraAngleToPlayer'
        Debug.Log("tempVector after calculate:"+tempVector);
        Debug.DrawLine(transform.position,tempVector*10f,Color.yellow);
        cameraObject.transform.position = transform.position + (tempVector.normalized * cameraDistance) + new Vector3(0,cameraHeight,0);
        cameraObject.transform.rotation = Quaternion.LookRotation(transform.position - cameraObject.transform.position);
    }    
}
以上是繞cube旋轉攝像機的示例程式碼,這段程式碼拖到cube上。
Quaternion*Vector3的幾何意義

例如

Quaternion.AngleAxis(90f,Vector3.up)*Vector3.left

Quaternion:(0.0, 0.7, 0.0, 0.7);Vector3.left:(-1.0, 0.0, 0.0)

calculated:(0.0, 0.0, 1.0)

這樣我們得到了從(-1.0, 0.0, 0.0)繞y軸旋轉90°的新座標。

相關文章