IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【第018问 Unity中对Quaternion.AngleAxis的理解?】 -> 正文阅读

[游戏开发]【第018问 Unity中对Quaternion.AngleAxis的理解?】

一、背景

在游戏研发过程中,有时候会对一个物体经过多次围绕不同的轴进行不同角度的旋转,从而计算得到一个方向,以此来检测在该对应的方向上是否有对应的物体或别的对象,因此本节对Quaternion.AngleAxis进行简单的记录;

二、Quaternion.AngleAxis

对该API进行理解:

  • Quaternion:四元数,这个在Unity中基本就是用于计算方位、旋转的;
  • AngleAxis:这个就表示围绕一个轴,进行指定的角度旋转

整体就是:指定一个轴,围绕该轴旋转指定的角度,得到一个新的旋转结果

三、实践

1、动画演示请添加图片描述

在上图中可以看到有两个Cube,都在以相同的角度,围绕相同的轴在旋转;这里只是简单的用了该API的结果:

 targetA.rotation = Quaternion.AngleAxis(angel, direction);
 targetB.rotation = Quaternion.AngleAxis(angel, direction);

Angel:代表旋转多少度,比如上图中的滑动条控制的数值0-180;当然0是不会有任何变化的;

direction:代表的是轴,也就是围绕哪一个轴进行旋转;上面的动画中只是采用基本的
Vector3.up、Vector3.right,Vector3.forward进行基本的演示。但在实际的操作中的方向大多数不是这几个基本的的方向,有更多其它的方向。

2、世界坐标轴和本地坐标轴旋转差异

动画演示:
请添加图片描述
首先将CubeA和CubeB都调整一个相同的旋转角度;然后在分别在有右侧的面板中调节参数,对它们进行旋转;可以发现旋转的实际效果是不一样的【可以根据xyz轴的方向来发明细发现】;这是因为旋转的时候采用的坐标轴不一样;
CubeA:采用世界坐标轴的方式进行旋转;
CubeB:采用的是CubeB本身的坐标轴进行旋转的;

targetA.rotation = Quaternion.AngleAxis(angel, direction);
targetB.rotation = Quaternion.AngleAxis(angel, rotationB * direction);

rotationB * direction:表示CubeB本身的指定轴的方向;比如Vector3.right表示的是右侧,但是它不能直接代表Cube本身的右侧,其中的原因是Cube本身是存在旋转的;

  • 如果CubeB不旋转,且在场景中没有父节点;或者所有的父节点都没有旋转;那么此刻CubeB右侧和Vector3.right是在同一个方向;
  • 如果CubeB旋转了,那么就需要用CubeB当前的旋转乘以Vector3.right,其结果才真正表示Cube的右侧;

3、 Quaternion相乘

如果两个旋转的方向结果相乘,那么结果会是什么:看演示
请添加图片描述
从上面的动画可以看出:

  • 对CubeA进行围绕Y轴旋转指定角度A,然后CubeB进行调节下面角度B1、B2
  • 角度A =B1+B2时,两个旋转的结果是一样的;也就是具有相同的旋转行为;
 targetA.rotation = Quaternion.AngleAxis(angel, rotationA * direction);


 targetB.rotation = Quaternion.AngleAxis(angelB1, rotationB * direction) *
                           Quaternion.AngleAxis(angelB2, rotationB * direction);

两个Quaternion.AngleAxis 相乘;也就是Quaternion相乘其实就是表示两个旋转角度累加

四、源码

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

public class QuaternionAngleAxis : MonoBehaviour
{
    [SerializeField] private Transform targetA;
    [SerializeField] private Transform targetB;
    [SerializeField] [Range(0, 180)] private int angel;
    [SerializeField] [Range(0, 180)] private int angelB1;
    [SerializeField] [Range(0, 180)] private int angelB2;

    [SerializeField] private bool isReset;


    public enum Axis
    {
        Up,
        Forward,
        Right,
    }


    public enum TestModel
    {
        /// <summary>
        /// 普通旋转
        /// </summary>
        Normal,

        /// <summary>
        /// 世界坐标和本身旋转
        /// </summary>
        WLRotation,

        /// <summary>
        /// 旋转相乘
        /// </summary>
        Mult,
    }

    private Quaternion rotationA;
    private Quaternion rotationB;

    public TestModel model;
    public Axis axis = Axis.Right;
    private Vector3 direction;

    private void OnDrawGizmos()
    {
        if (isReset)
        {
            rotationA = targetA.rotation;
            rotationB = targetB.rotation;
            return;
        }


        switch (axis)
        {
            case Axis.Forward:
                direction = Vector3.forward;
                break;
            case Axis.Right:
                direction = Vector3.right;
                break;
            case Axis.Up:
                direction = Vector3.up;
                break;
        }


        switch (model)
        {
            case TestModel.Normal:
                NormalAngelAxis();
                break;
            case TestModel.WLRotation:
                WLRotationAngelAxis();
                break;
            case TestModel.Mult:
                MultAngelAxis();
                break;
        }
    }


    void NormalAngelAxis()
    {
        targetA.rotation = Quaternion.AngleAxis(angel, direction);
        targetB.rotation = Quaternion.AngleAxis(angel, direction);
    }


    void WLRotationAngelAxis()
    {
        targetA.rotation = Quaternion.AngleAxis(angel, direction);
        targetB.rotation = Quaternion.AngleAxis(angel, rotationB * direction);
    }

    void MultAngelAxis()
    {
        targetA.rotation = Quaternion.AngleAxis(angel, rotationA * direction);


        targetB.rotation = Quaternion.AngleAxis(angelB1, rotationB * direction) *
                           Quaternion.AngleAxis(angelB2, rotationB * direction);
    }
}

结语:

最近好像开始长胖了–【valaki】

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:55:11  更:2022-07-17 16:56:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:56:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码