Unity 向量
向量的加减法本文就不再赘述了,本文侧重介绍脚本中的向量写法
一、向量的数乘
定义:k(x,y,z)=(kx,ky,kz)
若向量长度为L,k取1/L,就恰好能让原向量长度变成1,变成了单位向量,这称为向量的标准化 。
由于长度为1的向量很适合表示方向,因此经常会将向量标准化,下面举几个例子:
Vector3 a=new Vector3(2,1,0);
Vector3 na=a/a.magnitude; //a.magnitude是a的长度,术语叫做“a的模”
//以上写法等价于
Vector3 na2=a.normalized;
//
Vector3 na3=Vector3.Normalized(a);
//
Vector na4=(1/a.magnitude)*a;
以上代码用到的向量的两个常用属性:magnitude(模)和normalized(标准化)。
二、向量的点乘
定义:a · b=|a| · |b|cosα
(x1,y1,z1) · (x2,y2,z2)=x1x2+y1y2+z1z2
物理意义:投影距离
点乘的结果不再是向量,而是一个数,这点要注意一下。
点乘满足交换律,因此a,b谁先谁后都一样。
下面介绍相关脚本
Vector3 a=new Vector3(2,1,0);
Vector3 b=new Vector3(3,0,0);
Vector3 dir_b=b.normalized;
float pa=Vector3.dot(a,dir_b);//dot是点乘函数
三、向量的叉乘
定义:|a × b|=|a||b|sinα
与点乘不同,叉乘结果是一个新的向量,方向垂直于原来两个向量构成的平面,具体结果用左手定则判断(用左手还是右手与坐标系有关)。
左手定则:手掌沿第一个向量放平,向第二个向量我全,拇指的指向即叉乘方向。如下图

