• Unity常用的3D数学知识


    一.概述:

      Unity中常用的3D数学公式大部分是初高中的数学知识,封装在MathfVector2Vector3Vector4Quotinion等类中,可以到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中提供了Vector2Vector3Vector4对应相应空间中的二维向量三维向量四维向量,我们着重介绍常用的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实现的拓展方法

  • 相关阅读:
    存储那些事儿(二): 下一代Linux文件系统BTRFS简介
    RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)
    RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
    RabbitMQ消息队列(六):使用主题进行消息分发
    C++内存管理之shared_ptr
    C++程序调试方式总结
    匿名对象?临时对象?
    C++多态中虚函数表合并与继承问题
    C++继承体系中的内存分段
    C++继承体系中的内存对齐
  • 原文地址:https://www.cnblogs.com/movin2333/p/14952384.html
Copyright © 2020-2023  润新知