向量点乘叉乘等理解和应用

2023-10-26

https://baike.baidu.com/item/%E5%90%91%E9%87%8F/1396519?fr=aladdin

1.标量和矢量

    2(1,2,3) = (2,4,6) 

    (2,4,6)/2=(1,2,3)  

2.矢量和矢量的加减

三角形定则解决向量加减的方法:将各个向量依次首尾顺次相接,结果为第一个向量的起点指向最后一个向量的终点。
平行四边形定则解决向量加法的方法:将两个向量平移至公共起点,以向量的两条边作平行四边形,
向量的加法 向量的加法
结果为公共起点的对角线。
平行四边形定则解决向量减法的方法:将两个向量平移至公共起点,以向量的两条边作平行四边形,结果由减向量的终点指向被减向量的终点。
(平行四边形定则只适用于两个非零非共线向量的加减。)
坐标系解向量加减法:
在直角坐标系里面,定义原点为向量的起点.两个向量和与差的坐标分别等于这两个向量相应坐标的和与差若向量的表示为(x,y)形式,
A(X1,Y1) B(X2,Y2),则A+B=(X1+X2,Y1+Y2),A-B=(X2-X1,Y2-Y1)
简单地讲:向量的加减就是向量对应分量的加减。类似于物理的正交分解。

  (1,2,3)  +(2,4,6)  = (3,6,9)

  (3,6,9)-(2,4,6)=(1,2,3) 

   A向量-B向量 = 由B指向A 的向量 

   A 点-B点= B点指向A点的向量             

想得到人指向相机的向量  = 相机位置- 人位置 (假设人为原点)

 void Start () {
        player = GameObject.FindGameObjectWithTag(GameTag.player).transform;
        offset = transform.position - player.position;
        
    }


3.向量模    Vector3.magnitude

空间向量(x,y,z),其中x,y,z分别是三轴上的坐标,模长是:
 
立方体的体对角线长度

4.向量点乘

代数定义

设二维空间内有两个向量
   
   
,定义它们的数量积(又叫内积、点积)为以下实数:
更一般地,n维向量的内积定义如下:

几何定义

设二维空间内有两个向量
   
   
,它们的夹角为
   
,则内积定义为以下实数: [2]  
该定义只对二维和三维空间有效。
这个运算可以简单地理解为:在点积运算中,第一个向量投影到第二个向量上(这里,向量的顺序是不重要的,点积运算是可交换的),然后通过除以它们的标量长度来“标准化”。这样,这个分数一定是小于等于1的,可以简单地转化成一个角度值。

点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。 
点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。

dot(a,b)              a * b = |a| * |b| * cosθ 

    cosθ 的值 在 0-90度    a * b = |a| * |b| * cosθ  >0  

                                                        90度     a * b = |a| * |b| * cosθ  = 0

                                                  90-180度    a * b = |a| * |b| * cosθ < 0

                                          

 1.图形学中表示光照强度

点积     当a 和e 都是单位向量时 a * b = |a| * |b| * cosθ  =   cosθ 

    float3 normalDir =  normalize(mul(v.normal,_World2Object));   //模型空间到世界空间  方向转换  矩阵--_World2object

   fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz) ; // ,平行光,对顶点来说,光位置就是光方向

   // LightColor0.rgb   平行光颜色   _Diffuse.rgb  自定义颜色  , 标准化的向量点积求出 cosθ  ,

    //使用 cosθ 表示光强,和法线垂直最亮,平行最暗

   float3 diffuse = _LightColor0.rgb*max(dot(normalDir,lightDir),0)*_Diffuse.rgb; 

2.位置判断

 float c = Vector3.Dot (a, b); 

 通过点积的计算我们可以简单粗略的判断当前物体是否朝向另外一个物体: 只需要计算当前物体的transform.forward向量与 (otherObj.transform.position – transform.position)的点积即可, 大于0则面对,否则则背对着。

 或者,通过点积后的大小判断向量夹角是锐角,钝角,还是直角


5.向量叉乘

a ∧ b = |a| * |b| * sinθ 

(a,b,c)×(x,y,z)=(bz-cy,cx-az,ay-bx)

向量积被定义为: 
模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。) 
方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。c = a ∧ b) 

  叉积的定义:c =a x b 其中a,b,c均为向量。即两个向量的叉积得到的还是向量!
  性质1:c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面
  性质2:模长|c|=|a||b|sin<a,b>
  性质3:满足右手法则。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。

