首页 > 其他分享 >unity3d————叉乘的知识点

unity3d————叉乘的知识点

时间:2024-11-05 13:15:27浏览次数:3  
标签:知识点 顺序 结果 Vector3 unity3d Cross position 向量

一、向量叉乘的知识点

  1. 定义与公式

    • 向量叉乘的定义为:对于两个三维向量a和b,它们的叉乘结果是一个向量c,记为c=a×b。
    • 叉乘的计算公式为:c=(y1z2-y2z1)i+(x2z1-x1z2)j+(x1y2-x2y1)k,其中a=(x1, y1, z1),b=(x2, y2, z2),i、j、k分别为x、y、z轴的单位向量。
  2. 几何意义

    • 叉乘得到的向量c与向量a和b都垂直,即c⊥a且c⊥b。
    • 叉乘结果向量c的方向遵循右手定则(在Unity中为左手定则):将右手四指从向量a转向向量b,拇指的指向即为向量c的方向。
    • 叉乘结果向量c的模长等于向量a和b的模长与它们之间夹角的正弦值的乘积,即|c|=|a|×|b|×sinθ。
  3. 性质

    • 叉乘不满足交换律,即a×b≠b×a,而是a×b=-(b×a)。
    • 叉乘满足加法的分配律,即a×(b+c)=a×b+a×c。
    • 叉乘结果是一个向量,而不是标量。

点乘(Dot Product)
点乘的顺序是可以互换的。即,对于任意两个向量AB,有A · B = B · A。点乘的结果是一个标量(scalar),表示两个向量之间的夹角余弦值乘以它们的模的乘积。由于余弦函数是对称的,所以点乘也是对称的。

叉乘(Cross Product)
叉乘的顺序则不能互换。对于向量ABA × BB × A的结果是不同的。实际上,A × BB × A是互为相反向量,即A × B = -(B × A)。叉乘的结果是一个向量(vector),这个向量垂直于原两个向量所构成的平面,并且其方向由右手定则决定。

因此,在使用叉乘时,必须注意向量的顺序,因为顺序的不同会导致结果向量的方向相反。而在使用点乘时,则不需要担心向量的顺序问题。

一、相关API

在Unity3D中,叉乘运算可以通过Vector3.Cross方法来实现。该方法的签名如下:

public static Vector3 Cross(Vector3 lhs, Vector3 rhs);

其中,lhsrhs是需要进行叉乘的两个向量,返回结果是它们的叉乘向量。

三、使用场景

  1. 计算法向量:在3D图形学中,叉乘常用于计算表面的法向量。例如,给定两个不共线的表面向量,可以通过叉乘得到它们的法向量,这在光照计算中非常重要。
  2. 确定旋转轴:在旋转操作中,叉乘可以用于确定旋转轴。例如,计算物体从当前方向向量旋转到目标方向向量所需的旋转轴。
  3. 碰撞检测:在碰撞检测中,叉乘可以用于计算碰撞法线和碰撞响应的方向。
  4. 判断左右方位:通过叉乘的结果,可以判断一个物体相对于另一个物体的左右方位。例如,在游戏中判断敌人位于玩家的左侧还是右侧。

四、注意事项

  1. 向量顺序:叉乘的结果依赖于向量的顺序。即A × BB × A的结果方向相反。因此,在使用叉乘时,必须注意向量的顺序。
  2. 零向量:任何向量与零向量进行叉乘的结果都是零向量。因此,在进行叉乘运算前,应确保参与运算的向量不是零向量。
  3. 共线向量:如果两个向量共线(即它们平行或反向平行),则它们的叉乘结果为零向量。这是因为共线向量无法构成一个具有面积的平行四边形。
  4. 左手坐标系:Unity3D使用的是左手坐标系,这与数学上常用的右手坐标系有所不同。因此,在使用叉乘确定方向时,需要注意坐标系的差异。在Unity中,应使用左手法则来判断叉乘结果的方向。

综上所述,叉乘在Unity3D中有着广泛的应用和独特的几何意义。通过合理利用叉乘运算和相关API,可以实现许多复杂的3D图形和物理效果。同时,在使用叉乘时也需要注意向量顺序、零向量、共线向量以及坐标系差异等问题。

 五、代码示例

