unity点乘和叉乘的使用

2023-11-14

本文从http://blog.csdn.net/yupu56/article/details/53609028转载而来

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

点乘 

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

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

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


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项目应用:

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);
    }
}


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

unity点乘和叉乘的使用 的相关文章

  • Unity—UGUI

    每日一句 读数 学习 去更远的地方 才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例 用户名和密码 Toggle组件 案例 冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void

随机推荐

  • 三国群英传霸业之王服务器维护,《三国群英传2网络版》掌上助手APP曝光,三国群英传霸业之王...

    列位从公能否还为本人错过逛戏勾当而感应懊末路 能否曾身正在外但始末心系三国 又能否苦于只能侃侃而谈却无法展现本人的 宏图霸业 为了让大师可以或许随时随地查看逛戏情况 领会逛戏资讯 我们将正在逛戏上线后推出掌上帮手 列位从公能否还为本人错过逛
  • 【C/C++】日常学习7

    1 输入 输出流操作 2 构造函数参数参数列表初始化 3 C 中类的前向声明以及和 include的区别 4 在函数后加const的意义 1 输入 输出流操作 读取字符串的不同操作 cin 遇到空格 回车符就停止读取 空格 回车符是分隔符
  • ❓“想要创业项目,但又不知道互联网上有哪些好的项目?”

    想创业 但不知道从哪里入手 5大互联网创业项目 一起来了解一下吧 在互联网时代 创业项目不再局限于传统的实体店铺 下面介绍的是互联网创业项目 希望可以给想要创业的你提供一些启示 1 电商平台 电商平台是最为常见的互联网创业项目 可以选择开设
  • 实现Vue高德地图多边形编辑器吸附功能

    前言 之前做的高德地图多边形编辑器吸附功能 最近出现不能编辑 在修改的过程中顺便记录一下 实现效果 安装 npm i amap amap jsapi loader save 核心代码
  • windows7 搭建 Spark 详细图解

    第一步 下载Spark exe 可执行程序 程序的下载地址 http www igniterealtime org downloads index jsp openfire 如果遇到spark 无法正在安装的情况 可以参考该文章 安装Spa
  • TensorFlow2.X结合OpenCV 实现手势识别

    TensorFlow2 X结合OpenCV 实现手势识别 使用Tensorflow 构建卷积神经网络 训练手势识别模型 使用opencv DNN 模块加载模型实时手势识别 效果如下 先显示下部分数据集图片 0到9的表示 感觉很怪 构建模型进
  • java List集合转Excel表格文档

    前阵子有朋友问我java将excel转成文档的方法 用此方法需要引入jxl包 而最近公司刚好有个需求需要将数据转成excel文档 所以我就写了一个工具类 将数据对象转成excel文档 考虑到可能要传入不同类型的对象集合 为了能配合我那个朋友
  • java编写机器人_用JAVA编写自己的机器人一起“厮杀”

    什么是Robocode 最近我在阅读一个关于极限编程 XP 的邮件列表 有人提议为对学习更多的XP方法学知识感兴趣的开发人员构建一个工作间 这位作者还建议 把一群人凑到一起 分成小组研究该方法学 然后要有一个经验丰富的XP教练对工作间进行管
  • Oracle导入导出数据库(exp/imp和expdp/impdp的区别)

    Oracle导入导出数据库 exp imp和expdp impdp的区别 目录索引 1 exp和expdp的区别 2 expdp导出数据库流程 一 exp和expdp的区别 1 exp和expdp最明显的区别就是导出速度的不同 expdp导
  • libevent介绍

    libevent介绍 1 事件驱动 高性能 轻量级 专注于网络 2 源代码精炼 易读 3 跨平台 4 支持多种I O多路复用技术 如epoll select poll等 5 支持I O和信号等事件 libevent的安装 登录官方网站 ht
  • ORA-00923: 未找到要求的 FROM 关键字

    ORA 00923 未找到要求的 FROM 关键字 注意 别名不能是数字和使用
  • ps长阴影插件_PS插件Long Shadow Generator 安装步骤

    软件 下载 软件名称 Long Shadow Generator 软件大小 536KB 软件语言 简体中文 系统要求 Win10 Win8 Win7 支持版本 PS CC 2015及以上版本 下载链接 https pan baidu com
  • DSP和RAM的区别

    DSP顾名思义就是数字信号处理 厂家主要是德州仪器 TI 主要用于数字型号处理等对运算速度有特殊要求的场合 诸如音频视频算法 军工等领域 但同时dsp有2000 5000 6000等系列也可满足不场合需要 ARM 是一类内核的称谓 就像51
  • HOOK与注入

    HOOK和注入技术经常被恶意代码使用 利用HOOK和注入技术 恶意代码提高了执行隐蔽性 增加了恶意代码分析难度 在某些情况下还能实现权限提升和内存常驻 HOOK技术 挂钩 HOOK 就是在来往信息间安装 钩子 钩取来往信息 在用户层 常见的
  • Canoe 安装流程

    硬件 VN5620 软件 CANoe V15 0 软件 Vector License Client 6 2 驱动 Vector Driver Setup license 购买硬件时 vector会分配 参考文档 First Steps to
  • 理想方波的频谱

    1 理想方波的频谱 时域到频域 理想方波为频率1G 50 占空比 幅度为1v 上升时间为0 把理想方波通过离散傅里叶变换 DFT 就可以知道各个频率分量的幅度 如下图所示 偶次谐波如2G 4G 6G 8G 的幅度都为零 奇次谐波有如下关系式
  • 概率论--数学期望与方差--协方差(详解)

    目录 数学期望与方差 离散型随机变量的数学期望 注意 连续型随机变量的数学期望 方差 常用随机变量服从的分布 二项分布 正态分布 随机向量与随机变量的独立性 随机向量 随机变量的独立性 协方差 协方差的定义 协方差的意义 协方差矩阵 数学期
  • 软件工程专业学生的自我反思

    迷茫时的反思 我现在是一名大三的学生 有时候还是会处在一种很迷茫的状态 这种状态体现在 自己会不自觉的打开王者荣耀 打开BiliBili刷视频 熬夜看剧 慢慢地陷入一个漩涡 越陷越深 你是否经常对自己的行为感到怀疑 对自己做的事感到后悔 那
  • 关于“由于找不到MSVCP140.dll,无法继续执行代码,重新安装程序可能会解决此问题等”解决方案

    首先说明一下该问题 该问题就是表示你们的操作系统中现在确实一些必要的文件 具体是啥我也不是很清楚 然后 你现在要安装的这个软件正好要调用这些文件的一些函数 就可以简单理解为使用这些文件 需要你去安装一下这些文件 解决方案 首先 你自己去从一
  • unity点乘和叉乘的使用

    本文从http blog csdn net yupu56 article details 53609028转载而来 Unity当中经常会用到向量的运算来计算目标的方位 朝向 角度等相关数据 下面咱们来通过实例学习下Unity当中最常用的点乘