叉乘不满足交换律,若交换则叉乘方向变相反。即a×b=-b×a
叉乘在游戏开发中的一个重要用途:求法线。
在游戏开发中,平面要区分正反两面,因此法线用向量表示,法线方向就是平面方向,。一般发现长度固定为1以便计算。
用叉乘可以很方便地获取法线。例如,玩家站在地形的一个平面上,想要获取平面的法线,需要先用启发方法获得平面上的任意两个向量,只要这两个向量夹角不为0或180,取它们的叉乘就可以获得法线向量,对镜脚本写法如下
Vector3 a=new Vector3(2,1,1);
Vector3 b=new Vector3(3,0,2);
Vector3 n=Vector3.Cross(a,b);//n为a,b平面的法线。Cross为叉乘
n=n.normalized;//将n标准化
四、Vector3
Vector3属于struct(结构体),这部分给出Vector3的属性、方法、运算符
Vector3属性
| 字段或属性 | 说明 |
| x,y,z | 略 |
| normalized | 得到标准化向量(单位向量) |
| magnitude | 得到向量的模,是标量 |
| sqrMagnitude | 得到模的平方。运算速度比得到模要快,因为少一部开方运算。在仅比较两个长度,不需要求精确求出长度时非常有用 |
Vector3方法
| 方法 | 说明 |
| Cross | 向量叉乘 |
| Dot | 向量点乘 |
| Project() | 计算向量在另一个向量上的投影 |
| Angle() | 返回两个向量的夹角 |
| Distance() | 返回两个向量的距离 |
Vector3的运算符有还有+,-,*,/,==,!=。
五、向量坐标系的转换
在Unity中,可以使用transform.TransformPoint()方法将局部坐标转换为世界坐标,也可以使用transform.InverseTransformPoint()方法将世界坐标系转换为局部坐标系。
其实也有向量的坐标系转化函数,分别是transform.TransformDirection()和transform.InverseTransformDirection()。
下面举一个实例说明如何通过全局坐标系和局部坐标系改变物体的运动方向:
1.创建一个Cube,设置旋转的Y为300
2.新建脚本CoordinateLocal.cs,内容如下:
using UnityEngine;
public class CoordinateLocal:MonoBehaviour{void Update(){transform.Translate(Vector3.forward*Time.deltaTime);}
}
将脚本挂在Cube上,运行游戏,物体会沿着自身的z轴方向慢慢移动
3.新建脚本CoordinateWorld.cs,内容如下:
using UnityEngine;
public class CoordinateWorld:MonoBehaviour{void Update(){Vector3 v=transform.InverseTransformDirection(Vector3.forward);transform.Translate(v*Time.deltaTime);}
}
将新建的脚本挂到Cube上,取消勾选原来的脚本,运行游戏,发现Cube沿着世界坐标系的z轴方向移动了。下面解释一下原因:
transform.Translate()函数默认是以局部坐标系为基准的,因此在脚本1中,虽然参数为Vetor3.forward,但依然会以局部坐标系的前方为准。
第2个脚本稍微复杂一些。由于Translate默认以局部坐标系为准,因此要把世界坐标系的forward转化为局部坐标系的向量v,然后用v来作为Translate的参数
相关文章:
Unity 向量
向量的加减法本文就不再赘述了,本文侧重介绍脚本中的向量写法 一、向量的数乘 定义:k(x,y,z)(kx,ky,kz) 若向量长度为L,k取1/L,就恰好能让原向量长度变成1,变成了单位向量,这称为向量的标准化 。 由于长度…...
Apache Tomcat AJP协议文件读取与包含
永远也不要忘记能够笑的坚强,就算受伤,我也从不彷徨。 0x01.漏洞情况分析 Tomcat是Apache软件基金会Jakarta 项目中的一个核心项目,作为目前比较流行的Web应用服务器,深受Java爱好者的喜爱,并得到了部分软件开发商的…...
实验10 人工神经网络(1)
1. 实验目的 ①理解并掌握误差反向传播算法; ②能够使用单层和多层神经网络,完成多分类任务; ③了解常用的激活函数。 2. 实验内容 ①设计单层和多层神经网络结构,并使用TensorFlow建立模型,完成多分类任务…...
OPPO关停哲库业务,工程师造芯何去何从?
5月12日(上周五),新浪科技从OPPO处了解到,OPPO将终止ZEKU业务。3000多人团队突然原地解散,网上唏嘘声一片! ZEKU最初成立于2019年,是OPPO的全资子公司,欧加集团百分之百注资成立。总…...
面试被问麻了....
前几天组了一个软件测试面试的群,没想到效果直接拉满,看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经,感觉非常有参考价值,于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋,打开…...
AspNetCore中的配置文件详解
1 配置文件 程序开发中,有些信息是要根据环境改变的,比如开发环境的数据库可能是本地数据,而生产环境下需要连接生产数据库,我们需要把这些信息放到程序外面,在程序运行时通过读取这些外部信息实现不改变程序代码适应…...
实时更新天气微信小程序开发
1.新建一个天气weather项目 2.在app.json中创建一个路由页面 当我们点击保存的时候,微信小程序会自动的帮我们创建好页面 3.在weather页面上书写我们的骨架 4.此时我们的页面很怪,因为没有给它添加样式和值。此时我们给它一个样式。(样式写在…...
css渐变
线性渐变 liner-gradient属性值用来设置线性渐变,第一个参数值是方向,默认是从上往下,往后就是渐变颜色的种类。 background-image:liner-gradient(方向,颜色1,颜色2...) .box {display: flex;width: 400px;height: …...
《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack
来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 2 MapReduce and the New Software Stack Computing cluster means large collections of commodity hardware, including conventional processors (“compute nodes”) connected by Ethernet …...
HTML零基础快速入门(详细教程)
1,HTML代码特点 <html><head></head><body>hello world!</body> </html>HTML代码有以下特点: html代码是通过标签来组织的,而标签是由尖括号< >组织的,也可被叫作元素(ele…...
Kubernetes第5天
第七章 Service详解 本章节主要介绍kubernetes的流量负载组件:Service和Ingress。 Service介绍 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着…...
RK3568平台开发系列讲解(调试篇)debugfs 分析手段
🚀返回专栏总目录 文章目录 一、enable debugfs二、debugfs API三、使用示例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图: 从这…...
【Spring框架全系列】SpringBoot配置日志文件
🍧🍧哈喽,大家好,我是小浪。那么上篇博客我们学习了SpringBoot配置文件的相关操作,本篇博客我们将学习一个新的知识点,SpringBoot日志文件。🖥🖥 📲目录 一、日志是什么…...
事务 ---MySQL的总结(六)
事务 多进程进行并改变同一个数据,如果没有进行版本控制,就会出现数据不确定的问题,为此引入了事务的概念。可以进行数据回滚,解决潜在的问题。 事务的概念 一组的DML组成,这一些的DML要么同时成功,要么同…...
22 标准模板库STL之容器适配器
概述 提到适配器,我们的第一印象是想到设计模式中的适配器模式:将一个类的接口转化为另一个类的接口,使原本不兼容而不能合作的两个类,可以一起工作。STL中的容器适配器与此类似,是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能和接口。之所…...
目标检测YOLO实战应用案例100讲-基于深度学习的自动驾驶目标检测算法研究
目录 基于深度学习的自动驾驶目标检测算法研究 相关理论基础 2.1 卷积神经网络基本原理...
服务网关Gateway
前言 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态…...
(4)定时器
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成 作用: 用于计时系统替代长时间Delay,提高运行效率和速度任务切换 STC89C52定时器资源: 定时器个数:3个(T0,T1,T2…...
项目实现读写分离操作(mysql)
读写分离 1.问题说明 2.读写分离 Master(主库)----(数据同步)—> Slave(从库) Mysql主从复制 mysql主从复制 介绍 mysql主从复制是一个异步的复制过程,底层是基于mysql数据库自带的二进制日志功能。就是一台或多台…...
VP记录:Educational Codeforces Round 148 (Rated for Div. 2) A~D1
传送门:CF 前题提要:本人临近期中,时间较紧,且关于D2暂时没有想到优化算法,因此准备留着以后有时间再继续解决 A题:A. New Palindrome 简单的模拟题,考虑记录每一个字母出现的次数.很容易发现奇数次的数字只能出现一次.因为最多只能在正中间放一个.并且因为不能和初始字符相…...
基于Docker与BPMN.js的Activiti流程图云端部署实战
1. 从零认识Activiti与BPMN.js 如果你正在寻找一种简单高效的方式,将企业业务流程搬上云端,那么DockerBPMN.jsActiviti的组合绝对值得尝试。Activiti作为一款轻量级工作流引擎,能帮你把复杂的审批流程、任务流转自动化;BPMN.js则是…...
3步实现知网文献批量下载:CNKI-download自动化工具完整指南
3步实现知网文献批量下载:CNKI-download自动化工具完整指南 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 在学术研究的道路上&…...
从Go到Kotlin:对比学习Channel的5个核心用法与避坑指南
从Go到Kotlin:Channel核心用法与实战避坑指南 1. 理解Channel的本质 对于熟悉Go语言的开发者来说,Kotlin的Channel概念并不陌生。两者都源自相同的并发模型理念,但在实现细节和使用方式上存在显著差异。 Channel本质上是一个线程安全的队列&a…...
英红九号金毛毫哪个牌子好?2026正宗品牌测评与选购指南
英红九号金毛毫,作为英德红茶的 “顶流单品”,以明前单芽为原料,兼具蜜香、花香与甜润口感,是红茶爱好者的心头好。但市面上品牌众多,如何选到正宗、高性价比的产品?本文从干茶、茶汤、叶底三大核心维度&am…...
AnyChart 的tagCloud组件
组件渲染失败错误protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_mistake_analysis);MistakeDao mistakeDao new MistakeDao(MistakeAnalysisActivity.this);List<String> subjectErrorlist…...
怎么轻松配置拯救者工具箱:联想笔记本性能优化完整指南
怎么轻松配置拯救者工具箱:联想笔记本性能优化完整指南 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit Lenovo L…...
告别裸机SPI轮询:在ZYNQ上为W25Q80 Flash打造高效驱动层(附C语言源码)
告别裸机SPI轮询:在ZYNQ上为W25Q80 Flash打造高效驱动层(附C语言源码) 在嵌入式系统开发中,SPI Flash存储设备如W25Q80系列因其高性价比和易用性被广泛采用。然而,许多开发者在使用ZYNQ这类高性能SoC时,仍…...
从零配置到向量相加:在VS2022中构建你的第一个CUDA程序
1. 环境准备:搭建CUDA开发环境 第一次接触CUDA编程时,最让人头疼的就是环境配置。记得我刚开始学习CUDA时,光是安装驱动和配置VS2022就折腾了一整天。现在回想起来,其实只要按照正确的步骤操作,整个过程可以非常顺利。…...
新概念英语第一册141_Sally s first train ride
Lesson 141: Sally’s first train ride 萨莉第一次乘火车旅行 Watch the story and answer the question Why was the mother embarrassed? Because Sally said the middle-aged lady was ugly.Key words and expressions excited 兴奋的get on 登上middle-age…...
Local SDXL-Turbo实操手册:从键盘输入到画面生成的完整链路
Local SDXL-Turbo实操手册:从键盘输入到画面生成的完整链路 1. 什么是Local SDXL-Turbo? Local SDXL-Turbo是一个基于StabilityAI SDXL-Turbo构建的实时绘画工具。与传统的AI绘画工具需要等待几分钟生成不同,这个工具实现了真正的"打字…...
