Unity3D C#数学系列之点积
文章目录
- 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#数学系列之点积相关推荐
- Unity3D C#数学系列之矩阵基础
目录 1 引言 2 矩阵的作用 3 矩阵的乘法 3.1 矩阵与标量的乘法 3.2 矩阵与矩阵的乘法 4 特殊矩阵 4.1 方块矩阵 4.1.1 对角矩阵 4.1.2 单位矩阵 4.2 转置矩阵 4.3 ...
- Unity3D C#数学系列之判断两条线段是否相交并求交点
1 引言 问题:已知三维空间中四点A.B.C.D,如何判断线段AB与CD是否相交,若相交则求出交点. 分析: AB.CD要相交,则AB.CD必须要在同一平面内 快速排斥和跨立实验判断是否相交 几何法分 ...
- Unity3D C#数学系列之三角函数
目录 1 定义 2 常用公式推导 2.1 sin²θ + cos² = 1 2.2 sinθ = cos(90°-θ). cosθ = sin(90°-θ) 2.3 sin(-θ) = -sinθ. ...
- 3D数学系列之——再谈蒙特卡洛积分和重要性采样
目录 一.前篇文章回顾 二.积分的黎曼和形式 三.积分的概率形式(蒙特卡洛积分) 四.误差 五.蒙特卡洛积分计算与收敛速度 六.重要性采样 七.重要性采样方法和过程 八.重要性采样的优缺点 一.前篇文 ...
- Unity3D的坑系列:动态加载dll
Unity3D的坑系列:动态加载dll 我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以 ...
- Unity3D脚本中文系列教程(七)
http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...
- Unity3D脚本中文系列教程(五)
http://dong2008hong.blog.163.com/blog/static/4696882720140302848544/?suggestedreading&wumii Unit ...
- 数学系列:数学在计算机图形学中的应用
宇宙的琴弦 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60 文章 - 0 评论 - 0 数学系列:数学在计算机图形学中的应用 Copyright © 1900-2016, NORYES ...
- Unity3D 开发工具系列 UI框架:封装接口UIControl
Unity3D 开发工具系列 UI框架:UI基类UIBase Unity3D 开发工具系列 UI框架:UI管理UIManager Unity3D 开发工具系列 UI框架:MVC模式 Unity3D 开 ...
最新文章
- 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
- SAP Odata服务里filter的用法
- mysql表单查询_MySQL表单集合查询
- Javascript实现合并单元格
- 牛客网数据开发题库_牛客网SQL题库NO.32~40
- scrapy爬取天气存MySQL_Scrapy实战篇(五)之爬取历史天气数据
- cocos2dx中加入unzip
- Nexus1000v部署
- CIA网攻中国11年,内网防护刻不容缓!
- 【Git可视化工具】Sourcetree的初始化与使用
- 虚拟化服务器不能远程控制,kvm虚拟化如何搭建? 向日葵远程控制
- 【媒体】黑灰产横行,金融行业如何“数智化”反欺诈?
- 北风修仙笔记—2020年3月
- 香港大学韩锴课题组招收CV和深度学习方向全奖博士/博后
- 离散数学——数学结构
- java压缩解压缩rar、zip文件
- 【ROS学习】- tf学习 - tf中重要函数解析 (陆续更新....)
- python制作图片_python制作斗图生成器
- 《如何阅读一本书》读书笔记2
- esp8266+arduino+blinker远程控制灯管和LED小灯,步骤详细,适用所有新手小白