Unity3D C#数学系列之点积

article/2025/11/3 14:54:04

文章目录

  • 1 定义
  • 2 几何意义
  • 3 向量a·向量b = xaxb+yayb+zazb
  • 4 应用案例
    • 4.1 求两向量的夹角
    • 4.2 判断两向量是否垂直
    • 4.3 判断NPC是否在攻击范围内
    • 4.4 已知入射光线和表面法线求反射光线
  • 5 项目


1 定义

点积的定义
可知,点积得到的是一个标量,这个标量代表什么呢?

2 几何意义

如果 b ⃗ \vec{b} b 为单位向量,则表示向量 a ⃗ \vec{a} a 在向量 b ⃗ \vec{b} b 上的投影长度。
点积的几何意义

3 向量a·向量b = xaxb+yayb+zazb

上面这公式是怎么来的?

向量ab的坐标值
根据余弦定理有
余弦定理
所以
在这里插入图片描述

4 应用案例

4.1 求两向量的夹角

已知向量
向量ab的坐标值
根据点积的定义,则有
求两向量的夹角
当然,这个方法Unity已经帮我封装好了,咱们要求两个向量的夹角,直接用Vector3.Angle这个方法就好。Vector3.Angle的源码如下,可以看到其内部其实就是实现了上面这个公式。

    /// <summary>///   <para>Returns the angle in degrees between from and to.</para>/// </summary>/// <param name="from">The vector from which the angular difference is measured.</param>/// <param name="to">The vector to which the angular difference is measured.</param>/// <returns>///   <para>The angle in degrees between the two vectors.</para>/// </returns>public static float Angle(Vector3 from, Vector3 to){float num = (float) Math.Sqrt((double) from.sqrMagnitude * (double) to.sqrMagnitude);if ((double) num < 1.00000000362749E-15)return 0.0f;return (float) Math.Acos((double) Mathf.Clamp(Vector3.Dot(from, to) / num, -1f, 1f)) * 57.29578f;}

4.2 判断两向量是否垂直

两向量垂直时,两者夹角为90°,而cos90° = 0,故 a ⃗ \vec{a} a · b ⃗ \vec{b} b =0。
换句话说,只要 a ⃗ \vec{a} a b ⃗ \vec{b} b 均不为空向量,只要 a ⃗ \vec{a} a · b ⃗ \vec{b} b =0,就说明两向量垂直。

4.3 判断NPC是否在攻击范围内

假设玩家的攻击范围为左右各60°,最大攻击半径为10。设玩家的位置为A(xa , ya, za),怪兽的位置为B(xb, yb, zb),判断怪兽是否在人的攻击范围内?
很简单,先判断两者的距离是否小于10,若大于则不在攻击范围内。
再判断 A B ⃗ \vec{AB} AB 与玩家前方的夹角是否小于30°,若大于则不在攻击范围内,若小于等于则在攻击范围内。
代码也很简单,两者的距离可通过Vector3.Distance求得, A B ⃗ \vec{AB} AB 与玩家前方的夹角通过Vector3.Angle求得,代码如下。

// 判断targetPos是否在视线范围内
public bool IsInView(Vector3 targetPos)
{// 玩家位置Vector3 selfPos = m_GameObject.transform.position;if (Vector3.Distance(selfPos, targetPos) > 10f)return false;Vector3 loorDir = targetPos - selfPos;if (Vector3.Angle(loorDir, m_GameObject.transform.forward) < 30f)return true;return false;
}

然后在Unity中测试一下。可以看到,咱们的分析是正确的。
判断怪兽是否在视线范围内

4.4 已知入射光线和表面法线求反射光线

如图,已知入射光线 A O ⃗ \vec{AO} AO 和表面法线 n ⃗ \vec{n} n (假定为单位向量),求反射光线 O B ⃗ \vec{OB} OB
求反射光线
直接看计算过程。
反射光线计算过程01

反射光线计算过程02
上面这公式怎么来的?还记得点积的几何意义吗?

如果 b ⃗ \vec{b} b 为单位向量,则表示向量 a ⃗ \vec{a} a 在向量 b ⃗ \vec{b} b 上的投影长度。

