如何在DOTS中计算欧拉角euler angles?

news/2024/5/18 12:07:07 标签: 游戏程序, unity, DOTS, ECS, c#, 编程

DOTS游戏开发实战记录

  • 前言
  • 面向对象实现
  • DOTS实现
  • 后续

前言

在Unity中我们时常会涉及到角度计算,面向对象编程中常用的欧拉角,在DOTS中却没有对应的API调用,这大概是因为DOTS中使用弧度而不是角度,所以我们在传递角度到DOTS中时需要将角度转化成弧度var radian= math.radians(angular)。然而我们在面向对象中已经知道某种功能对应的欧拉角的算法了,却不知道该功能对应弧度的算法,所以还是需要获得欧拉角,这个功能在Unity中用面向对象的API非常容易实现,但是在DOTS中就不是那么简单了,对比一下代码就知道差距了。

面向对象实现

获取欧拉角这个API相信萌新都知道怎么写,直接上代码:

//面向对象获取欧拉角euler Angles
var eulerAngles=transform.rotation.eulerAngles;

DOTS_11">DOTS实现

DOTS中我们可以封装一个静态工具类Utilities来提供功能性的静态函数,方便我们封装一些常用的功能,这个欧拉角的转化就可以放进去,代码如下:

namespace Misc
{
    public static class Utilities
    {
		//将旋转角度quaternion转化成欧拉角Euler Angle
        public static float3 ToEulerAngles(quaternion q)
        {
            float3 angles;

            // roll (x-axis rotation)
            double sinRotationCosPitch = 2 * (q.value.w * q.value.x + q.value.y * q.value.z);
            double cosRotationCosPitch = 1 - 2 * (q.value.x * q.value.x + q.value.y * q.value.y);
            angles.x = (float)math.atan2(sinRotationCosPitch, cosRotationCosPitch);

            // pitch (y-axis rotation)
            double sinPitch = 2 * (q.value.w * q.value.y - q.value.z * q.value.x);
            if (math.abs(sinPitch) >= 1)
                angles.y = (float)CopySign(math.PI / 2, sinPitch); // use 90 degrees if out of range
            else
                angles.y = (float)math.asin(sinPitch);

            // yaw (z-axis rotation)
            double sinYawCosPitch = 2 * (q.value.w * q.value.z + q.value.x * q.value.y);
            double cosYawCosPitch = 1 - 2 * (q.value.y * q.value.y + q.value.z * q.value.z);
            angles.z = (float)math.atan2(sinYawCosPitch, cosYawCosPitch);

            return angles;
        }

        private static double CopySign(double a, double b)
        {
            return math.abs(a) * math.sign(b);
        }
    }
}

后续

其实还有很多非常实用的干货想要分享,因为自己在项目开发中已经打通了DOTS技术的寻路/动画等关键技术栈,所以已经可以利用DOTS技术来做出一个完整的游戏了,最近笔者就打算把游戏案例视频制作出来,让大家看看DOTS制作的游戏是什么样子的。
大家如果想要了解更多Unity的DOTS技术栈相关知识点,可以关注一下博主,博主会根据点赞、收藏、订阅的数据来决定是否抓紧更新专栏,如果关注的人多,自然会爆肝更新,反之,没有人喜欢的话,自然不愿意花时间去分享。
力的作用是相互的,如果觉得博主的分享有用,请分享你的力量,谢谢!


http://www.niftyadmin.cn/n/1008408.html

相关文章

英语语法学习_incomplete

在语言学中,自然语言的语法是说话者或作者在从句、短语和单词的构成上的一套结构约束。1 「语法」实际上有两个概念,一是「语法」(也叫「文法」),二是「语法学」。 一、语法:客观存在的语言结构规律&#x…

表单(form) get 方式提交时的编码与乱码

在前面说完了 URL 中的编码与乱码( 上 , 下 ), 也为本章节谈论的主题, 关于表单(form)以 get 方式提交时的编码与乱码问题打下了一个良好的基础. 事实上, 表单以 get 方式提交就是把表单中的数据拼凑在 url 中提交到后台, 也因此…

JDK源码浅析_sun.security.util.SecurityConstants类(基于 Latest JDK)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131442558 出自【进步*于辰的博客】 在开发或解析API中,使用到一些新类或未研究过其…

初识React/JSX/组件/state/受控组件

JSX 推荐使用小括号包裹jsx 使用函数创建组件 使用类创建组件 抽离组件 事件绑定 事件对象 有状态和无状态组件/state 简化写法​​​​​​​ 抽离事件处理程序 表单元素 受控组件 多表单优化 非受控组件(了解即可)

2.FreeRTOS系统任务调度简介及任务状态

目录 一、基础知识 1、FreeRTOS 任务状态 (1)运行态 (2)就绪态 (3) 阻塞态 (4) 挂起态 二、任务调度简介 1.抢占式调度 2.时间片调度 3.协程式调度 一、基础知识 1、FreeRTOS 任务状态 FreeRTOS 中任务存在四种任务状态,分别为运行态、就绪态、阻塞态和挂…

手写神经网络实现mnist分类

手写神经网络,实现mnist数据集分类。本过程使用numpy实现,没有使用机器学习和深度学习框架。 1. 数据读取及处理 import numpy as np import struct import matplotlib.pyplot as plt import os from PIL import Image from sklearn.utils import gen_batches from sklearn…

CentOS Linux的替代品(四)_openEuler 22.03-LTS基础安装教程

文章目录 1 openEuler 22.03-LTS简介1.1 系统安装1.1.1 发布件1.1.2 最小硬件要求1.1.3 硬件兼容性 1.2 关键特性1.2.1 openEuler 22.03-LTS基于 Linux Kernel 5.10内核构建, 在进程调度、内存管理等方面带来10余处创新1.2.2 新介质文件系统1.2.3 内存分级扩展1.2.4 用户态协议…

Vue3的组合式API中如何使用setup()函数中的条件渲染和循环渲染

首先,让我们来了解一下什么是Vue3的组合式API。组合式API是一种在Vue3中用于构建组件的方式,它使用函数式编程的方法来组织代码,让你的组件更加清晰、易于理解和维护。而setup()函数则是组合式API的核心,它用于初始化组件并返回包…