文章目录

  • 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

上面这公式是怎么来的?


根据余弦定理有

所以

4 应用案例

4.1 求两向量的夹角

已知向量

根据点积的定义,则有

当然,这个方法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,若大于则不在攻击范围内。
再判断AB⃗\vec{AB}AB与玩家前方的夹角是否小于30°,若大于则不在攻击范围内,若小于等于则在攻击范围内。
代码也很简单,两者的距离可通过Vector3.Distance求得,AB⃗\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 已知入射光线和表面法线求反射光线

如图,已知入射光线AO⃗\vec{AO}AO和表面法线n⃗\vec{n}n(假定为单位向量),求反射光线OB⃗\vec{OB}OB。

直接看计算过程。



上面这公式怎么来的?还记得点积的几何意义吗?

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

这里的OP⃗\vec{OP}OP的长度不正好是OA⃗\vec{OA}OA在单位向量n⃗\vec{n}n上的投影长度么。OP⃗\vec{OP}OP的长度求到后,再乘以它的方向n⃗\vec{n}n,咱们就求到OP⃗\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
博主本文博客链接。

Unity3D C#数学系列之点积相关推荐

  1. Unity3D C#数学系列之矩阵基础

    目录 1 引言 2 矩阵的作用 3 矩阵的乘法 3.1 矩阵与标量的乘法 3.2 矩阵与矩阵的乘法 4 特殊矩阵 4.1 方块矩阵 4.1.1 对角矩阵 4.1.2 单位矩阵 4.2 转置矩阵 4.3 ...

  2. Unity3D C#数学系列之判断两条线段是否相交并求交点

    1 引言 问题:已知三维空间中四点A.B.C.D,如何判断线段AB与CD是否相交,若相交则求出交点. 分析: AB.CD要相交,则AB.CD必须要在同一平面内 快速排斥和跨立实验判断是否相交 几何法分 ...

  3. Unity3D C#数学系列之三角函数

    目录 1 定义 2 常用公式推导 2.1 sin²θ + cos² = 1 2.2 sinθ = cos(90°-θ). cosθ = sin(90°-θ) 2.3 sin(-θ) = -sinθ. ...

  4. 3D数学系列之——再谈蒙特卡洛积分和重要性采样

    目录 一.前篇文章回顾 二.积分的黎曼和形式 三.积分的概率形式(蒙特卡洛积分) 四.误差 五.蒙特卡洛积分计算与收敛速度 六.重要性采样 七.重要性采样方法和过程 八.重要性采样的优缺点 一.前篇文 ...

  5. Unity3D的坑系列:动态加载dll

    Unity3D的坑系列:动态加载dll 我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以 ...

  6. Unity3D脚本中文系列教程(七)

    http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...

  7. Unity3D脚本中文系列教程(五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302848544/?suggestedreading&wumii Unit ...

  8. 数学系列:数学在计算机图形学中的应用

    宇宙的琴弦 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60   文章 - 0   评论 - 0 数学系列:数学在计算机图形学中的应用 Copyright © 1900-2016, NORYES ...

  9. Unity3D 开发工具系列 UI框架:封装接口UIControl

    Unity3D 开发工具系列 UI框架:UI基类UIBase Unity3D 开发工具系列 UI框架:UI管理UIManager Unity3D 开发工具系列 UI框架:MVC模式 Unity3D 开 ...

最新文章

  1. 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
  2. SAP Odata服务里filter的用法
  3. mysql表单查询_MySQL表单集合查询
  4. Javascript实现合并单元格
  5. 牛客网数据开发题库_牛客网SQL题库NO.32~40
  6. scrapy爬取天气存MySQL_Scrapy实战篇(五)之爬取历史天气数据
  7. cocos2dx中加入unzip
  8. Nexus1000v部署
  9. CIA网攻中国11年,内网防护刻不容缓!
  10. 【Git可视化工具】Sourcetree的初始化与使用
  11. 虚拟化服务器不能远程控制,kvm虚拟化如何搭建? 向日葵远程控制
  12. 【媒体】黑灰产横行,金融行业如何“数智化”反欺诈?
  13. 北风修仙笔记—2020年3月
  14. 香港大学韩锴课题组招收CV和深度学习方向全奖博士/博后
  15. 离散数学——数学结构
  16. java压缩解压缩rar、zip文件
  17. 【ROS学习】- tf学习 - tf中重要函数解析 (陆续更新....)
  18. python制作图片_python制作斗图生成器
  19. 《如何阅读一本书》读书笔记2
  20. esp8266+arduino+blinker远程控制灯管和LED小灯,步骤详细,适用所有新手小白

热门文章

  1. 【赵强老师】事务隔离级别与脏读
  2. HUAWEI 机试题:充分发挥GPU算力
  3. Apache 的架构师们遵循的 30 条设计原则
  4. 编译Austin AGL部分代码
  5. 08年刘翔广告收入近亿 冠军身份令身价飙升
  6. eclipse黑色背景主题
  7. 名字的漂亮度问题求解——华为OJ题目
  8. html5贝塞尔曲线,Canvas学习:贝塞尔曲线
  9. 频率与周期的精密控制——用SPI输出PWM脉冲
  10. 系统架构案例分析——(1)Web开发技术综述