Unity 点乘和叉乘的原理和使用

Unity 点乘和叉乘的原理和使用Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最常用的点乘和叉乘的使用。点乘 (又称”点积”,”数量积”,”内积”)(DotProduct,用*)定义:a·b=|a|·|b|cos【注:粗体小写字母表示向量,表示向量a,b的夹角,取值范围为[0,180]】几何意义:是一条边向另一条边的投影乘以另一条边的长度.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最常用的点乘和叉乘的使用。

点乘 

(又称”点积”,”数量积”,”内积”)(Dot Product, 用*)

定义:a·b=|a|·|b|cos<a,b> 【注:粗体小写字母表示向量,<a,b>表示向量a,b的夹角,取值范围为[0,180]】

几何意义:是一条边向另一条边的投影乘以另一条边的长度.

Unity 点乘和叉乘的原理和使用

v1v2向量的点乘运算:相应元素的乘积的和:v1( x1, y1,z1) * v2(x2, y2,z2) = x1*x2 + y1*y2+z1*z2;

注意 : 结果不是一个向量,而是一个标量。

性质1: a*b = |a||b|Cos(θ) θ是向量a 和向量 b之间的夹角。

性质2: a*b = b*a  满足乘法交换律

Unity项目应用:

1.根据点乘计算两个向量的夹角。<a,b>= arccos(a·b / (|a|·|b|))

2.根据点乘的正负值,得到夹角大小范围,>0,则夹角(0,90)<0,则夹角(90,180),可以利用这点判断一个多边形是面向摄像机还是背向摄像机。

3.根据点乘的大小,得到向量的投影长度,反应了向量的长度关系。

4.在生产生活中,点积同样应用广泛。利用点积可判断一个多边形是否面向摄像机还是背向摄像机。向量的点积与它们夹角的余弦成正比,因此在聚光灯的效果计算中,可以根据点积来得到光照效果,如果点积越大,说明夹角越小,则物理离光照的轴线越近,光照越强。物理中,点积可以用来计算合力和功。若b为单位矢量,则点积即为a在方向b的投影,即给出了力在这个方向上的分解。功即是力和位移的点积。计算机图形学常用来进行方向性判断,如两矢量点积大于0,则它们的方向朝向相近;如果小于0,则方向相反。矢量内积是人工智能领域中的神经网络技术的数学基础之一,此方法还被用于动画渲染(Animation-Rendering)。

叉乘

(又称”叉积”,”向量积”,”外积”)(cross product,用x)

定义:c = a x b,其中a b c均为向量

几何意义是:得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积

v1v2向量的叉乘运算:相应元素的乘积的和:v1( x1, y1,z1) x v2(x2, y2, z2) = (y1*z2 – y2*z1)i+(x2*z1 – x1*z2)j+(x1*y2-x2*y1)k;

利用三阶行列式计算

|i    j   k|

|x1 y1  z1|

|x2  y2  z2|

性质1:c⊥a,c⊥b,即向量c与向量a,b所在平面垂直

性质2:模长|c| = |a||b| sin<a,b>

性质3:(数学上)满足右手法则, a x b = -b x a,所以我们可以使用叉乘的正负值来判断a,b的相对位置,即b是处于a的顺时针还是逆时针方向。

叉乘的右手定则是用来确定叉乘积的方向的。

右手法则:右手的四指方向指向第一个矢量,屈向叉乘矢量的夹角方向(两个矢量夹角方向取小于180°的方向),那么此时大拇指方向就是叉乘所得的叉乘矢量的方向.(大拇指应与食指成九十度)(注意:Unity当中使用左手,因为Unity使用的是左手坐标系)

Unity 点乘和叉乘的原理和使用

数学上叉乘的右手法则

Unity 点乘和叉乘的原理和使用

Unity当中叉乘的左手法则


Unity项目应用:

1.根据叉乘得到a,b向量的相对位置,和顺时针或逆时针方位。

简单的说: 点乘判断角度,叉乘判断方向。 
形象的说: 当一个敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

2.得到a,b夹角的正弦值,计算向量的夹角(0,90),可以配合点乘和Angle方法计算出含正负的方向。

3.根据叉乘大小,得到a,b向量所形成的平行四边形的面积大小,根据面积大小得到向量的相对大小。



下面是代码