public class chacheng : MonoBehaviour
{
    public Transform A;
    public Transform B;
    void Start()
    {
        print(Vector3.Cross(A.position, B.position));
    }

    void Update()
    {
        //假设向量 A和B 都在 XZ平面上
        //向量A 叉乘 向量 B
        //y大于0 证明 B在A右侧
        //y小于0 证明 B在A左侧
        Vector3 rev = Vector3.Cross(A.position, B.position);
        if(rev.y > 0)
        {
            print("B在A右边");
        }
        else
        {
            print("B在A左边");
        }

        Vector3 rev1 = Vector3.Cross(B.position, A.position);
        if (rev1.y > 0)
        {
            print("A在B右边");
        }
        else
        {
            print("A在B左边");
        }
    }
}

结果:

 

 

 

 

标签:知识点,顺序,结果,Vector3,unity3d,Cross,position,向量
From: https://blog.csdn.net/2401_82978699/article/details/143506264

相关文章

  • 知识点:树中结点的度以及叶子结点(度为0的结点)的计算
    知识点:这道题目考察的是树的基本概念和性质,特别是关于树中结点的度以及叶子结点(度为0的结点)的计算。知识点相关内容:树(Tree):树是一种特殊的图,它是一个无向图,由结点(或称为顶点)和边组成,满足以下条件:任意两个结点之间有且仅有一条路径。树中的结点可以分为根结点、分支结点和叶......
  • 知识点:Python中的列表合并操作
    知识点:该题目考查的知识点是Python中的列表合并操作。以下是该知识点的相关内容和题目的详细解答过程:知识点:Python中的列表合并操作在Python中,合并两个或多个列表是一项常见的操作,可以通过以下几种方法实现:使用+运算符:使用+运算符可以将两个列表直接拼接在一起,形成一个......
  • 知识点:计算机网络的OSI七层模型中的数据链路层的功能和设备
    知识点:该题目考察的知识点是计算机网络的OSI七层模型中的数据链路层的功能和设备。在OSI模型中,数据链路层是第二层,它负责在相邻的网络设备之间传输帧,并且确保帧的可靠传输。数据链路层的主要功能包括帧同步、差错控制、流量控制以及物理寻址。相关知识点内容:OSI七层模型:国际标......
  • 内存函数的相关知识点
    1strerrorchar*strerror(interrnum)从语言的库函数在运行的时候,如果发生错误,就会将错误码放在一个变量中,这个变量是errnor.//strerror(errno)//fopen//FILE*fopen(constchar*filename,constchar*mode);//如果打开文件成功,就返回一个有效的指针,如......
  • 知识点UML(统一建模语言)中的活动图
    知识点该题考察的知识点是UML(统一建模语言)中的活动图(ActivityDiagram)。UML活动图的相关内容:UML活动图是一种用于描述系统中业务流程、工作流或系统操作的图表。它展示了业务流程中的步骤以及这些步骤之间的控制流。活动图的主要元素包括:活动(Activity):表示一个操作或一个动作的......
  • CSS网页布局综合练习(涵盖大多CSS知识点)
    题目:将上面的转化为下面的基本骨架<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><......
  • Java面试系列-Java并发面试题20道,结合手撕Java系列学习效果更佳,知识点更深入
    文章目录1.什么是线程安全?2.解释下Java中的Thread类和Runnable接口的区别。3.Java中的synchronized关键字有哪些特性?4.volatile关键字的作用及限制是什么?5.解释Java内存模型(JMM)。6.Java中如何实现线程间通信?7.AQS(AbstractQueuedSynchronizer)的工作原理是什么?8.......
  • JavaScript知识点梳理及案例实践
    1.Date对象创建Date对象//方法1:不指定参数varnowd1=newDate();console.log(nowd1.toLocaleString());//方法2:参数为日期字符串vard2=newDate("2004/3/2011:12");console.log(d2.toLocaleString());vard3=newDate("04/03/2011:12");console.log(d3.toLoca......
  • unity3d————坐标转换(世界转本地)
    this.transform.InverseTransformPoint1. 世界坐标系与局部坐标系世界坐标系:Unity3D中的全局参考框架,所有游戏对象的位置、旋转和缩放都是相对于这个框架来定义的。局部坐标系:每个游戏对象都有自己的局部坐标系,这个坐标系是相对于该游戏对象的位置、旋转和缩放来定义的。2......