解决unity rotate旋转物体 限制物体旋转角度的大坑

 更新时间:2021年04月12日 15:42:48   作者:aldonaletto  
这篇文章主要介绍了解决unity rotate旋转物体 限制物体旋转角度的大坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

今天可是遇到一个很简单的需求,但是却让我蛋疼了半天。

滑动屏幕控制物体旋转,但是旋转的角度要在-60到60之间。

乍一听这简直是小儿科啊。

判断一下角度不就行了。相比这四元数,欧拉角虽然有时会出现万向锁,但是简洁明了啊。

这不,我就中了一个简洁明了的大坑。

图中,如果你以为transform.eulerAngles =(-1,0,90)

那就大错特错了。

因为对于旋转来说。360度是一个循环。-1° 也可以算是就是359°

而且unity就是这样认为的。面板上虽然显示的是-1。但是他运行时是359。

这就让我的判断出了问题。

 if(angle>60)
 
 transform.eulerAngles = new Vector3(60, transform.eulerAngles.y, transform.eulerAngles.z);
 if(angle<-60)
 
 transform.eulerAngles = new Vector3(-60, transform.eulerAngles.y, transform.eulerAngles.z);

这样你就会发现 你的物体处并不受控制,有时候还会出现一种奇葩的状态。

因为当x的值小于0后,他又变回359了。这样又走到第一个if里面了。

那要怎么办呢。解决方法就是:你不是负数 我把你变成负数。

 public float CheckAngle(float value)
 {
 float angle = value - 180;
 
 
 if (angle > 0)
 return angle - 180;
 
 
 return angle + 180;
 }

通过这个方法,将他的角度在变回负数。

可以看到 图中 x的值是-26但是输出实际上是333。经过方法的转换才能成为显示的值。

这样就可以计算了。

2011年就有人提出这个问题了。在官方论坛下2016年还有回答。看来真是坑了不少人。

补充:Unity RotateAround固定旋转

当前显示的为本地坐标系

//旋转视野
void rotateVeiw()
{
float x=Input.GetAxis("Mouse X");
float y=Input.GetAxis("Mouse Y");
//函数参数(旋转点,旋转轴,旋转量)

旋转效果相当于旋转轴平移到旋转点上后 沿此轴旋转相应的量。

例上图,如果沿本地坐标的Y轴旋转 则会出现旋转偏移到地下的情况。

必须使用下式 沿世界坐标的y轴旋转

transform.RotateAround(plear.position,Vector3.up,x);

当单纯的左右旋转时,x轴都为固定的,所以没有区别。

但当左右移动后,本地坐标的x轴和世界坐标的x轴有出入。

例如:此时如果选用世界坐标x轴,则左右移动后的x轴还是固定的,左右移动移动一定的量后

世界就会开始倾斜:如下图所示:

所以此时我们应采用 本地坐标轴x

transform.RotateAround(plear.position, transform.right, y);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • winform天气预报小工具(附源码下载)

    winform天气预报小工具(附源码下载)

    主要原理就是利用网上免费的webservice获取天气数据,需要的朋友可以参考下
    2012-03-03
  • C#实现顺序队列和链队列的代码实例

    C#实现顺序队列和链队列的代码实例

    今天小编就为大家分享一篇关于C#实现顺序队列和链队列的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C#集合本质之堆栈的用法详解

    C#集合本质之堆栈的用法详解

    本文详细讲解了C#集合本质之堆栈的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • .net的命名空间类库的简单介绍

    .net的命名空间类库的简单介绍

    .net的命名空间类库的简单介绍,需要的朋友可以参考一下
    2013-04-04
  • 在WPF中实现平滑滚动的方法详解

    在WPF中实现平滑滚动的方法详解

    这篇文章介绍了WPF实现平滑滚动的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#内置队列类Queue用法实例

    C#内置队列类Queue用法实例

    这篇文章主要介绍了C#内置队列类Queue用法,实例分析了C#内置队列的添加、移除等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#结合SMTP实现邮件报警通知的实现示例

    C#结合SMTP实现邮件报警通知的实现示例

    这篇文章主要介绍了C#结合SMTP实现邮件报警通知的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Unity UGUI的PointerEventData的介绍及使用

    Unity UGUI的PointerEventData的介绍及使用

    这篇文章主要为大家介绍了Unity UGUI的PointerEventData的介绍及使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 使用C#实现自己封装的Modbus工具类库

    使用C#实现自己封装的Modbus工具类库

    Modbus通讯协议在工控行业的应用是很多的,并且也是上位机开发的基本技能之一,所以本文主要为大家介绍了如何使用C#封装一个Modbus工具类库,需要的可以参考下
    2024-02-02
  • C#实现数据去重的方式总结

    C#实现数据去重的方式总结

    这篇文章主要来和大家一起来讨论一下关于C#数据去重的常见的几种方式,每种方法都有其特点和适用场景,感兴趣的小伙伴可以了解一下
    2023-07-07

最新评论