引擎,实战API,实战API应用指南

马肤

温馨提示:这篇文章已超过449天没有更新,请注意相关的内容是否还可用!

摘要:本文介绍了引擎的实战API,通过API的使用,可以实现更高效、更灵活的引擎操作。本文着重介绍了API的主要功能和使用方法,并强调了实战应用的重要性。使用API可以大大简化开发过程,提高开发效率和代码质量。

一、三维数学

1、向量

一个数字列表,表示各个维度上的有向位移;

一个有大小有方向的物理量(大小为模长,方向描述空间中向量的指向);

模长

引擎,实战API,实战API应用指南 第1张

方向

引擎,实战API,实战API应用指南 第2张

 点乘

引擎,实战API,实战API应用指南 第3张

根据三角函数cos$ = x / |A|    所以如上图 x = |A| cos$ 

引擎,实战API,实战API应用指南 第4张

引擎,实战API,实战API应用指南 第5张

引擎,实战API,实战API应用指南 第6张

引擎,实战API,实战API应用指南 第7张

引擎,实战API,实战API应用指南 第8张

引擎,实战API,实战API应用指南 第9张

叉乘

引擎,实战API,实战API应用指南 第10张

引擎,实战API,实战API应用指南 第11张

引擎,实战API,实战API应用指南 第12张

引擎,实战API,实战API应用指南 第13张

引擎,实战API,实战API应用指南 第14张

引擎,实战API,实战API应用指南 第15张

引擎,实战API,实战API应用指南 第16张

由于

向量减

引擎,实战API,实战API应用指南 第17张

引擎,实战API,实战API应用指南 第18张

向量加

引擎,实战API,实战API应用指南 第19张

引擎,实战API,实战API应用指南 第20张

引擎,实战API,实战API应用指南 第21张

向量缩放

引擎,实战API,实战API应用指南 第22张

引擎,实战API,实战API应用指南 第23张

引擎,实战API,实战API应用指南 第24张

2、函数

三角函数

引擎,实战API,实战API应用指南 第25张

引擎,实战API,实战API应用指南 第26张

引擎,实战API,实战API应用指南 第27张

反三角函数

引擎,实战API,实战API应用指南 第28张

引擎,实战API,实战API应用指南 第29张

引擎,实战API,实战API应用指南 第30张

 角度与弧度

引擎,实战API,实战API应用指南 第31张

引擎,实战API,实战API应用指南 第32张

引擎,实战API,实战API应用指南 第33张

引擎,实战API,实战API应用指南 第34张

3、旋转

欧拉角

引擎,实战API,实战API应用指南 第35张

引擎,实战API,实战API应用指南 第36张

引擎,实战API,实战API应用指南 第37张

四元数

引擎,实战API,实战API应用指南 第38张

引擎,实战API,实战API应用指南 第39张

引擎,实战API,实战API应用指南 第40张

引擎,实战API,实战API应用指南 第41张

引擎,实战API,实战API应用指南 第42张

引擎,实战API,实战API应用指南 第43张

引擎,实战API,实战API应用指南 第44张

引擎,实战API,实战API应用指南 第45张

二、Lerp-线性插值-平滑运动

1、减速插值

A到B点的1/3在A';剩余A'到B的1/3在A'',以此类推直到移动到B点的过程叫Lerp线性插值的效果,且这个过程呈现减速趋势。

引擎,实战API,实战API应用指南 第46张

引擎,实战API,实战API应用指南 第47张

引擎,实战API,实战API应用指南 第48张

2、变速插值

物体先向前走,再向后走,最后向前走

引擎,实战API,实战API应用指南 第49张

引擎,实战API,实战API应用指南 第50张

引擎,实战API,实战API应用指南 第51张

三、Quaternion-四元数-旋转

1、Quaternion.identity

归一化的处理,就是把rotation改成 欧拉角表示为(0,0,0)

引擎,实战API,实战API应用指南 第52张

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.rotation = Quaternion.identity;
    }
}

引擎,实战API,实战API应用指南 第53张

2、Quaternion.eulerAngles

把四元数转成欧拉角

public Quaternion rotation = Quaternion.identity;
    void Example() {
        rotation.eulerAngles = new Vector3(0, 30, 0);
        print(rotation.eulerAngles);// 结果是 (0.0, 30.0, 0.0)
    }

3、Quaternion.SetFromToRotation

通过开始位置到终点位置来创建一个rotation

引擎,实战API,实战API应用指南 第54张

比如做了这些绑定, 每一帧都平滑的设置位移,并且根据当前帧的位移,转一下物体,最后效果是物体转着圈的转到了目标位置

//This is the Transform of the second GameObject
    public Transform m_NextPoint;
    Quaternion m_MyQuaternion;
    float m_Speed = 1.0f;
    void Start()
    {
        m_MyQuaternion = new Quaternion();
    }
    void Update()
    {
        //Set the Quaternion rotation from the GameObject's position to the next GameObject's position
        m_MyQuaternion.SetFromToRotation(transform.position, m_NextPoint.position);
        //Move the GameObject towards the second GameObject
        transform.position = Vector3.Lerp(transform.position, m_NextPoint.position, m_Speed * Time.deltaTime);
        //Rotate the GameObject towards the second GameObject
        transform.rotation = m_MyQuaternion * transform.rotation;
        Debug.Log(transform.rotation.eulerAngles);
    }

引擎,实战API,实战API应用指南 第55张

4、Quaternion.Angle

两个四元数间的角度

public Transform target;
    void Update() {
        float angle = Quaternion.Angle(transform.rotation, target.rotation);
          Debug.Log(angle);
    }

原角是(0,60,0) target角是 (0,30,0)

输出是 30

5、Quaternion.Euler

应该是比较常用的方式,将欧拉角转化为四元数,然后可以进行旋转。

