unity3d 数学基础与数学辅助类

Unity3D中的3D数学基础 在3D空间中,点(Point)是一个具有位置信息的对象,它由三个坐标值(x,y,z)表示。在3D空间中,点(Point)是具有位置信息的对象,通常由三个坐标值(x,y,z)表示。本文介绍了Unity3D中的3D数学基础知识,包括点、向量和坐标系的概念,向量运算的常见操作,矩阵变换的使用以及射线和碰撞检测的实现在Unity3D中的3D数学基础。本文介绍了Unity3D中的3D数学基础知识,包括点、向量和坐标系的概念,常见的向量运算,矩阵变换的使用以及射线和碰撞检测的实现。 阅读详情
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),因此你可以使用循环遍历子物体。

Unity3D中的数学基础知识---向量 一、向量概念及基本定义 1、向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量就是一个数组。 向量的维度就是向量包含的“数”的数目,向量可以有任意正数维,标量可以被认为是一维向量。 书写向量时,用方括号将一列数括起来,如[1,2,3] 水平书写的向量叫行向量 垂直书写的向量叫做列向量 2、向量的几何意义 几何意义上说,向量是有大小和方向的有向线段。向量的大小就是向量的长度(模)... 阅读详情

相关推荐

【拯救C盘】一文搞懂Windows修改Anaconda默认的虚拟环境存放路径及其原理

Anaconda创建的虚拟环境可能会默认保存在C盘,但C盘的存储空间很宝贵,由于每个虚拟环境的大小可能达到n个GB,稍不注意就会遇到C盘红色警告。因此有必要做点什么来拯救被虚拟环境占用的大部分空间!!!

Roach007的博客 3万+

Unity学习日志_3D数学基础

Unity学习日志_3D数学基础 1. Input类: InputManager为开发者提供了官方的移动所需的变量。 1. 需要用的静态方法: GetAxis(string axisName);返回相应名称的虚拟轴值 GetAxisRaw(string axisName);未经过平滑处理的GetAxis。 不要将Input.GetButton和GetKey系列方法用于物体移动。 这两个系列方法的返回值都为bool型,适合用来响应点击事件。 使用这两个系列的方法会将物体移动代码的操控写死。 2. M

BraveRunTo的博客 1164

深度学习笔记(3)——kernel(内核)与filter(滤波器)

本文仅仅简单介绍了kernel和filter的概念,介绍了确定filter和kernel个数的方法。

cs111211的博客 7135

Unity3D C#数学系列之判断两条线段是否相交并求交点

1 引言 问题:已知三维空间中四点A、B、C、D,如何判断线段AB与CD是否相交,若相交则求出交点。 分析: AB、CD要相交,则AB、CD必须要在同一平面内 快速排斥和跨立实验判断是否相交 几何法分析求出交点 2 求解 2.1 AB、CD是否共面 要判断AB、CD是否共面,其实就是判断A、B、C、D四个点是否共面。我们知道三点确定一个平面,如果AB垂直于ACD三点所在平面的法线,则说明A、B、C、D四点共面。 A、C、D三点所在平面的法线怎么求? 很简单,两个向量的叉乘就是这两个向量所在平面的法线。

老王的博客 7689

WPF实战:利用Live Charts实现高性能动态曲线可视化

本文详细介绍了如何在WPF中使用Live Charts实现高性能动态曲线可视化,特别适用于工业监控和金融分析等实时数据场景。通过增量渲染、内存复用和硬件加速等核心技术,Live Charts能够高效处理高频数据更新,显著提升图表流畅度。文章提供了从基础实现到工业级优化的完整解决方案,帮助开发者应对各种性能挑战。

weixin_29189373的博客 406

盘点那些好用的SAP FIORI App(二) -上传凭证Upload Journal Entry

SAP FICO运维问题及解决方案分享

lijinbao171022的博客 1542

Unity:Vector3类--点乘与叉乘

Unity:Vector3类_点乘与叉乘 (一)点乘 又称“点积”或“内积”。 公式:各分量乘积和 [x1,y1,z1]*[x2,y2,z2] = x1x2+y1y2+z1z2 几何意义:a·b = |a|·|b|cos<a,b> 两个向量的单位向量相乘后 再乘以二者夹角的余弦值。 API:float dot = Vector3.Dot(Va,Vb); 点乘应用 对于标准化过的向量,点乘结果等于两向量夹角的余弦值。 应用 :计算两向量夹角 float dot = Vector3.Dot(a.no

一名Unity工程师的养成方法 4718

【5G全网建设】Option3X和Option2模式建安市、兴城市和四水市核心网、承载网网络设计与部署

拓扑规划: Option 3X网络拓扑图规划 Option 2网络拓扑图规划 设备部署: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 数据配置: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 业务调试

weixin_67183034的博客 8850

3D数学基础学习笔记(Unity3d)

最近学习unity3d基础知识,学到了3D数据,做下笔记,包含一些自己的理解,如有问题希望指出 一、向量 1.向量的定义 向量:有大小有方向的物理量 类名:Vector3 向量大小:向量的长度 计算: api:Vector3.magnitude 单位向量:长度为1的向量 计算:向量/向量的大小 api:Vector3.normalized Vector3 unity3d 文档描述:用于表示 3D 向量和点。 向量既然有方向和大小,所以向量是一条线,Vector3对象作为向量时,表示向量的起点就

u012112787的博客 2686

微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)

