Unity之四元数计算

这篇具有很好参考价值的文章主要介绍了Unity之四元数计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

四元数相乘

#region 四元数相乘
Quaternion q = Quaternion.AngleAxis(20, Vector3.up);
this.transform.rotation *= q;
#endregion

四元数乘向量

Vector3 v = Vector3.forward;
print(v);
//四元数乘向量的顺序不能改变,也就是说不能用向量去乘四元数,只能是四元数乘向量
v = Quaternion.AngleAxis(45,Vector3.up) * v;
print(v);
v = Quaternion.AngleAxis(45, Vector3.up) * v;
print(v);

例一

模拟飞机发射不同类型子弹的方法,单发,双发,扇形,环形

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public enum E_FireType
{
    One,
    Two,
    Three,
    Round
}
public class AirPlane : MonoBehaviour
{
    private E_FireType nowType;
    public GameObject bullet;
    public int roundNum = 4;
    // Start is called before the first frame update
    void Start()
    {
        nowType = E_FireType.One;
    }

    // Update is called once per frame
    void Update()
    {
        //切换开火方式
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            nowType = E_FireType.One;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            nowType = E_FireType.Two;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            nowType = E_FireType.Three;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            nowType = E_FireType.Round;
        }

        if(Input.GetKeyDown(KeyCode.Space))
        {
            Fire();
        }
        
    }

    private void Fire()
    {
        switch (nowType)
        {
            case E_FireType.One:
                Instantiate(bullet,transform.position,transform.rotation);
                break;
            case E_FireType.Two:
                //让发射位置分别向两边的方向偏移一点
                Instantiate(bullet, transform.position - transform.right * 1, transform.rotation);
                Instantiate(bullet, transform.position + transform.right * 1, transform.rotation);
                break;
            case E_FireType.Three:
                Instantiate(bullet, transform.position, transform.rotation);
                Instantiate(bullet, transform.position - transform.right * 1, transform.rotation * Quaternion.AngleAxis(-20, Vector3.up));
                Instantiate(bullet, transform.position + transform.right * 1, transform.rotation * Quaternion.AngleAxis(20, Vector3.up));
                break;
            case E_FireType.Round:
                float angle = 360/roundNum;
                for(int i = 0; i < roundNum; i++)
                {
                    Instantiate(bullet, this.transform.position, this.transform.rotation * Quaternion.AngleAxis(i * angle, Vector3.up));
                }

                break;
        }
    }
}

练习二

用3D数学知识实现摄像机跟随效果

1.摄像机在人物斜后方,通过角度控制倾斜率

2.通过鼠标滚轮控制摄像机距离人物的距离(有最大最小限制)

3.摄像机看向任务头顶上方的一个位置(可调节)

4.Vector3.Lerp实现相机跟随任务

5.Quaternion.Slerp实现摄像机看向人物文章来源地址https://www.toymoban.com/news/detail-805306.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove2 : MonoBehaviour
{
    //目标对象
    public Transform target;
    //相对头顶偏移多少
    public float headOffsetH = 1;
    //倾斜角度
    public float angle = 45;
    //默认的摄像机里观测点的距离
    public float dis = 5;
    //距离必须是3和10之间 
    public float minDis = 3;
    public float maxDis = 10;

    //当前摄像机应该在的位置
    private Vector3 nowPos;
    private Vector3 nowDir;
    private float time;
    private Vector3 startPos;
    private Vector3 endPos;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //鼠标中键滚动控制摄像机远近的逻辑
        dis += Input.GetAxis("Mouse ScrollWheel");
        dis = Mathf.Clamp(dis, minDis, maxDis);

        //向头顶偏移位置
        nowPos = target.position + target.up * headOffsetH;
        //往后方偏移位置 
        nowDir = Quaternion.AngleAxis(angle, target.right) * -target.forward;
        nowPos = nowPos + nowDir * dis;
        //直接把算出来的位置赋值
        if(endPos != nowPos) 
        { 
            startPos = this.transform.position;
            endPos = nowPos;
            time = 0;
        }
        time += Time.deltaTime;
        //this.transform.position = nowPos;
        //先快后慢
        //this.transform.position = Vector3.Lerp(this.transform.position,nowPos,Time.deltaTime*dis);
        //匀速
        this.transform.position = Vector3.Lerp(startPos, endPos, time);

        Quaternion.LookRotation(nowDir);
        this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(-nowDir),Time.deltaTime);
        
    }
}

