Unity3d中Quaternion.SetFromToRotation和Quaternion.FromToRotation

1、基本语法:public void SetFromToRotation(Vector3 fromDirection, Vector3 toDirection);

功能说明:此方法用于创建一个从fromDirection到toDirection的rotation。例如,设有以下代码:

Quaternion q1 = Quaternion.identity;

q1.SetFromToRotation(v1,v2);

transform.rotation = q1;

则相当于将GameObject对象进行如下变换:首先将GameObject对象自身坐标系的x、y、z轴方向和世界坐标系的x、y、z轴方向一致,然后将GameObject对象自身坐标系中向量v1指向的方向旋转到v2方向。

提示:不可直接使用transform.rotation.SetFromToRotation(v1,v2)方式进行设置,只能将实例化的Quaternion赋值给transform.rotation。

using UnityEngine;
using System.Collections;
 
public class SetFromToRotation_ts : MonoBehaviour {
    
    
    public Transform A, B, C;
    Quaternion q1 = Quaternion.identity;
	
	void Update () {
    
    
        //不可直接使用C.rotation.SetFromToRotation(A.position,B.position);
        q1.SetFromToRotation(A.position,B.position);
        C.rotation = q1;
		//在Scene面板中绘制直线
        Debug.DrawLine(Vector3.zero,A.position,Color.red);
        Debug.DrawLine(Vector3.zero, B.position, Color.green);
        Debug.DrawLine(C.position, C.position+new Vector3(0.0f,1.0f,0.0f), Color.black);
        Debug.DrawLine(C.position, C.TransformPoint(Vector3.up*1.5f), Color.yellow);
	}
}

在这段代码中,首先声明了三个GameObject类型的变量A、B和C,然后在Update方法中对q1调用方法SetFromToRotation,并将改变后的q1赋给C.rotation,注意不可直接使用C.rotation.SetFromToRotation(A.position,B.position)来设置C的rotation。最后在Scene场景中绘制直线以便更好的观察。请读者自行运行程序在Scene视图中查看,在程序运行时可以试着更改A或B的位置查看物体C的状态变化。

2、 FromToRotation方法:Quaternion变换
基本语法:public staticQuaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);

功能说明:此方法用来创建一个从参数fromDirection到toDirection的Quaternion变换。此方法功能和实例方法SetFromToRotation (fromDirection : Vector3, toDirection : Vector3)相同,只是用法上有些不同,请参考实例演示。

using UnityEngine;
using System.Collections;
 
public class FromToRotation_ts : MonoBehaviour
{
    
    
    public Transform A, B, C, D;
    Quaternion q1 = Quaternion.identity;
 
    void Update()
    {
    
    
        //使用实例方法
        //不可直接使用C.rotation.SetFromToRotation(A.position,B.position);
        q1.SetFromToRotation(A.position, B.position);
        C.rotation = q1;
        //使用类方法
        D.rotation = Quaternion.FromToRotation(A.position, B.position);
        //在Scene视图中绘制直线
        Debug.DrawLine(Vector3.zero, A.position, Color.white);
        Debug.DrawLine(Vector3.zero, B.position, Color.white);
        Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f), Color.white);
        Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 1.5f), Color.white);
        Debug.DrawLine(D.position, D.position + new Vector3(0.0f, 1.0f, 0.0f), Color.white);
        Debug.DrawLine(D.position, D.TransformPoint(Vector3.up * 1.5f), Color.white);
    }
}

在这段代码中,首先声明了4个Transform变量用于指向场景中不同的对象,然后在Update方法中调用方法SetFromToRotation使得C的旋转角度与向量A和B之间的夹角相同,接着使用方法FromToRotation使得D的旋转角度与向量A和B之间的夹角相同,如图8-7所示。请读者自行运行程序在Scene视图而非Game视图中查看。程序运行时可以在Scene视图中试着拖动A或B的位置观察C和D的变化。

猜你喜欢

转载自blog.csdn.net/qq_22975451/article/details/114392922
今日推荐