[入门] Unity Shader前置知识(5) —— 向量的运算

在Unity中,向量无处不在,我想很多人都使用过向量类的内置方法 normalized() 吧,我们都知道该方法是将其向量归一化从而作为一个方向与速度相乘,以达到角色朝任一方向移动时速度都相等的效果,但内部具体是如何将该向量进行归一化的呢,本篇我们就来揭晓这个答案。

1. 相关概念

在学习向量的运算之前,我们先要了解一些有关概念:

标量(scalar)是一个只有大小,没有方向的物理量。

向量(vector)是一个有长度,也有方向的有向线段。

向量的模(magnitude)指的这个向量的长度。一个向量的长度可以是任意的非负数。模式一个标量。

向量的方向(direction)描述了这个向量在空间的指向。

2. 向量和标量的乘法/除法

以三维向量为例,向量和标量的乘法公式如下:

kv=(kv_{x},kv_{y},kv_{z})

类似的,向量也可以被一个非零的标量相除,这等同于和这个标量的倒数相除:

 \frac{v}{k}=\frac{(x,y,z)}{k}=\frac{1}{k}(x,y,z)=(\frac{x}{k},\frac{y}{k},\frac{z}{k})

 下面是两个简单的例子:

2\cdot (1,2,3)=(2,4,6)

\frac{(1,2,3)}{2}=(0.5,1,1.5) 

3. 向量之间的加法和减法 

 我们可以对两个向量进行相加或相减,其结果是一个相同维度的新向量。只需要把两个向量的对应分量进行相加或相减即可,公式如下:

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

下面是两个简单的例子:

 (1,2,3)+(4,5,6)=(5,7,9)

(5,2,7)-(3,8,5)=(2,-6,3) 

 4. 向量的模

我们以三维向量为例,计算一个向量的模公式如下:

|v|=\sqrt{v_{x}^{2}+v_{y}^{2}+v_{z}^{2}}

 我们以一个二维向量(1, 1)为例,模的计算方式如下:

|(1,1)|=\sqrt{1^{2}+1^{2}}=\sqrt{1+1}=\sqrt{2}\approx 1.414

 5. 向量的归一化

向量归一化(normalized vector)是指将该向量的模变为1,模为1的向量被称为单位向量(unit vector)。对任何给定的非零向量,把它转换成单位向量的过程就被称为归一化(normalization)

通常,我们在向量的头上添加一个带帽符号来表示单位向量,例如\hat{v}。为了对向量进行归一化,我们可以将向量除以该向量的模来得到,公式如下:

\hat{v}=\frac{v}{|v|}

 我们以一个二维向量(1, 1)为例,该向量归一化的计算方式如下:

\frac{(1,1)}{|(1,1)|}=\frac{(1,1)}{\sqrt{2}}=\frac{(\sqrt(2),\sqrt(2))}{2}\approx \frac{(1.4,1.4)}{2}=(0.7,0.7)

6. 向量之间的乘法

6.1. 点积

点积(dot product)的名称来源于这个运算符号:a\cdot b。点积的公式有两种形式,我们先看第一种公式:

a\cdot b=(a_{x},a_{y},a_{z})\cdot (b_{x},b_{y},b_{z})=a_{x}b_{x}+a_{y}b_{y}+a_{z}b_{z}

它还有第二个公式:

a\cdot b=|a|\cdot |b|\cdot cos\theta

由此公式我们可以得出:

cos\theta=a\cdot b\div |a|\div|b| 

 当a、b两个向量都为单位向量,也就是|a||b|都为1时,公式又可以简化为:

cos\theta=\hat{a}\cdot \hat{b}

因此:

\theta=arcos(\hat{a}\cdot \hat{b}) 

6.2. 叉积

叉积(cross product)的名称来源于它的符号:a\times b,同样这个叉号也不能省略它的计算公式为:

a\times b=(a_{x},a_{y},a_{z})\times(b_{x},b_{y},b_{z})=(a_{y}b_{z}-a_{z}b_{y},a_{z}b_{x}-a_{x}b_{z},a_{x}b_{y}-a_{y}b_{x})

我们用一张图就可以清晰的描述它的运算规律:

计算出来的向量是垂直于a、b所构成的平面的法向量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring - 8 ( 10000 字 Spring 入门级教程 )

一: MyBatis 1.1 引入 MyBatis 我们学习 MySQL 数据库时,已经学习了 JDBC 来操作数据库, 但是 JDBC 操作太复杂了. 我们先来回顾⼀下 JDBC 的操作流程: 创建数据库连接池 DataSource通过 DataSource 获取数据库连接 Connection编写要执行带 ? 占位符…

21岁的人生赚51W!拒绝捞男捞女,翻身也要爱惜身体!——早读(逆天打工人爬取热门微信文章解读)