using UnityEngine; public class VectorExample : MonoBehaviour { //点积 private void TestDot(Vector3 a, Vector3 b) { // 计算 a、b 点积结果 float result = Vector3.Dot(a, b); // 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180] float angle = Vector3.Angle(a, b); // 计算 a、b 单位向量的点积,得到夹角余弦值,|a.normalized|*|b.normalized|=1; result = Vector3.Dot(a.normalized, b.normalized); // 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度) float radians = Mathf.Acos(result); // 将弧度转换为 角度 angle = radians * Mathf.Rad2Deg; } //叉乘 private void TestCross(Vector3 a, Vector3 b) { //计算向量 a、b 的叉积,结果为 向量 Vector3 c = Vector3.Cross(a, b); // 通过反正弦函数获取向量 a、b 夹角(默认为弧度) float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))); float angle = radians * Mathf.Rad2Deg; // 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面, //下面以X、Z轴组成的平面为例 , (Y 轴为纵轴), // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向, if (c.y > 0) { // b 在 a 的顺时针方向 } else if (c.y == 0) { // b 和 a 方向相同(平行) } else { // b 在 a 的逆时针方向 } } // 获取两个向量的夹角 Vector3.Angle 只能返回 [0, 180] 的值 // 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80) // 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角 private void GetAngle(Vector3 a, Vector3 b) { Vector3 c = Vector3.Cross(a, b); float angle = Vector3.Angle(a, b); // b 到 a 的夹角 float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized))); float signed_angle = angle * sign; Debug.Log("b -> a :" + signed_angle); // a 到 b 的夹角 sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized))); signed_angle = angle * sign; Debug.Log("a -> b :" + signed_angle); } } 

Jetbrains全家桶1年46,售后保障稳定

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203719.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 发送邮件常见出错代码及简单解决方法

    发送邮件常见出错代码及简单解决方法

    2021年10月7日
    37
  • 初等数论–二次剩余与二次同余方程–二次互反律「建议收藏」

    初等数论–二次剩余与二次同余方程–二次互反律「建议收藏」信息安全数学基础–二次剩余与二次同余方程–雅可比符号Jacobisymbol博主是初学信息安全数学基础(整除+同余+原根+群环域),本意是想整理一些较难理解的定理、算法,加深记忆也方便日后查找;如果有错,欢迎指正。…

    2025年7月13日
    2
  • 后台管理系统 – 页面布局设计

    后台管理系统 – 页面布局设计前端的中后台管理系统相比于其他普通项目,从开发设计的角度来说有几点比较特殊:一个是权限设计,具体实现可参考:传送门。一个是页面布局的设计,也是本文要说的。一个好的页面布局设计,无论是对于页面布局的稳定性,还是系统功能拓展的方便性,亦或是用户体验上,都有着重要的提升作用。一、市面参考先来看看市面上的一些优秀的开源系统项目的页面布局。1、vue-element-adminvue-element-admin是vue框架的一个优秀的后台管理系统开源项目,目前star数75k,也是我入行前端的启

    2025年10月26日
    5
  • [哎]关于ftp扫描工具的激活成功教程问题[通俗易懂]

    [哎]关于ftp扫描工具的激活成功教程问题[通俗易懂]先前发布过一个工具,用于ftp弱口令扫描 文章地址:http://blog.csdn.net/prsniper/article/details/6101770 当时为了吸引一些反汇编方面的高手交流,故意把DLL使用期限限制在2010年,可惜没人鸟我~~~~~~~~~

    2022年10月1日
    2
  • Ubuntu下插入网线无法联网的问题

    Ubuntu下插入网线无法联网的问题今天把以前的服务器搬出来,准备训练一个深度学习模型,然而,在联网的过程中,出现一个问题:就是插入网线后无法联网。想到以前配置过翻墙,就把相关的配置文件如.bashrc,/etc/profile,等相关文件进行了修改,屏蔽掉以前的翻墙代理设置,然而还是无法联网。后面想到以前是用拨号INodeClient来连接上网的,就把与InodeClient相关的配置注释掉,然而还是无法上网。后面在网上找到一个解决方案:参考网址https://blog.csdn.net/zhu334974857/articl.

    2022年6月26日
    92
  • nginx跨域访问配置_cors跨域访问不了

    nginx跨域访问配置_cors跨域访问不了跨域概念简单来说:两个url只要协议、域名、端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题。案例例如:在开发前后端完全分离的系统中,服务端代码属于一个工程,前端代码属于另一个工程,前端开发人员在进行接口对接时,可能会在webstorm等工具进行编码,并用webstorm的内置服务器进行调试,这就会有跨域问题,因为,webstorm内置服务器默认前缀部分是http://localhost:63342/,而服务端接口的路径前缀部分一定不会是这样,这样便产生了跨域访问的问题。案例代码

    2022年10月1日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号