Unity 向量

简介: 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基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
422 0
|
图形学
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
452 1
|
图形学
Unity基础——向量
Unity基础——向量
518 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | 求解 两个向量的夹角度数
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】 ☀️ | 求解 两个向量的夹角度数
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity 四元数、欧拉角 与 方向向量 之间转换
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。
|
图形学
Unity3d数学基础之向量
这只是基础的一些数学知识,后面会为大家整理一些,unity中如何使用向量,向量在unity中的各种算法及其运算法则与mathf函数的使用。 向量是2D、3D数学研究的标准工具,在3D游戏中向量是基础。
975 0
|
4月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
237 6
|
4月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
330 5
|
3月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
180 4
|
3月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
196 3