搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Guff_9hys
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
高可用 Redis 服务架构分析与搭建
2
计算机键盘盲打方法,电脑键盘盲打练习方法 盲打键盘指法练习技巧
3
Spring Cloud Alibaba(三)Sentinel限流实现原理_sphu.entry 限流
4
数据库有哪些分类_hybird transation
5
转载---Flink 如何将聚合结果写入kafka ——读写canal-json
6
HEVC源代码分析(一)--词法分析_hevc 源码
7
git reflog 解析_git reflog 包含什么
8
通过minikube部署kubernetes_delete the existing 'minikube' cluster using: 'min
9
FFmpeg:跨平台音视频处理利器的全面介绍_ffmpeg是全平台吗
10
高考专科分数计算机,2017年高考全国各省高职专科,录取分数线陆续公布
当前位置:
article
> 正文
U3D需要用到的数学基础知识_unity跑酷游戏中有哪些数学原理
作者:Guff_9hys | 2024-06-25 14:33:33
赞
踩
unity跑酷游戏中有哪些数学原理
1. 数学(点乘/叉乘)/unity3d的数学辅助类
2. 坐标系统(本地/世界/屏幕)
3. Unity3d运行流程
4. 计算角色和目标点的夹角,旋转角色朝向目标点,然后移动角色(例子)
5. Gizmos/inspector/地图编辑
6. 脚本文件间的数据交互
7. Yield return/协同线程/事件
8. Socket
9. Unity3D调用c++DLL
一. Unity3d中需要的基础数学知识(vector/matrix/transform)
看到这几个单词,我想在游戏引擎里面都挺常见的,unity3d里面也不例外!虽然unity给我们封装的这么好,会用就可以了,但是知其然,还是对自己比较有帮助的。因为以后要是该用其他的引擎了呢?不想一辈子都被这些工具牵制的话,就必须理解这些可能会比较枯燥的数学知识了。当然这里面不会去讨论太过复杂的数学知识,当然有兴趣,可以多看点,但是不用花费他多的时间(除了想当数学家的除外),不明白的时候看一看就ok了!有了这些知识,再去看那些unity3d给我的数学辅助类,就用起来就清爽很多了!
1. 向量(vector)
向量有两个重要的属性长度和方向
,举例子吧!在空间里面物体移动要知道物体移动的方向和距离用向量这个数学工具就非常方便描述,还有摄像机的观察方向、光线的走向等。
在不包含位置信息,所以它可以独立于坐标系统。只要向量长度和方向相同就可以认为是相等的。引入坐标系统不会给向量添加额外的信息。所以向量的位置不会影响他的属性。在讨论位置和向量的时候,有一个很容易混淆的概念,就的点和向量,在unity3d中有时候用vector类描述一个点,因为vector里面有x、y、z三个float变量。Vector(x,y,z)是点还是向量,要仔细斟酌。或者我理解有误,有知道的朋友希望告知。
单位向量和向量的模这两个概念很基础也很重要。具体概念我就不重复了,但是要知道这两个向量有什么作用。单位向量可以用来表示方向,模可以用来表示距离。我门可以用这两个概念去计算物体往哪一个方向移动,移动距离是多少。至于物体旋转,要涉及到向量的计算,后面会提及到。
向量运算包括:加法、减法、数乘、叉积,对于运算,就不提及数学计算和概念了。百度下都知道了,大家都是有文化的人,哈哈..开玩笑了!举例子吧!想象下你要去跟踪一个物体移动,你发现自己的跟踪方向有了偏差,你要怎么修正的方向呢?如果你说用眼睛,那可以,但是计算机是瞎的啊!你给计算机按个眼睛吧!计算机只会数值计算,当然你要用数学模型去表述了,然后计算啦!这时候你可以用向量减法,画下向量减法的图像,是不是很方便就可以解决了!再举一个例子,你要去追击一个物体,他总是东拐西拐的,我要速度比他快,但是方向不对的话是很难去拦截他下来的,那我要怎么办呢?想象下向量加法的图形,根据两个人的速度,只要我的速度比你快,用向量加法和数乘(数乘可以用来控制速度),我就可以在路上给你按木桩,让你撞死,守株待兔还是前途的嘛。再举一个例子,如果我想知道目标物体,偏我的角度是多少,我可用点积,计算出我门的角度。例子还有很多,懒得举了,不然就成举重冠军了,给个连接:
http://wenku.baidu.com/view/f279471514791711cc79176a.html
说完向量,我想提及一个小细节,很有必要的细节。因为向量的x、y、x是float类型的。由于float的不精确,我门应该认为两个浮点相等的可以存在一定的误差的。我门在看到一些游戏代码里面两个浮点数相等可能是这样的:
Const float EPSILON=0.001f;//误差范围
bool Equal(float num1,float num2)
{
//只要num1和num2在误差范围内,就认为相等放回真,否则放回假
Return fabs(num1-num2)<EPSILON?true:false;
}
2. 矩阵(matrix)与变换(transform)
矩阵这玩意是用来干嘛用的呢?大学老师没告诉过我们,至于为什么不告诉我们呢?就不加讨论了,反正教我的是业余的!毕竟老师没有告诉过我,错了希望要指正我啊!
矩阵在数学书上说是是由方程组的系数和常数组成的。
从数学原理上, 矩阵代表了从一个线性空间到另一个线性空间的变换
.
通过一个教科书上的例子,简单的描述下计算公式,估计是比较笨的原因,我不喜欢直接用数学符号描述,只喜欢看图。
矩阵说白了,个人理解就是让你“穿越”用的,让你的向量从一个空间转换到另外一个空间的向量,一个位置移动(或者旋转)到另外一个位置。至于空间有本地坐标系统,世界坐标系统,屏幕坐标系统等,以后会谈及!我门看下矩阵变换有几种:平移,旋转,缩放,这些unity3d都已经封装好了。想具体看下他们是怎么变换的,我懒得画图板画了,去网络上找一个图片来!按照矩阵的算法,用向量乘以变换矩阵套下公式,比较下转换前后的值,就知道了!
每一种变换,都有对应的变换矩阵,用向量或坐标乘以变换矩阵,即可对它们完成变换。变换矩阵之间,也可以做乘法叠加,叠加的几何意义是把变换按叠加的先后顺序复合到一个矩阵中去,注意矩阵叠加不满**换律。变换矩阵是一个4 x 4的矩阵,所以向量和坐标需要扩展到齐次空间中。
向量:(x, y, z, 0)
坐标:(x, y, z, 1)
他们的区别在于第四项,向量的第4项取0,可以使矩阵的平移变换失效,而不影响旋转和缩放运算。坐标第4项取1,使平移有效,并且平移变换的比例不会被变化。如果取2,则其平移的距离则是矩阵中定义的2倍。以此类推。注意,在变换后,有可能出现第4项非0/1 的情况,这个时候,我们必须要做一个映射动作,将它从齐次空间映射回3维空间,方法很简单:
(x, y, z, w) --> (x/w, y/w, z/w, w/w) --> (x/w, y/w, z/w, 1) --> (x/w, y/w, z/w)
3. 平面(plane)与射线(Ray)
平面:
n Dot P + d = X;
X<0,点P位于平面的背面,|X| 即点P到平面的距离
X>0,点P位于平面的正面,|X| 为点P到平面的距离
射线:
设起点为P0, 方向为u,t 为参数,t 属于 [0, 无穷大),当t 属于(-无穷大,+无穷大)时就表示直线。
p(t) = p0 + t * u
之所以要将他们一起放一起是他们两在实际的开发中,是常在一起使用的。至少我用的比较多,举个例子吧!
比如我们点击下2D的屏幕坐标,要确定游戏3D空间中位置,怎么确定呢?如何用只有x,y轴的二维鼠标,尽量精准的取得x,y,z三维空间的位置,是一个从三维出现就一直被讨论的主题。即使在图形技术如此发达的今天,三维空间的点击仍然只能说"大概准确"。鼠标点击来确定三维空间的位置和摄像机的关系非常大,为什么要说和摄像机有很大的关系呢?如果你熟悉Direcx3D里面的绘制流水的话,就知道摄像机把3d空间坐标转化为屏幕坐标起着很关键的作用,如裁剪(clipping),投影窗口(projection window),近裁减,远裁剪,投影平面等。写一个段unity的代码吧!(代码格式调不好,就随便看下吧)。
void Update ()
{
if(Input.GetMouseButtonDown(0))
{
RayControl();
}
if(flagMove)
{
if(Vector3.Distance(transform.position,mousePos)>1)
{
transform.Translate(transform.worldToLocalMatrix* ransform.forward* Time.deltaTime*5);//transform.forward是世界坐标,通过transform.worldToLocalMatrix转换矩阵转到本地坐标 然后在本地坐标运动,没有必要必须在本地坐标系运动 但是必须注意要统一起来。
}
else
{
flagMove=false;
}
}
}
void RayControl()
{
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);//向屏幕发射一条射线(注意这个对象是主摄像机哦)
if(Physics.Raycast(ray,out hit,200))射线长度为200 和地面的碰撞盒做检测
{
GameObject targetPos=GameObject.CreatePrimitive(PrimitiveType.Sphere);//实例化一个Sphere
targetPos.transform.localScale=new Vector3(0.5f,0.5f,0.5f);
mousePos=hit.point;//获取碰撞点坐标
mousePos.y=transform.position.y;
targetPos.transform.position=mousePos;//Sphere放到鼠标点击的地方
targetDir=mousePos-transform.position;//计算出朝向
Vector3 tempDir=Vector3.Cross(transform.forward,targetDir.normalized);//用叉乘判断两个向量 是否同方向
float dotValue=Vector3.Dot(transform.forward,targetDir.normalized);//点乘 计算两个向量的夹角,及角色和目标点的夹角
float angle=Mathf.Acos(dotValue)*Mathf.Rad2Deg;
if(tempDir.y<0)//这块 说明两个向量方向相反,这个判断用来确定 假如两个之间夹角30度 到底是顺时 还是逆时针旋转。
{
angle=angle*(-1);
}
print(tempDir.y);
print("2:"+angle);
transform.RotateAround(transform.position,Vector3.up,angle);
flagMove=true;
}
}
注意事项:写完了才发现 原来没必要这么麻烦,这样transform.forward=(mousePos-transform.position).normalized就可以直接让角色朝向目标点 RayControl函数 好多都可以省了
4. unity3d 数学辅助类
4.1 Mathf提供数学计算的函数与常量,面有所有数学计算时需要用到的函数。Mathf对象没有构造函数,是一个固有的对象,并不像String那样是对象的类,因此没有构造函数 Math()。
4.2 Matrix4x4一个标准的4x4变换矩阵一个变换矩阵可以执行任意的线形3D变换(例如,平移,旋转,缩放,切边等等)并且透视变换使用齐次坐标。脚本中很少使用矩阵:最常用Vector3,Quaternion,而且Transform类的功能更简单。单纯的矩阵用于特殊情况,如设置非标准相机投影。
4.3 Quaternion四元数用于表示旋转它们基于复数的并不容易被直观地理解,因此你没有必要访问或修改单个Quaternion组件(x,y,z,w);通常你只需把现有的旋转(例如,来自Transform)并使用它们来构造新的旋转(例如,在两个旋转间平滑地插值)。四元数函数你99%的时间你会使用它(其他函数仅额外使用)
Quaternion.LookRotation,Quaternion.Angle,Quaternion.Euler,Quaternion.Slerp,Quaternion.FromToRotation,Quaternion.identity。
4.4 Ray射线是一个无穷的线,开始于origin并沿着direction方向
4.5 Rect一个由x、y位置和width、height大小定义的二维矩形,Rect结构主要用于2D操作。UnityGUI系统很普遍的使用它,以及在屏幕上定位摄像机
4.6 Vector2/vector3/vector4 表示向量和点, 结构用于在Unity传递3D位置和方向。它也包含做些普通向量运算的函数,如角度,模,单位向量,叉乘,点乘,向前向左向右向上,插值,投影,反射,转向……..
4.7 最后一个大总管,transform物体的位置、旋转和缩放,场景中的每一个物体都有一个Transform。用于储存并操控物体的位置、旋转和缩放。每一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。他们也支持计数器(enumerator),因此你可以使用循环遍历子物体。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Guff_9hys/article/detail/756506
推荐阅读
article
【
Unity
】
TextMeshPro
生成
中文字体
(附7000
常用字
)_
unity
中文字体
...
TextMeshpro创建
中文字体
,7000汉字+符号+英文字符集_
unity
中文字体
unity
中文字体
...
赞
踩
article
unity 导出 包 到
andro
id
studio
中打包_
plugin
[
id
: '
com
.a...
解决方案:Andro
id
Studio项目gradle下载慢问题_
andro
id
studio
下载依赖慢-CSDN博客_...
赞
踩
article
Unity
弹框
选择
文件
、
文件
夹、保存
文件
_
unity
选择
文件
...
最近我负责一个模拟仿真项目,我使用
Unity
3d + 发布 PC 平台作为解决方案。其中有一个功能,需要弹框让用户
选择
...
赞
踩
article
2024
年
Unity
跨平台
UI
解决方案
:可能是最全的
FairyG
UI
系列教程(2),2024
年
最新2...
本人从事
Android
开发已经有十余
年
,算是一名资深的移动开发架构师了吧。根据我的观察发现,对于很多初中级
Android
...
赞
踩
article
Unity
全局拦截UI
点击
事件
IPointerClickHandler
_
unity
ipointe...
策划提了个需求,具体为给游戏内的所有按钮都加一个0.5s的公CD笨方法是写个脚本给所有的和挂上,然后控制
点击
事件的响应但...
赞
踩
article
【
unity
】关于
unity
3D
摄像机
视角
移动
的几种方式详解_
unity
鼠标
控制摄像头...
在做虚拟仿真或数字孪生等项目中,常常会遇到需要自由
移动
视角的场景。最近在用
unity
制作一个有关3D打印机的数字孪生项目...
赞
踩
article
unity
和
python
哪个好学
_
学习
手机游戏
开发
的两个方向
Cocos2d
-x 和
Unity
3...
首先说一说
学习
手机游戏
(移动游戏)这件事。眼下移动互联网行业的在以井喷状态发展。全球几十亿人都持有智能终端设备(ios ...
赞
踩
article
自然语言
处理
(
NLP
)——
神经网络
自然语言
处理
(Neural
NLP
)基础知识...
语料库准备阶段的目标是创建一个既能够支持模型学习语言的普遍特性,又能针对特定任务进行优化的数据集。
处理
形式和内容上的异质...
赞
踩
article
深入了解
Unity
项目
模板
(Deep Dive in
Unity
Project
Template
)...
本文介绍了
Unity
中的
项目
模板
,可以帮助开发者了解
项目
类型选择以及
模板
的使用_
unity
2022新建
项目
时的
模板
都有...
赞
踩
article
2023
最新
unity
入门
教程【非常详细】从零
基础
入门
到精通
,
看
完
这一篇就够了!!!
_
unity
...
伴随游戏行业的兴起
,
unity
引擎的使用越来越普遍
,
本文章主要记录博主本人
入门
unity
的相关记录大部分依赖siki学院...
赞
踩
article
Unity
2024
安装
教程
(
非常详细)从零基础入门
到
精通
,
看完这一篇就够了
(
附
安装
包
_
unity
安...
网络安全行业产业以来
,
随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全...
赞
踩
article
unity
学习
路线
_
学习
unity
要分几个
阶段
...
学习
Unity 开发接近一年了,从开始对 Unity 一无所知,到现在能模仿制作出一个完整游戏,对个人成长来说,也算是...
赞
踩
article
Android
集成
Unity
的两种方案实战_
android
unity
...
本文简要介绍了
Android
平台常见的动效及其使用方式,重点阐述并使用代码演示了
Android
客户端中
Unity
3D引擎...
赞
踩
article
【.NET6+
WPF
】
WPF
使用
prism
框架+
Unity
IOC容器实现
MVVM
双向绑定和依赖
注入
...
前言:在C/S架构上,
WPF
无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在
使用
Winform开发C/S架...
赞
踩
article
unity
,
Mathf
.
Clamp
方法的使用_
unity
mathf
.
clamp
...
Mathf
.
Clamp
是Unity引擎中的一个静态方法
,
用于将一个值限制在指定的范围内。它可以用于限制数值、位置和旋转等...
赞
踩
article
Unity
C# 之 使用
HttpWebRequest
基础知识
/
HttpWebRequest
进...
可以使用
Unity
WebRequest 访问,不过好似只能用协程的方式,并且访问只能在主线程中;所以这里使用 C# 中...
赞
踩
article
【
Unity
】苹果(IOS)
开发
证书
保姆级申请教程_
unity
ios
...
ios
开发
证书
,描述文件,.p12_
unity
ios
unity
ios
...
赞
踩
article
Unity
HDRP
2023
Release
-Notes...
Unity
HDRP
2023
Release
-Notes
Unity
HDRP
2023
Release
-Notes ...
赞
踩
article
Unity
-
PicoVR
快速开始
_
unity
vr 相关
插件
...
相信很多人都没有VR设备然后对VR开发学习的,所以这里讲没有VR设备,在电脑上进行运行。
_
unity
vr 相关
插件
un...
赞
踩
article
[
Unity
]
ShaderGraph
实现
Sprite
图片描边/
发光
效果
_
unity
图片边缘
发光
...
[
Unity
]
ShaderGraph
实现
Sprite
描边
发光
效果
。超详细解说,内含完整连线图及下载资源。_
unity
图...
赞
踩
相关标签
unity
前端
游戏引擎
ui
android studio
android
ide
面试
学习
cocos2d
自然语言处理
神经网络
人工智能
鸿蒙