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

DOTS游戏开发实战记录

前言

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

面向对象实现

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

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

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技术栈相关知识点,可以关注一下博主,博主会根据点赞、收藏、订阅的数据来决定是否抓紧更新专栏,如果关注的人多,自然会爆肝更新,反之,没有人喜欢的话,自然不愿意花时间去分享。
力的作用是相互的,如果觉得博主的分享有用,请分享你的力量,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CloudHu1989

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值