在力学里,用叉积表示一个力对 一个定点的矩M=r×F,当F与向径r不垂直时,二者有个夹角θ,那么︱M︱=︱r︱︱F︱sinθ,力 矩M是向量,总之,外积就是,产生一个新向量,其方向垂直于由向量AB,向量CD确定的平面,其方向由右手定则确定。

1 .计算出两个向量的夹角。
  下面是示例代码:

[csharp] view plain copy

 using UnityEngine;  

 using System.Collections;  

 public class MainScript : MonoBehaviour  

 {        //向量a  

       private Vector3 a;  

       //向量b  

        private Vector3 b;  

         

        void Start ()  

      {  

               //向量的初始化  

              a = new Vector3 (1, 2, 1);  

               b = new Vector3 (5, 6, 0);  

        }      

     void OnGUI ()  

       {  

               //点积的返回值  

              float c = Vector3.Dot (a, b);  

              //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!  

             float angle = Mathf.Acos (Vector3.Dot (a.normalized, b.normalized)) * Mathf.Rad2Deg;  

             GUILayout.Label ("向量a,b的点积为:" + c);  

               GUILayout.Label ("向量a,b的夹角为:" + angle);  

              //叉积的返回值  

              Vector3 e = Vector3.Cross (a, b);  

                Vector3 d = Vector3.Cross (b, a);  

               //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!  

               angle = Mathf.Asin (Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))) * Mathf.Rad2Deg;  

               GUILayout.Label ("向量axb为:" + e);  

              GUILayout.Label ("向量bxa为:" + d);  

                GUILayout.Label ("向量a,b的夹角为:" + angle);  

        }  

 }  

  上面的示例中,我们定义了两个向量a和b。分别求出了他们的点积和叉积,并通过点积和叉积来反过来计算他们的夹角。

  这里要说明的是:
     通过叉积计算度数是通过公式|c|=|a||b|sin<a,b>来逆向求值。|c| 其实就是叉积的模,换句话说,也代表着Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))的值。

   2.用来判断一个向量在另一个向量的左侧还是右侧,通过叉乘后向量的方向判断向量的位置

float GetAngularSpeed()
    {
        // 求出夹角
        float angle = Vector3.Angle(transform.forward,
 nav.desiredVelocity);

        // 求弧度
        float result = angle * Mathf.Deg2Rad;
        // 期望速度在机器人左侧则弧度为负,否则为正
        Vector3 normal = Vector3.Cross(transform.forward, nav.desiredVelocity);
        if (normal.y < 0)
        {
            // 说明在左侧 (A 为Z方向时,B在A的逆时针180度内,此时点积小于0,方向向下,y值小于0 )

            result *= -1;
        }

        //if (nav.desiredVelocity == Vector3.zero)
        //{
        //    result = 0;
        //}
        return result;
    }


  

6 . 向量求夹角------Vector3.Angle(a, b) 

   返回的角度是俩个向量中小于180度的角度,是不分左右的,没有负数

  1.HTC中把touchPad分为N等分,可以扩展为N个功能键

    // 如下,控制游玩区前后左右移动    x 形区域,实现控制

// Update is called once per frame

void Update () {

        if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad))

        {

            Vector2 pos = device.GetAxis();

            GameObject cameraRig = transform.parent.gameObject;

            if (Vector2.Angle(Vector2.up, pos) < 45)

            {

                cameraRig.transform.Translate(Vector3.forward *Time.deltaTime);

            }

            else if(Vector2.Angle(Vector2.right, pos) < 45)

            {

                Debug.Log("右");

                cameraRig.transform.Translate(Vector3.right *Time.deltaTime);

            }

            else if (Vector2.Angle(Vector2.left, pos) < 45)

            {

                Debug.Log("左");

                cameraRig.transform.Translate(Vector3.left *Time.deltaTime);

            }

            else if(Vector2.Angle(Vector2.down, pos) < 45)

            {

                Debug.Log("下");

                cameraRig.transform.Translate(Vector3.back *Time.deltaTime);

            }

        }

}

2.设置怪物视野

   public float sightAngle = 110;
    // 获取玩家
    private Transform player;
    // 能否看到玩家
    public bool canSeePlayer = false;

 bool CheckSight()
    {
        Vector3 dir = player.position - transform.position;
        if (Vector3.Angle(transform.forward, dir) < sightAngle / 2)
        {
            Ray ray = new Ray(transform.position + Vector3.up * 1.7f, dir);
            RaycastHit hit;
            // 中间不能有障碍物
            if (Physics.Raycast(ray, out hit))
            {
                if (hit.collider.tag == GameTag.player)
                {
                    canSeePlayer = true;
                    return true;
                }
            }
        }
        return false;
    }