引擎,实战API,实战API应用指南 第56张

//将8个红色关节的旋转信息赋值给8个模型骨骼
for (int i = 0; i  

6、Quaternion.FromToRotation

创建一个从开始方向到结束方向的旋转

引擎,实战API,实战API应用指南 第57张

创建一个从开始方向到结束方向的旋转 (0,0,0)

引擎,实战API,实战API应用指南 第58张

void Awake() {
        print(transform.forward);
        transform.rotation = Quaternion.FromToRotation(Vector3.up, transform.forward);
        print(transform.rotation.eulerAngles);
}

这个是从 (0,1,0)方向 转到 (0,0,1) 得到的结果是 (90,0,0) 绕x轴转90度的旋转

引擎,实战API,实战API应用指南 第59张

7、Quaternion.Inverse

返回一个相反的旋转

void Awake() {
transform.rotation = Quaternion.Inverse(transform.rotation);
        print(transform.rotation.eulerAngles);
}

引擎,实战API,实战API应用指南 第60张

预先转的是 (0,60,0)

引擎,实战API,实战API应用指南 第61张

inverse之后是 (0,300,0) 也就是 (0,-60,0)

8、Quaternion.Lerp

线性插值( Linear Interpolation)

计算角度ab间的差值,并且之后规范结果,参数t是在0到1之间。

lerp比slerp快 但是如果旋转角度离得远看起来会很糟糕。

引擎,实战API,实战API应用指南 第62张

9、Quaternion.Slerp

球面线性插值(Spherical linear interpolation,通常简称Slerp),是四元数的一种线性插值运算,主要用于在两个表示旋转的四元数之间平滑插值。

引擎,实战API,实战API应用指南 第63张

引擎,实战API,实战API应用指南 第64张

10、Quaternion.LookRotation

将方向转化为旋转角度:传入一个方向将返回一个旋转角,当某个物体被施加这个旋转角后,这个物体的forward方向将指向传入的方向。

在场景中新建一个正方体和球体,用LookRotation方法将正方体“看向”球体,并绘制输出3条射线

引擎,实战API,实战API应用指南 第65张

本文中所有脚本都挂载在正方体上

public class Test: MonoBehaviour{
    public Transform sphere;
    void Update(){
        // 正方体指向球体的向量dir = 球体坐标 - 正方体坐标
        Vector3 dir = sphere.position - transform.position;  
        // 创建一个 使正方体“看向”球体的旋转角
        Quaternion ang = Quaternion.LookRotation(dir);  
        transform.rotation = ang;
        // 绘制正方体forward方向
        Debug.DrawRay(transform.position, transform.forward * 100, Color.blue);  
        // 绘制向量dir
        Debug.DrawRay(transform.position, dir, Color.green);  
        // 即:绘制正方体的旋转轴
        Debug.DrawRay(transform.position, ang.eulerAngles, Color.red);  
    }
}

运行场景,第一个参数解析:

引擎,实战API,实战API应用指南 第66张

Vector3 dir = sphere.position - transform.position;
Quaternion ang = Quaternion.LookRotation(dir);

绿色射线:以向量dir为方向。蓝色射线:以正方体forward为方向,与绿色射线部分重合。红色射线:以四元数ang为方向,直接绘制看似“奇怪”(实则正方体的旋转轴线)。

 

传入一个Vector3方向将返回一个Quaternion旋转角,某个物体被施加这个旋转角后,这个物体的forward方向将对齐至传入的Vector3方向。

场景升级,第二个参数解析

LookRotation的第二个参数upwards影响物体的up和right的方向(即影响Z轴旋转),继上续代码即:
transform.right == Vector3.Cross(sphere.postion - transform.postion, upwards).normalized;

transform.up == Vector3.Cross(sphere.postion - transform.postion, transform.right).normalized;

引擎,实战API,实战API应用指南 第67张

引擎,实战API,实战API应用指南 第68张

transform.rotation = Quaternion.LookRotation(sphere.position - transform.position, cone.up);  //第二个参数cone.up将影响正方体的right、up方向

调节圆锥的Rotation属性正方体的right、up方向受到了影响,核心代码如上。

圆锥起点绿色射线:方向为圆锥的+Y轴,即cone.up方向。圆锥起点红色射线:方向为Vector3.Cross(transform.forward, cone.up)。

仔细看上图,无论怎么旋转圆锥,圆锥起点红色射线和正方体红色箭头(right方向)始终方向相同、保持平行。

 

若指定第二个参数upwards,则物体的right方向将对齐至‘第一个参数’与‘第二个参数’的叉乘方向。

补充:代码实现LookRotation()

引擎,实战API,实战API应用指南 第69张

    public Quaternion LookRotation(Vector3 forward)
    {
        float x = Mathf.Acos(Mathf.Sqrt((forward.x * forward.x + forward.z * forward.z) / (forward.x * forward.x + forward.y * forward.y + forward.z * forward.z))) * Mathf.Rad2Deg;
        if (forward.y > 0) x = 360f - x;
        float y = Mathf.Atan2(forward.x, forward.z) * Mathf.Rad2Deg;
        if (y  

这样一个简单LookRotation就实现了,如果还需要实现带第二个参数的方法,只需求出transform.up与LookRotation()返回值之间的夹角就行了。已知两向量求其夹角的公式:

引擎,实战API,实战API应用指南 第70张

但可惜LookRotation()方法内部没法直接拿到transform.up的值,所以我们只能通过数学方式间接的求出transform.up。

初始时,transform.up、LookRotation()返回值、Y轴一定是共面的,且transform.up ⊥ LookRotation()返回值,根据这两个条件联立方程我们就可以准确求出transform.up的值。

引擎,实战API,实战API应用指南 第71张


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码