到了这里,关于Unity之四元数计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 四元数计算

    两个四元数相乘得到一个新的四元数,代表两个旋转量的叠加,相当于旋转 注意:旋转相对的坐标系,是物体自身坐标系 例如绕 自身y轴 转20度: 如果绕自身y轴转40度,那么就再乘一个q: 四元数乘向量返回一个新向量, 可以将指定向量旋转对应四元数的旋转量,相当于旋

    2024年02月09日
    浏览(42)
  • 【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向

    在Cesium的使用过程中,常常需要计算模型在移动过程中的朝向,除了可以利用位置信息让Cesium自动计算之外,还可以通过一些矩阵变换的方法控制模型的朝向,本篇文章笔者记录了自己计算模型朝向信息的方法,欢迎交流~ 大致思路是先根据模型的速度信息、位置信息,建立

    2024年02月12日
    浏览(52)
  • 使用Matlab机器人工具箱完成四元数到旋转矩阵的转换,附程序

    在进行机械臂操作或写论文时,经常需要进行四元数、旋转矩阵、欧拉角等的转换。 此时,我们利用matlab里的机器人工具箱(Peter 开发)内置的函数就可完成,具体程序如下: 环境:Matlab2020b+robotics toolbox(安装方法在前几期文章里有) 此时运行matlab可得以下结果: 重要注

    2024年02月13日
    浏览(56)
  • 四元数

    传入一个向量,使物体旋转,如: 值得注意的是:Unity中组件Transform的Rotation实际上是Quaternion类型的 与上面功能类似,但更为简洁,如: 线性插值,与Mathf.Lerp差不多。 与transform.LookAt类似的是都是将其正方向指向目标方向,但是LookRotation可以做的跟更好 如: 值得注意的是:

    2024年02月15日
    浏览(34)
  • 四元数的理解

    一共三个虚维度来描述空间,实数则在第四个维度,垂直于全部三个虚数轴 四元数可以优雅的描述并计算三维旋转 “四维右手法则” 两个复数Z和W相乘,把z当成一个函数,对w施加某种旋转和拉伸 左边的数作为一种函数,去变换右边的数 原则上将,把所有二维旋转的集合映

    2024年01月18日
    浏览(39)
  • 四元数快速入门【Quaternion】

    四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。 推荐:用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 更熟悉和更容易可视化的滚动(Roll)

    2024年02月13日
    浏览(36)
  • 四元数插值Eigen源码解析

    四元数插值公式 Slerp ⁡ ( q 0 , q 1 ; t ) = sin ⁡ [ ( 1 − t ) Ω ] sin ⁡ Ω q 0 + sin ⁡ [ t Ω ] sin ⁡ Ω q 1 , 0 ≤ t ≤ 1 {displaystyle operatorname {Slerp} (q_{0},q_{1};t)={frac {sin {[(1-t)Omega }]}{sin Omega }}q_{0}+{frac {sin[tOmega ]}{sin Omega }}q_{1}}, 0 ≤ t ≤ 1 Slerp ( q 0 ​ , q 1 ​ ; t ) = sin Ω sin [( 1 −

    2024年02月03日
    浏览(46)
  • 数学概率 | 旋转矩阵、欧拉角、四元数

    目录 一,旋转矩阵 二维旋转矩阵 三维旋转矩阵 二,欧拉角 三,四元数 四,矩阵、欧拉角、四元数相互转换 四元数转矩阵 矩阵转四元数 欧拉角转矩阵 矩阵转欧拉角 欧拉角转四元数 四元数转欧拉角 二维旋转矩阵 R() =  推导,以二维平面为例旋转:  = cos( + ) = coscos - si

    2024年02月06日
    浏览(49)
  • 四元数,欧拉角和旋转矩阵相互转换

    打印输出: 在线转换网站:1、三维在线旋转变换网站 https://www.andre-gaschler.com/rotationconverter/ 2、 Rotation Conversion Tool https://danceswithcode.net/engineeringnotes/quaternions/conversion_tool.html 3、角度、弧度在线转换工具 https://www.osgeo.cn/app/sc210 参考链接:https://www.jianshu.com/p/4fda4c34b829 https://

    2024年02月14日
    浏览(43)
  • 好用高效的python四元数库-quaternion

    https://github.com/moble/quaternion 这个库主要是在Numpy的基础上增加一个 quaternion 的类型,不仅实现了四元数相关操作的numpy实现,同时也将numpy的很多用法拓展到了相关四元数上。并且这个库的核心实现使用c语言实现的,保证了这个库在运算上的较高速度。 在近期进行四元数的学

    2023年04月18日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包