这里的 O P ⃗ \vec{OP} OP 的长度不正好是 O A ⃗ \vec{OA} OA 在单位向量 n ⃗ \vec{n} n 上的投影长度么。 O P ⃗ \vec{OP} OP 的长度求到后,再乘以它的方向 n ⃗ \vec{n} n ,咱们就求到 O P ⃗ \vec{OP} OP 了。
完整的推导如下。
推导过程
代码如下:

/// <summary>
/// 计算反射光线
/// </summary>
/// <param name="lightDir">入射光线</param>
/// <param name="normalDir">表面法线(单位向量)</param>
/// <returns>反射光线</returns>
private Vector3 CalcReflectDir(Vector3 lightDir, Vector3 normalDir)
{return lightDir - 2 * Vector3.Dot(lightDir, normalDir) * normalDir;
}

在Unity中验证一下。
反射光线

5 项目

链接:https://pan.baidu.com/s/1Sv7CCrnh88MEvB6evW-rQg
提取码:t4ix
博主本文博客链接。


http://chatgpt.dhexx.cn/article/d0jykZMH.shtml

相关文章

内积、点积和坐标

内积是一个纯数学概念&#xff0c;在向量空间中&#xff0c;只要满足一定的性质&#xff08;正性、定性、可加性、齐性和共轭对称性&#xff09;的函数运算就可以成为内积&#xff0c;因此具体的内积具有很多种形式。 点积是定义在空间上的一种内积&#xff0c;具体的形式为&am…

点积与投影的关系

点积与投影的关系 一个向量在另一个单位向量上的投影长度&#xff0c;等于这两个向量的点积。 怎么理解 a、b、c分别为三个向量&#xff0c;如果有abc&#xff0c;那么c在某个向量上的投影值等于a和b分别在该向量上的投影值相加(反方向的投影为负值) i&#xff0c;j分别是向…

防抖与节流的个人理解及其对应的应用场景

什么是防抖和节流&#xff0c;他们的应用场景有哪些 防抖 (debounce) 防抖&#xff0c;顾名思义&#xff0c;防止抖动&#xff0c;以免把一次事件误认为多次&#xff0c;敲键盘就是一个每天都会接触到的防抖操作。 想要了解一个概念&#xff0c;必先了解概念所应用的场景。在…

JS防抖和节流

欢迎学习交流&#xff01;&#xff01;&#xff01; 持续更新中… 文章目录 防抖节流二者区别应用场景 防抖和节流都是为了项目优化而出现的&#xff0c;官方没有具体定义的&#xff0c;他们的出现主要是为了解决一些短时间内连续执行的事件带来性能上的不佳和内存的消耗巨大等…

手写防抖节流

文章目录 手写前端常用技巧-防抖节流防抖节流1. 首节流2. 尾节流3. 首尾节流 总结 手写前端常用技巧-防抖节流 防抖&#xff1a;当持续触发事件时&#xff0c;一定时间内没有再触发事件&#xff0c;才会在一段时间之后触发事件处理函数。 节流&#xff1a;当持续触发事件时&am…

防抖和节流

1. 什么是防抖 防抖策略&#xff08;debounce&#xff09;是当事件被触发后&#xff0c;延迟 n 秒后再执行回调&#xff0c;如果在这 n 秒内事件又被触发&#xff0c;则重新计时。 1.2. 防抖的应用场景 用户在输入框中连续输入一串字符时&#xff0c;可以通过防抖策略&…

lodash节流

滚动条事件优化 可以用 lodash节流 npm i -S lodash Lodash 简介 | Lodash 中文文档 | Lodash 中文网

JS 节流

JS 节流 说明: 1.对于高频触发的监听事件函数,实现对于触发次数的间接限制,从而降低触发次数. 2.关键点在于控制时间周期内,阻止触发内容,即上锁;在时间周期外解锁,触发内容。 3.主要是对间隔时间限制,在规定时间内,阻止触发事件内指定程序或默认抛弃 4.三种实现节流方式:时间…

个人对于节流的理解!

