《Quaternion》自己实现Quaternion里面的FromToRotation功能

本文详细解析了Unity中实现从一个向量到另一个向量的旋转算法,通过Quaternion.FromToRotation方法,介绍了如何处理不同向量间的旋转问题,包括平行向量的特殊情况,并给出了一段具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看代码。

   /// <summary>
        /// Handles smaller values better than Unity's version.
        /// </summary>
        /// <param name="u"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public static Quaternion FromToRotation(Vector3 u, Vector3 v)
        {
            float lTheta = Vector3.Dot(u.normalized, v.normalized);

            if (lTheta >= 1f)
            {
                return Quaternion.identity;
            } 
            else if (lTheta <= -1f) // 180度反向,没办法和v确定一个平面求法线 sin180 = 0
            {
                Vector3 lSimpleAxis = Vector3.Cross(u,  Vector3.right);  // 不需要u.normalized 因为需要的只是一个旋转轴的方向而已
                if (lSimpleAxis.sqrMagnitude == 0f) { lSimpleAxis = Vector3.Cross(u, Vector3.up); }

                return Quaternion.AngleAxis(180f, lSimpleAxis);
            }

            float lRadians = Mathf.Acos(lTheta); // 返回值是弧度
            Vector3 lAxis = Vector3.Cross(u, v); // 叉乘左手坐标系判断一下,可以保证正值的角度一定是让u旋转到v的

            return Quaternion.AngleAxis(lRadians * Mathf.Rad2Deg, lAxis);
        }

先判断平行的两种可能,平行没判断叉乘出垂直轴来。
之后叉乘出垂直轴利用Quaternion的AngleAxis方法求出一个旋转返回。

@ 关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值