本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。

weixin_29325007的博客 455

量化投资进阶:Fama-French三因子模型实战解析与Python实现

本文深入解析了Fama-French三因子模型,并提供了完整的Python实战指南。文章阐述了该模型如何通过引入市值因子(SMB)和价值因子(HML),对传统CAPM模型进行重要扩展,以更精准地解释股票收益来源。详细演示了使用Python获取数据、执行回归分析并解读结果(包括关键的阿尔法α)的全过程,并探讨了该模型在量化策略构建、风格诊断和业绩归因中的核心应用。

yog99的博客 1126

Unity 点乘&叉乘 应用实例

一 前言 1.概述     主要概述了点乘,叉乘的实用例子,没有讲述什么原理性的,偏向应用层。点乘叉乘数学原理性的东西比较“难记”,网上很多。实用举例,网上算是比较少吧。故,来总结一番。 2.可以解决的问题     I.如何计算角度     II.如何判断前后     III.如何判断逆时针还是顺时针。     IV.如何判断其他物体在目标物体左右。     V.如何计算...

weixin_30587025的博客 530

UE5 蓝图节点图文大全(300+蓝图,9万字+)

本文采用虚幻5.2.1版本,以图文的方式对蓝图节点进行介绍,包括蓝图节点的输入输出参数解释,并有中英文节点名称可参考。

一碗清深的博客 2万+

unity3d 数学的数学基础和辅助类

转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1.数学(点乘/叉乘)/unity3d的数学辅助类 2.坐标系统(本地/世界/屏幕) 3.Unity3d执行流程 4.计算角色和目标点的夹角。旋转角色朝向目标点,然后移动角色(样例) 5.Gizmos/inspector/地图编辑 ...

aofan9566的博客 196

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Unity 3D 开发中需要掌握的数学基础知识概要整理(一)

目录 Unity 3D 开发中需要掌握的数学基础知识概要整理(一) 学习目的: 一、3D 数学基础知识介绍 二、Unity 中的几种常用坐标系 三、向量的基本概念 Unity 3D 开发中需要掌握的数学基础知识概要整理(一) 学习目的: 3D数学:研究在3D几何世界中的数学问题。被广泛的应用于使用计算机来模拟3D世界的领域,比如图形学,游戏,虚拟现实和动画等。 ...

仙魁XAN 4495

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

U3D需要用到的数学基础知识

1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本地/世界/屏幕) 3. Unity3d运行流程 4. 计算角色和目标点的夹角,旋转角色朝向目标点,然后移动角色(例子) 5. Gizmos/inspector/地图编辑 6. 脚本文件间的数据交互 7. Yield return/协同线程/事件 8. Socket 9. Unity3D调用c++DLL 一.

仰望星空 2052

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Unity3D中基础数学

Unity3D 数学 Unity线性代数 Unity矩阵 向量 三角函数

chen2104718969的博客 1827

【Unity3D】游戏开发数学基础

内容摘取总结自《Unity3D脚本编程与游戏开发》(马遥,沈琰)第四章——游戏开发数学基础 搬运自我的博客:浮生如梦 岁月如歌 文章目录三维渲染流程示意图坐标系向量矩阵四元数****实例:第一人称视角的角色控制器**** 三维渲染流程示意图 坐标系 世界坐标系 全局坐标系是场景内所有物体和方向的基准,也称世界坐标系。在全局坐标系中的原点(0, 0, 0)是所有物体位置的基准,且全局坐标系指定了统一的x轴、y轴和z轴的朝向。 在Unity场景中,新建一个物体,坐标为(1, 2, 3)。那么它在x轴方.

Rayhirox的博客 4082

基于Unity3D的迷宫类解谜游戏的设计与实现

2.1 UUnity是由Unity Technologies开发一个能轻松创建3D游戏、建筑可视化、实时三维动画等互动内容的、多平台的综合型游戏开发工具,是一个技术全面的专业游戏引擎。通过Unity简单的用户操作界面,用户可以完成很多工作[4]。Unity3D是现如今大多数游戏开发团队的首选3D引擎,它不仅能制作3D游戏,在2D游戏的开发表现上也极为优秀。Unity3D不仅仅在游戏领域有广泛的应用,现在还广泛运用于虚拟现实、医学、动画影视等领域中,可以说其应用领域非常的广泛。

shen341341341的博客 4193
上一篇: 三维图形成象的基本原理
下一篇: C# 事件和Unity3D
Linux先生
博客等级 码龄20年 97粉丝 43原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值