文章目录 前言一、节流是什么&#xff1f;二、节流的实现总结 前言 防抖和节流是前端经常会被提起以及涉及到的内容&#xff0c;更是前端性能优化的手段之一&#xff0c;我初学防抖和节流也遭遇了很多坑&#xff0c;所以想写一篇博客一则当作学习笔记&#xff0c;二则如果能帮…

节流的基本使用以及理解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、节流是什么&#xff1f;应用场景 二、使用步骤1.定义节流阀2.绑定 mousemove 事件3. 判断节流阀是否为空&#xff0c;如果不为空,说明距离上一次执行时间还没有…

图片跟随鼠标样式跟随效果(附完整代码及效果)

Demo效果如下&#xff1a; 完整代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta …

前端必备技能之----节流

&#xff08;引言----和大佬们出去吃饭总是会有收获的&#xff0c;这个知识点是我之前从未考虑过的事情&#xff0c;但是在现代的设计开发之中却是非常重要且使用频率非常之高的两个概念。&#xff09; 作为一个前端的初学者&#xff0c;因为之前淋过雨&#xff0c;所以想为同…

html锚点链接小案例

案例1&#xff1a;回到首页 <html ><head><meta charset"utf-8"><title></title><style type"text/css"> *{border: 0;margin: 0; padding: 0;}.box1, .box2{height: 3000px; width: 200px;background-color: green…

HTML锚点为什么叫hash,锚点链接和hash属性

相信大家挺经常见过这样一个效果。有一个很长很长的页面,分成好几部分,目录中一点击,就能定位到页面某个位置。 例如:有这样一个目录,例如你点击一下“HTML”,就会直接跳转到“HTML”的页面位置 这就是锚点链接(也叫书签链接),常常用于那些内容庞大繁琐的网页,通过点击…

html5添加锚点锭接,为页面添加锚点链接

为页面添加锚点链接 开哈础是发通待质击文以为近哈知按分过续的战发中会遇到为页面中添加锚点链接的需求,即在页面中点击某处,可以跳转到与之有联系的地方。添加锚点的方法比较多,在这儿,把常用的方法大享上。是发了概开程态间些告人屏果会区。一一是控标近体到班都一从小述…

菜鸟 html锚链接,Vue锚点链接

锚点链接是我们在开发中经常会用到的一个技术点&#xff0c;常见的常见有&#xff0c;页面内容过多&#xff0c;而我们不希望拿鼠标一直来回滚动&#xff0c;就需要用到锚点链接&#xff0c;以 " 目录 " 的方式来进行对应的跳转。 而在常见的项目中&#xff0c;锚点链…

制作图片锚点链接html,锚点链接怎么做

网页内容过多时我们可以使用锚点链接来进行位置的跳转&#xff0c;通过锚点链接我们不但可以指向文档&#xff0c;还能指向页面里的特定段落&#xff0c;这样就会便于我们来浏览网页中的内容&#xff0c;那么&#xff0c;锚点链接怎么实现呢&#xff1f;本篇文章就来给大家介绍…

web前端学习26(锚点链接)

文章目录 4.7.2 链接分类 4.7.2 链接分类 锚点链接&#xff1a;点我们点击链接&#xff0c;可以快速定位到页面中的某个位置。 在链接文本的href属性中&#xff0c;设置属性值为#名字的形式&#xff0c;如< a href"#two">第2集< /a> 点完这个链接就会跳…

Web容器版本泄露漏洞修复

0x00 背景 恶意攻击者可以根据版本信息寻找相关漏洞&#xff0c;进行利用漏洞攻击 0x01 修复思路 通过修改配置或者配置错误提示页面&#xff0c;隐藏 web容器的版本号及其它敏感信息。 0x02 代码修复 Apache 版本号 隐藏 Apache 的版本号及其它敏感信息&#xff0c;配置操…

Spring容器 SpringMVC容器 web容器的关系

说到spring和springmvc&#xff0c;其实有很多工作好多年的人也分不清他们有什么区别&#xff0c;如果你问他项目里用的什么MVC技术&#xff0c;他会说我们用的spring和mybatis&#xff0c;或者spring和hibernate。 在潜意识里会认为springmvc就是spring&#xff0c;之前我也是…