7.向量投影 Vector3 project

a点乘b向量=a向量的模乘以b向量的模乘以cosa , 

b向量的模cosa 叫做 a向量在b向量方向上的投影,等同于点积一个单位化向量

Vector3 project = Vector3.Project(nav.desiredVelocity, transform.forward);  

8.Vector3.Distance(a,b)

空间俩点间的距离

Vector3.Distance(a,b) 等同于(a-b).magnitude 。


  • 点时,表示俩点距离,即俩个相对于原点的向量,求距离
var other : Transform;
if (other) {
	var dist = Vector3.Distance(other.position, transform.position);
	print ("Distance to other: " + dist);
}

bool CheckVoice()
    {
        // 获取e玩家的脚步声
        if (player.GetComponent<AudioSource>().isPlaying)
        {
            // 定义一条导航路径
            NavMeshPath path = new NavMeshPath();
            // 判断在当前的导航烘焙下,敌人是否能到达脚步声的位置
            if (nav.CalculatePath(player.position, path))
            {
                // 定义一个拐点数组,用来存放这条路径上所有拐点位置信息(不包含起点和终点)
                Vector3[] corners = path.corners;
                Vector3[] pathPoints = new Vector3[corners.Length + 2];
                pathPoints[0] = transform.position;
                pathPoints[pathPoints.Length - 1] = player.position;
                for (int i = 0; i < corners.Length; i++)
                {
                    pathPoints[i + 1] = corners[i];
                }
                // 此路径的总距离
                float pathDistance = 0;
                for (int i = 0; i < pathPoints.Length - 1; i++)
                {
                    pathDistance += Vector3.Distance(pathPoints[i], pathPoints[i + 1]);    // 空间俩点间的距离
                }
                // 若总距离小于触发器的半径,则代表听到了声音
                if (pathDistance < GetComponent<SphereCollider>().radius)
                {
                    return true;
                }
            }
        }
        return false;
    }






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向量点乘叉乘等理解和应用 的相关文章

  • Jackson中的自定义反序列化器和验证

    tl dr 将输入验证添加到Jackson中的自定义json解串器很重要 在RHQ中 我们在几个地方使用了Json解析 直接在as7 Wildfly插件中 或者通过RESTEasy 2 3 5间接在REST api中使用 已经很繁重了 现在

