Unity 点击模型上任意位置,模型旋转,点击位置朝向摄像机

Unity 点击模型上任意位置,模型旋转至点击位置朝向摄像机

先看效果
立方体
Unity 点击模型上任意位置,模型旋转,点击位置朝向摄像机_第1张图片

Unity 点击模型上任意位置,模型旋转,点击位置朝向摄像机_第2张图片

球体
Unity 点击模型上任意位置,模型旋转,点击位置朝向摄像机_第3张图片

Unity 点击模型上任意位置,模型旋转,点击位置朝向摄像机_第4张图片

//首先利用射线获取点击模型上点的坐标(使用摄像,模型上要有 Collider组件,否则射线检测不到),然后计算模型上该点朝向摄像机时,模型的 rotation
//新建 RotationTo.cs 脚本,将该脚本挂载到需要旋转的对象上,运行点击模型,即可看到效果。代码如下


using UnityEngine;
using System.Collections;

public class RotationTo : MonoBehaviour {

    private Transform tr;
    private Quaternion finalQuaternion = Quaternion.identity;
    // Use this for initialization
    void Start () {
        tr = transform;
    }

    // Update is called once per frame
    void Update () {

        if (Input.GetMouseButtonDown(0))
        {
            GetTheClickPoint();
        }

        // 使用差值函数平滑的旋转到最终朝向
        tr.rotation = Quaternion.Lerp(tr.rotation, finalQuaternion, 0.1f);
    }

    // 获取点中球面上点坐标
    private void GetTheClickPoint()
    {
        //实例一个从主摄像机到鼠标点击位置的射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;


        //发射射线,如果射线碰撞到带有 Collider 组件的对象将返回 true,否则返回 false
        if (Physics.Raycast( ray, out hitInfo))
        {
            // hitInfo.point 为射线和球面碰撞点坐标(鼠标点击球面坐标)
            finalQuaternion = CalculateRotation(hitInfo.point);
        }
    }

    //计算球面上点 hitPoint 朝向主摄像机时球的 rotation
    private Quaternion CalculateRotation(Vector3 hitPoint)
    {
        // 获取球心到点击球面点的向量
        Vector3 v1 = hitPoint - tr.position;

        // 获取球心到主摄像机的向量
        Vector3 v2 = Camera.main.transform.position - tr.position;

        // 球进行旋转即是以通过球心且和 v1、v2 组成界面垂直的向量(法向量)为旋转轴
        // v1 和 v2 叉乘,获取 v1、v2 组成界面的法向量
        Vector3 cross = Vector3.Cross(v1, v2);

        // 球绕旋转轴旋转的角度为 v1 和 v2 的夹角
        // 获取向量 v1、v2 的夹角
        float angle = Vector3.Angle(v1, v2);

        //获取球以 cross 为旋转轴 旋转angle 角度的 四元数
        Quaternion quaternion = Quaternion.AngleAxis(angle, cross);

        // 这样错误, 必须要 quaternion 左乘 tr.rotation
        //return tr.rotation * quaternion;
        return quaternion * tr.rotation;
    }

}

你可能感兴趣的:(Unity)