Unity3d中Quaternion.SetFromToRotation和Quaternion.FromToRotation方法解析

8.2.1 SetFromToRotation方法:创建rotation实例

基本语法:public voidSetFromToRotation(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。

实例演示:下面通过实例演示方法SetFromToRotation的使用。

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的状态变化。图8-1是一张运行时截图及注释:



8.3.4 FromToRotation方法:Quaternion变换

基本语法:public staticQuaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);

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

实例演示:下面通过实例演示方法FromToRotation的使用。

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的变化。


本文章摘自图书《Unity API解析》,源码下载地址:http://www.ituring.com.cn/book/1474

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值