随机推荐

  • 构建高性能应用:Java与MongoDB的完美融合

    AI绘画关于SD MJ GPT SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 A
  • windows 资源管理器已停止工作的解决办法

    问题现象描述 电脑开机输入密码后 加载很久 才跳转至解锁后的界面 但解锁后的界面不显示桌面 任务管理器提示 资源管理器已停止工作 尝试联机解决方案或者关闭程序都不奏效 一些快捷键比如win r win e都不起作用 但能ctr alt de
  • vue中 Error in mounted hook: "TypeError: __WEBPACK_IMPORTED_MODULE_0__assets_swiper_js__.default is n...

    个人小站点 https sundjly github io 在vue的项目中出现了以下错误 Error in mounted hook TypeError WEBPACK IMPORTED MODULE 0 assets swiper js
  • matplotlib可视化之饼图plt.pie()与plt.legend()中bbox_to_anchor参数的理解

    函数功能 表示离散变量各占比情况 调用方法 plt pie x explode None labels None colors None autopct None pctdistance 0 6 shadow False labeldist
  • matlab 小球随机分布,matlab空间内生成随机球体,并不重叠

    根据comsol上的奶酪模型 即在三维空间内生成小孔模型 想进一步控制生成的小孔互不重叠 但是运行不出来 大神们能帮我看看错误吗 代码是循环体部分的 奶酪中的小孔初始化参数 number of hols 80 初始化并定义奶酪内的小孔总数
  • matlab读取txt文档三行数据库,matlab将数据读取和写入txt文档

    matlab中打开文件 fid fopen 文件名 打开方式 说明 fid用于存储文件句柄值 若是fid gt 0 这说明文件打开乐成 另外 在这些字符串后添加一个 t 如 rt 或 wt 则将该文件以文本方式打开 若是添加的是 b 则以二
  • adb复制root到手机,怎样通过adb命令来root手机

    实战 Androidadb常用命令详解 ADB 全称Android Debug Bridge 是一个功能非常强大的工具 它位于Android SDK安装目录的platform tools 子目录下 ADB工具即可完成模拟器文件与电脑文件的相
  • win10 服务主机:DCOM服务器进程启动器 进程导致电脑卡死解决思路

    新买的笔记本 联想拯救者Y7000 系统 win10专业版 已经禁用了网上可搜的服务 没有win10开始菜单的磁条 原因 总是在开机一段时间后系统卡死 只能强制关机才可以 查找 后来开着任务管理器 放着看到底什么原因造成的 发现 服务主机
  • Ubuntu 16.04 上 CUDA_10.0及cuDNN的安装

    GPU Geforce GTX1060 驱动版本 418 56 最开始打算装CUDA 10 1 nvidia与cuda需相匹配 但是在运行cuda run后出现的用户许可证信息有问题 如图 但是CUDA 10 1与驱动版本是相匹配的 也没有
  • 排序算法总结(长期更新)

    1 最基础的排序算法 1 冒泡排序 思想 每次使用交换的方式将剩余元素中较大的元素放到一端 直到剩余元素为0的时候排序结束 include
  • PCL读取显示点云的两种方式

    读取点云的两种方式 PCL提供了两种pcd点云读写方式 其中PCD Point Cloud Date 点云数据 对应的文件格式为 pcd 是 PCL官方指定格式 具有 ASCII 和 Binary 两种数据存储类型 其中 ASCII 格式的
  • snipaste便捷截图小工具

    Snipaste是一个简单但强大的截图工具 也可以让你将截图贴回到屏幕上 下载并打开Snipaste 按下F1来开始截图 再按F3 截图就在桌面置顶显示了 还可以将剪贴板里的文字或者颜色信息转化为图片窗口 并且将它们进行缩放 旋转 翻转 设
  • 原码 反码 补码 移码

    原码 反码 补码都是有符号定点数的表示方法 一个有符号定点数的最高位为符号位 0是正 1是负 反码 原码 除符号位外 每位取反 补码 反码 1 反码 补码 1 移码 补码符号位取反 原码就是这个数本身的二进制形式 正数的反码和补码都是和原码
  • cmake错误:“未定义的引用”,“未声明的引用”

    描述 在编译代码的时候 经常会出现 未声明的引用 和 未定义的引用 之类的错误 原因 这种情况一般在编译的过程是不会出现问题 在链接的过程会出现这些问题 未声明的引用一般是头文件引入错误 或者找不到头文件 未定义的引用应该是找不到函数的实现
  • omv5-gitlab/gitlab-ce deploy

    omv5 gitlab gitlab ce yml example version 3 6 services web image gitlab gitlab ce latest restart always environment GITL
  • AWS架构图更新2019 - 最强大的AWS架构设计工具

    需要设计您的Amazon Web Services AWS 架构 今天我想介绍一下如何使用Visual Paradigm的云架构设计软件绘制AWS架构图快速而有趣 他们提供世界上最简单 最强大的AWS架构设计工具 全套AWS符号 创建专业的
  • Python-装饰器详解

    装饰器 介绍 在Python中 装饰器是一种特殊的语法 用于修改或增强函数的功能 装饰器是Python的高级特性之一 它允许我们通过在不修改原函数代码的情况下 添加额外的功能或行为 装饰器是一个函数 它接受一个函数作为参数 并返回一个新的函
  • 构建工具Maven/Gradle

    Maven Maven项目对象模型 POM 可以通过一小段描述信息来管理项目的构建 报告和文档的项目管理工具软件 Maven 除了以程序构建能力为特色之外 还提供高级项目管理工具 由于 Maven 的缺省构建规则有较高的可重用性 所以常常用
  • 微信小程序之微信登录

    在开发微信小程序的时候 我们经常需要用到微信登录 通过wx的接口来获取微信用户的信息 然后存储到我们数据库来创建属于我们系统的用户信息 所以我们就要使用到wx login wx getUserProfile 这两个方法 wx login w
  • 向量点乘叉乘等理解和应用

    https baike baidu com item E5 90 91 E9 87 8F 1396519 fr aladdin 1 标量和矢量 2 1 2 3 2 4 6 2 4 6 2 1 2 3 2 矢量和矢量的加减 三角形定则解决向量