身体是革命的本钱 引言Python 代码第一篇 卢克文工作室 捞女在今天的中国是怎样的存在第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 我将我的健康视为生活的基石 不会为了短暂的成功而牺牲 我珍惜身体 知道健康是实现梦想的前提 引言 这里毕竟是一个程序员的代码学习平台…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS(Linux Virtual Server)的网络地址转换(NAT)模式是一种在网络层(第四层)实现负载均衡的方法。在NAT模式中,Director Server(DS)充当所有服务…

54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试

工程代码https://download.csdn.net/download/txwtech/89258409?spm1001.2014.3001.5501 54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试 import socket from ohos.net.socket; import process from ohos.process; import wifiManager from ohos.wifiMana…

sql 中having和where区别

where 是用于筛选表中满足条件的行,不可以和聚类函数一起使用 having 是用于筛选满足条件的组 ,可与聚合函数一起使用 所以having语句中不能使用select中定义的名字

51单片机软件环境安装

keli5的安装 把CID放到破解程序中 破解程序会给一串数字然后填到那个框中 驱动程序的安装 安装完了以后 设备管理器会出现这个 同时c盘会出现这个文件夹

Flask教程3:jinja2模板引擎

文章目录 模板的导入与使用 模板的导入与使用 Flask通过render_template来实现模板的渲染,要使用这个方法,我们需要导入from flask import rander_template,模板中注释需放在{# #}中 模板的第一个参数为指定的模板文件名称,如自定…

Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令

一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架,它结合了 Rust 的安全性和性能优势,以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点: 安全性:Rust 是一种注重安全性的编程语言,…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

分布式与一致性协议之一致哈希算法(二)

一致哈希算法 使用哈希算法有什么问题 通过哈希算法&#xff0c;每个key都可以寻址到对应的服务器&#xff0c;比如&#xff0c;查询key是key-01,计算公式为hash(key-01)%3,警告过计算寻址到了编号为1的服务器节点A&#xff0c;如图所示。 但如果服务器数量发生变化&#x…

vue3使用el-autocomplete请求远程数据

服务器端 RestController RequestMapping("/teacher") public class TeacherController {Resourceprivate TeacherService teacherService;GetMapping({"/v1/getTop10TeacherByName/","/v1/getTop10TeacherByName/{name}"})public ResultBean&l…

快速批量重命名文件(夹)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 我这里处理这4个文本&#xff0c;实际可以处理任意数量的文本和文件夹 1、打开工具&#xff0c;进入文件批量复制版块 2、点击“重命名” 3、把要重命名的…

使用Python爬取淘宝商品并做数据分析

使用Python爬取淘宝商品并做数据分析&#xff0c;可以按照以下步骤进行操作&#xff1a; 确定需求&#xff1a;确定要爬取的淘宝商品的种类、数量、关键词等信息。 编写爬虫程序&#xff1a;使用Python编写爬虫程序&#xff0c;通过模拟浏览器请求&#xff0c;获取淘宝商品的页…

Docker 中的 Nginx 服务为什么要启用 HTTPS

一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 安装Docker CE 20.10.17 s…

第182期 23ai:惊喜的全功能缓存True Cache-2安装部署(20240505)

数据库管理182期 2024-05-05 数据库管理-第182期 23ai:惊喜的全功能缓存True Cache-2安装部署&#xff08;20240505&#xff09;1 主机配置2 操作系统配置2.1 基础配置2.2 配置hosts2.3 安装preinstall RPM包2.4 创建目录2.5 配置环境变量 3 部署数据库3.1 部署DB软件3.2 创建监…

机器学习:基于K-近邻(KNN)、高斯贝叶斯(GaussianNB)、SVC、随机森林(RF)、梯度提升树(GBDT)对葡萄酒质量进行预测

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

linux上如何排查JVM内存过高?

怎么排查JVM内存过高&#xff1f; 前言&#xff1a; 想必工作一两年以后的同学都会逐渐面临到&#xff0c;jvm等问题&#xff0c;但是可能苦于无法熟练的使用一些工具&#xff1b;本文将介绍几个比较常用分析工具的使用方法&#xff0c;带着大家一步步定位分析问题。 1、top 查…

springmvc下

第二类初始化操作 multipartResolver应用 localeResolver应用 themeResolver应用 handlerMapping应用 handlerAdapter应用 handlerExceptionReslver requestToViewNameTranslator应用 viewResolver应用 flashMapManager应用 dispatcherServlet逻辑处理 processRequest处理web请…

目标跟踪—卡尔曼滤波

目标跟踪—卡尔曼滤波 卡尔曼滤波引入 滤波是将信号中特定波段频率滤除的操作&#xff0c;是抑制和防止干扰的一项重要措施。是根据观察某一随机过程的结果&#xff0c;对另一与之有关的随机过程进行估计的概率理论与方法。 历史上最早考虑的是维纳滤波&#xff0c;后来R.E.卡…

【C语言】分支和循环(上)

【C语言】分支和循环&#xff08;上&#xff09; 1、if语句1.2 else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题 2、关系操作符3、条件操作符4、逻辑操作符&#xff1a;与、或、非&#xff08;取反&#xff09;&#xff08;&&&#xff0c;||&#xff0c;&#xff0…