[Unity3D]Shader学习笔记之点和矢量
简介
- 点(point)是n维空间(游戏中主要使用二维和三维空间)中的一个位置,它没有大小、宽度这类概念。
- 矢量(vector,也被称为向量)是指n维空间中一种包含了模(magnitude)和方向(direction)的有向线段。速度(velocity)就是一种典型的矢量。
- 矢量的模指的是这个矢量的长度。一个矢量的长度可以是任意的非负数。
- 矢量的方向则描述了这个矢量在空间中指向。
- 矢量的头(head)指的是它的箭头所在的端点出,而尾(tail)指的是另一个端点。
- 只要矢量的模和方向保持不变,无论在哪里,都是同一个矢量。
标量(scalar)只有模没有方向。例如距离(distance)就是一种标量。
任何一个点都可以表示成一个从原点出发的矢量。
矢量的运算
矢量和标量的乘法/除法
只需要把矢量的每个分量和标量相乘即可。
kv=(kv_x, kv_y,kv_z)
一个矢量也可以被一个非零的标量除。这等同于和这个标量的倒数相乘。
\dfrac{v}{k}=\dfrac{(x,y,z)}{k}=\dfrac{1}{k}(x,y,z)=\left(\dfrac{x}{k},\dfrac{y}{k},\dfrac{z}{k}\right),k\neq0
对于乘法来说,矢量和标量的位置可以互换的。但对于除法,只能是矢量被标量除,而不能是标量被矢量除,这是没有意义的。
当k<0k\lt0时,矢量的方向也会取反。
矢量的加法和减法
两个矢量进行相加或相减,其结果是一个相同维度的新矢量。
a+b=(a_x+b_x,a_y+b_y,a_z+b_z)
a-b=(a_x-b_x,a_y-b_y,a_z-b_z)
二维矢量的加法和减法,如图:
在图形学中,矢量通常用于描述位置偏移(即位移)。因此可以用矢量的加法或减法来计算一点相对于另一点的位移。
如果想计算b点相对于a点的位移,就可以通过把b和a相减得到。
矢量的模
三维矢量计算公式如下:
\lvert v\rvert=\sqrt{v_x^2+v_y^2+v_z^2}
其他维度同理可得,对每个分量的平方相加后再开根号得到。
单位矢量
单位矢量指的是模为1的矢量,也称为被归一化的矢量(normalized vector)。
对任何非零矢量转换成单位矢量的过程被称为归一化(normalized)。
对矢量的归一化,可以使用该矢量除以该矢量的模得到,如下:
\hat v=\dfrac{v}{\lvert v\rvert},v是非零矢量
零矢量
零矢量即矢量的每个分量值都是0,如v=(0,0,0)v=(0,0,0)是不可被归一化的。这是因为做除法运算时分母不能为0。
矢量的点积
点积(dot product)也称为内积(inner product)。
点积的名称来源于这个运算符号:a⋅ba \cdot b。中间的这个圆点符号是不可以省略的。
公式一:两个三维矢量的点积是把两个矢量对应的分量相乘后再取和,最后是一个标量。
\begin{align}a\cdot b &=(a_x,a_y,a_z)\cdot (b_x,b_y,b_z) \\ &=a_xb_x+a_yb_y+a_zb_z\end{align}
矢量的点积满足交换律:a⋅b=b⋅aa\cdot b=b\cdot a
点积的几何意义很重要,其中一个就是投影(projection)。
有一个单位矢量a^\hat a和另一个长度不限的矢量b。我们希望得到b在平行于a^\hat a的一条直线上的投影。那么,我们可以使用点积a^⋅b\hat a\cdot b来得到b在a^\hat a方向上的有符号的投影。
当投影的值小于0时,夹角大于90∘90^\circ。等于0时,夹角为90∘90^\circ,相互垂直。大于0时,夹角小于90∘90^\circ。
性质一:点积可结合标量乘法。
(ka)\cdot b=a\cdot (kb)=k(a\cdot b)
性质二:点积可结合矢量加法和减法。
a\cdot (b+c)=a\cdot b + a\cdot c
性质三:一个矢量和本身进行点积的结果,是该矢量的模的平方。
v\cdot v=v_xv_x+v_yv_y+v_zv_z=\lvert v\rvert^2
公式二:
\begin{align}a\cdot b &= (\lvert a\rvert \hat a)\cdot (\lvert b\rvert \hat b) \\ &= \lvert a\rvert \lvert b\rvert (\hat a \cdot \hat b) \\ &= \lvert a\rvert\lvert b\rvert cos\theta\end{align}
推理得:两个单位矢量的点积等于它们之间的夹角的余弦值。当夹角小于90∘90^\circ时,cosθ>0cos\theta>0;当夹角等于90∘90^\circ时,cosθ=0cos\theta=0;当夹角大于90∘90^\circ时,cosθ<0cos\theta。
\hat a \cdot \hat b=\dfrac{直角边}{斜边}=cos\theta
\begin{align}a\cdot b &= (\lvert a\rvert \hat a)\cdot (\lvert b\rvert \hat b) \\ &= \lvert a\rvert \lvert b\rvert (\hat a \cdot \hat b) \\ &= \lvert a\rvert\lvert b\rvert cos\theta\end{align}
利用这两个公式,还可以求得两个向量之间的夹角(在0~180°)
\theta=arcos(\hat a \cdot \hat b),假设\hat a和\hat b是单位矢量。
矢量的叉积
叉积(cross product),也被称为外积(outer product)。矢量叉积的结果仍然是一个矢量。
和点积类型,叉积的名称来源于它的符号:a×ba \times b。同样这个符号是不能省略的。两个矢量的叉积可用如下公式计算:
\begin{align} a \times b&=(a_x,a_y,a_z)\times (b_x,b_y,b_z)\\&=(a_yb_z-a_zb_y,a_zb_x-a_xb_z,a_xb_y-a_yb_x)\end{align}
叉积不满足交换律,即a×b≠a×ba\times b\neq a\times b。
叉积满足反交换律,即a×b≠−(a×b)a\times b\neq -(a\times b)。
叉积不满足结合律,即(a×b)×c≠a×(b×c)(a\times b)\times c \neq a \times (b \times c)。
a×ba\times b的长度等于a和b的模的乘积再乘以它们之间夹角的正弦值。公式如下:
\lvert a\times b\rvert=\lvert a\rvert\lvert b\rvert sin\theta
用a和b构建一个平行四边形,其面积可以使用∣b∣h\lvert b\rvert h来得到,即底乘以高。而hh又可以使用∣a∣\lvert a\rvert和夹角θ\theta来得到,即
\begin{align}A&=\lvert b\rvert h\\&=\lvert b\rvert (\lvert a\rvert sin \theta)\\&=\lvert a\rvert \lvert b\rvert sin\theta\\&=\lvert a \times b\rvert\end{align}
如果a和b平行(方向可能相同可能相反),可以认为构建出来的平行四边形的面积为0,那么a×b=0a\times b=0,这里得到的是向量0,而不是标量0。
根据左右手坐标系的不同,叉积求得的垂线的方向也不同,如下:
[Unity3D]Shader学习笔记之点和矢量相关推荐
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...
- Unity3D课程学习笔记(一)
Unity3D课程学习笔记(一) 1.解释游戏对象(GameObjects)和资源(Assets)的区别与联系 官方文档对Assets的解释:An asset is representation of ...
- Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)
此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...
- Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染
Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...
- 【Unity3d】学习笔记(4)
[Unity3d]学习笔记(4) 目录 Unity3d学习笔记4 目录 前言 正文 NGUI插件 ApplicationLoadLevel Texture Type 相机Camera 前言 我学习Un ...
- Shader学习笔记(三)学习Shader所需的数学基础
感受高数 一.笛卡尔坐标系 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 二.点和矢量 1.矢量和标量的乘法/除法 2.矢量的加法和减法 3.矢量的模 4.单位矢量 5.矢量的点积 6.矢量的叉积(cr ...
- 【Unity3D】学习笔记(第2记) 2D游戏开发基本技巧之背景制作
最近看了龚老师的u3d视频讲座游戏<Platform>7讲,是关于2D游戏开发的,现将一些个人学习笔记记录于此. 1 背景图导入 首先创建一个Cube,通过缩放调整成和背景图一样的宽高,然 ...
- 【Unity】Unity Shader学习笔记(二)渲染管线
文章目录 渲染管线(Randering Pipeline) 渲染流程 可编程渲染管线 应用阶段 把数据加载到显存中 设置渲染状态 调用DrawCall 几何阶段.光栅化阶段 渲染管线(Randerin ...
- Unity Shader 学习笔记(一)关于“表面着色器”切换渲染管线Shader不可用的问题
Shader主流上分为两类: 表面着色器(surface shader):更高级的封装,减少人工工作量,能实现大部分效果,缺点是自定义程度不 高,相对局限: 片段着色器(fragment shader ...
最新文章
- Java学习总结:13
- 工业用微型计算机(18)-指令系统(13)
- python 多进程 循环_python 多进程读取同一个循环处理、可以用multiprocessing
- 表格序号_如何让表格序号自动更新,四个函数让表格实现自动化、高效操作
- lg gw880 qq2011 android beta4版,LG GW880评测:CMMB天线、细节设计
- 万丰科技机器人排名_机器人系统集成“7宗最”
- Python——编码风格建议
- 旗舰杀手!红米旗舰定名 干翻全场?
- Win32下显示、隐式加载DLL的方法
- 前端神器之Sublime Text2/3简单明了使用总结
- 电脑声音太小如何增强_如何录制电脑上播放的声音,背景音乐
- Activity生命周期的回调,你应该知道得很多其它!--Android源代码剖析(下)
- 第13周 本周个人总结
- 新购买的PLQ-20K在Windows系统下打印乱码或不打印。
- 如何将代码写的更加优雅?
- PHP输出分割线,dede标签调用大全dedecms隔五行一个分割线_PHP教程
- android 高光动画,InstrumentPanelView
- 原神私服搭建三:(启动器下载和设置代理)
- 手机录音文件如何转换成文本?具体如何操作?
- 反向代理,正向代理,网关