《向量》Unity 中自己实现Vector3.Angle函数

先忽略所有的不合理条件。

Vector3 dir = Vector3.Cross(v1,v2);
float self_angle = Mathf.Atan2(dir.magnitude,Vector3.Dot(v1,v2))*Mathf.Rad2Deg;

这个就是Vector3.Angle的实现方法。
解释一下:首先v1,v2都是方向向量,所以绝对值都是1,叉乘的结果值的长度就是sin角度,同理点乘结果值的长度就是cos角度,atan2(y,x)的含义又是y/x 值的tan的弧度值,在转化成角度就是了。

根据左手定则,这样求出来的角度,顺时针是正的,逆时针是负的,可以转化一下公式,变成:

 float self_angle = Mathf.Atan2(Vector3.Dot(transform.up,dir),Vector3.Dot(v1,v2));
 self_angle *= Mathf.Rad2Deg;

求sin角度的时候顺便点乘一个自身的up向量,这样计算出来的角度值就是按局部的up方向向量的范围来求出的了,例如up向量是完全向下的,这样的角度就是逆时针是正的,顺时针是负的。

请添加图片描述
在旋转的时候,有可能角色的up向量和世界的不一样,up有偏移a角度,同时推测在世界up上的长度就是sin角度*cosa角度,就是dot(y,y`)*sin角度。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JustEasyCode

谢谢您

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

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

打赏作者

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

抵扣说明:

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

余额充值