ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Unity常用的3D数学知识

2021-06-29 23:02:06  阅读:291  来源: 互联网

标签:函数 Vector3 Mathf Unity 源码 数学知识 向量 3D


一.概述:

  Unity中常用的3D数学公式大部分是初高中的数学知识,封装在Mathf\Vector2\Vector3\Vector4\Quotinion等类中,可以到Unity中查看相应的API或者查看Unity源码.对于数学知识,我将粘贴部分Unity源码,源码来自于Github上Unity开源代码,地址:Unity-Technologies/UnityCsReference: Unity C# reference source code. (github.com),源码版本2019.4.0.

二.Mathf类中的相关方法:

  Mathf是Unity提供的一个数学封装类,相比于C#中封装的Math类,Mathf增加了一些更适用于游戏开发的数学公式.Mathf是一个静态的结构体,其中的方法\常量等都是静态的,使用时用方法名直接调用即可.

  1.三角函数和绝对值\平方根等的相关方法,本质上是调用了C#中Math类的三角函数方法,作了进一步封装

  2.最小值\最大值等相关重载,实现不难

  3.其他对C#的Math类的方法封装及一些常量:PI\极小值等

  注意:在168行到172行的两个方法提供了角度制的角度和弧度制的角度的相互转换方法,这是Mathf自行封装的,157行的sign函数也是Mathf类自行封装,其返回值为-1或1.

  4.夹紧函数Clamp:这个函数的意思相信看到源码不难理解

  5.插值运算函数slerp:这个函数用到了Clamp01函数,源码中也有函数的实现公式,可以自行分析公式

  6.MoveTowards函数:从源码中可以看到,这个函数使用了信号函数sign使得current的值一直向target变化,每次运行变化maxDelta,当最后一次current和target的距离小于maxDelta时current直接变为target.MoveTowardsAngle函数用于处理角度的变化,其中涉及到的相关函数公式也在源码中,角度的移动相对较复杂,可以带入数据看看运算的过程,如取current为340,target为30,maxDelta为5,则Repeat函数的处理结果为50,返回后经过DeltaAngle处理后的结果也是50,最后MoveTowardsAngle函数中248行运行后target会变为390,正是30加上360的结果,保证了角度的变化方向的正确,可以自行带入更多数据验证这个函数的运行.

  7.PingPong函数:这个函数返回值在给定值t向右length范围内震荡.

 

   8.其他函数读者可自行查看.此外Unity源码中的大多数类和结构体都是使用多个partial拼成的,在另一部分partial中还提供了一些外部实现的拓展方法.

三.Vector3结构体:对于向量的运算,Unity中提供了Vector2\Vector3\Vector4对应相应空间中的二维向量\三维向量\四维向量,我们着重介绍常用的Vector3结构体,如果对于向量运算不熟练对这几个结构体的方法就难以理解.

  1.核心字段:三个坐标

  2.极小值

  3.插值运算:看源码中的公式不难理解,无非是对t进行Clamp01处理后再用于对三个坐标都进行线性插值,同时也提供了t不进行Clamp01检验的线性插值.

  4.MoveTowards:Mathf中MoveTowards函数的复杂版,对三个坐标都进行运算

  5.SmoothDamp:平滑改变向量值

  6.构造函数\索引器等

  7.set函数\缩放函数Scale\叉乘函数Cross:注意,Scale函数可以传入一个Vector3结构体使三个坐标各自按照指定比例缩放

  8.允许Vector3作为Hash表中key的一些重写方法

  9.用于光线等反射计算的Reflect函数:

  10.求向量的单位向量:

  11.向量的投影

  12.求向量夹角

  13.求向量终点距离(起点为同一点时)

 

   14.求向量模长相关:

  15.向量间的最值

  16.各个方向向量以及将向量的坐标全部取正或取负

  17.运算符重载

  18.其他方法:在这个结构体中还有一些过时的内容如fwd静态属性等,就不再赘述了,此外Vector3结构体也是分为两部分的,另一部分中主要也是一些extern实现的拓展方法

 

标签:函数,Vector3,Mathf,Unity,源码,数学知识,向量,3D
来源: https://www.cnblogs.com/movin2333/p/14952384.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有