在做项目时,很多时候可能需要做旋转功能,这个很简单,直接使用Rotate方法即可,如果在加上一个限制旋转角度,可不是简单的判断下角度就可以了。在Unity中,角度在它内部是用四元数表示的,这个我也弄不清楚,所以,在面板展示和你实际打印出来的localEulerAngles不一样!!可能你只是想改变x的角度,但是你转着转着可能看到变成x,y,z三个值都变了。

之前在网上看到一个解决方案,说是拿取localEulerAngles之后,对角度做一个变化:

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

这个虽然可以解决部分问题,但是我这里还是遇到了一个很奇特的问题,有时候突然变成反向的了。

我自己加了一个方法:

float angle = 0;Vector3 axis = Vector3.left;rotateXAnim.localRotation.ToAngleAxis(out angle, out axis);

这个可以得到某一个轴的角度,然后在根据axis的方向,就能得到实际的角度

angle = CheckAngle(angle*axis.x);if (angle > 90){angle = 90;rotateXAnim.localEulerAngles = new Vector3(angle, 0, 0);}else if (angle < -90){angle = -90;rotateXAnim.localEulerAngles = new Vector3(angle, 0, 0);}

结合起来,也能解决大部分问题。

可是,今天又出现一个奇怪问题,就是我前面说的,突然变成反向的角度,而且只有第一次出现,之后旋转都是正常的。

思来想去,最后想到一个曲线解决方案:

我们在初始化物体时,是知道物体的旋转角度的,那么我们就可以存储一个临时的欧拉角度,在需要旋转角度时,直接用这个临时的欧拉角度进行计算,计算得到结果之后,直接先判断角度是否超过我们给定的值,这样就不用经过四元数那一层计算了,那么也就不会出现万向锁和我上面说的问题了。

void MapRotating(Vector3 tempPosition){Vector3 tempAngle = Vector3.zero;tempAngle.x = tempPosition.y * 15f / scaleTrans.localScale.x;tempAngle.y = -tempPosition.x * 15f / scaleTrans.localScale.x;nowRotate += tempAngle;nowRotate.x = ClampAngle(nowRotate.x, -90, 90);SetNowRotValue(nowRotate.x, nowRotate.y, true);}static float ClampAngle(float angle, float min, float max) {if (angle < -360){angle += 360;}if (angle > 360){angle -= 360;}return Mathf.Clamp(angle, min, max);}

哈哈,想问题真的进入到一个思维死角里面去了,反而忘记后面这个最简单的方式了-

Unity3D-限制3D物体的旋转角度相关推荐

  1. Unity如何限制3D物体的旋转角度

    在项目开发中用到了限制物体的旋转角度,因为做的事移动端的,所以下面的代码是触摸屏的,如果有需要你可以把操作方式改为PC的. if (1 == Input.touchCount){Touch touch ...

  2. 【Unity3D】3D 物体概念 ① ( 轴心点概念 | 物体的父子关系 | 子节点相对坐标 )

    文章目录 一.轴心点概念 二.物体的父子关系 三.子节点相对坐标 一.轴心点概念 3D 物体的 轴心 Pivot , 是 操作的基准点 , 移动物体 时 , 是 轴心点 沿着指定的坐标轴方向移动 ; ...

  3. 用于单眼3D物体检测的可学习深度引导卷积

    文献:Learning Depth-Guided Convolutions for Monocular 3D Object ​摘要(Abstract) 1 介绍(Introduction) 2 相关工 ...

  4. 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )

    文章目录 一.向 Unity 中添加 FBX 模型 二.向 Scene 场景中添加 FBX 模型 三.3D 物体渲染 四.3D 物体材质设置 一.向 Unity 中添加 FBX 模型 Unity 中使 ...

  5. 【Unity3D】材质 Material ( 材质简介 | 创建材质 | 设置材质属性 | 对 3D 物体应用材质 | 资源拖动到 Inspector 检查器中的 Material 属性中 )

    文章目录 一.材质 Material 简介 二.创建材质 三.设置材质属性 四.对 3D 物体应用材质 五.资源拖动到 Inspector 检查器中的 Material 属性中 一.材质 Materi ...

  6. Unity3D入门:3D物体和操作

    3D原生物体 3D原生物体的种类 Unity自带的3D物体模型:立方体Cube.球体Sphere.胶囊体Capsule.圆柱体Cylinder.平面Plane.四边形Quad 平面Plane和四边形Q ...

  7. 【Unity入门】3.3D物体

    [Unity入门]3D物体     大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)物体移动旋转缩放 (1)物体移动     在上一篇文章 ...

  8. [Unity3D学习]3D数学基础之向量

    [Unity3D学习]3D数学基础之向量 2014.05.11 向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础. 一.向量 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量 ...

  9. [Unity]3D物体透明化方法透明材质球

    Default-Skybox,Shader:Skybox/Procedural 使用透明材质 1.使用自带的天空盒材质 新建3D物体,自带是初始材质 将其替换成如上图所示的Default-Skybox ...

最新文章

  1. 金融数据分析(四)-------矩,偏度,峰度
  2. 外媒:苹果自动驾驶裁员表明其AI战略发生巨变
  3. CAD二次开发之入门坑
  4. 一文读懂人类信息存储进化史
  5. 都说现在的主流技术是Flink,那么让我们看看FLink在网易是如何实战的?
  6. 个人成长:2021年7月记
  7. halcon/c++接口基础 之内存管理
  8. Zend Guard 7 , Zend Guard Loader处理PHP加密
  9. 日期天数转换c语言程序,C语言 ---计算连个日期之间的天数转换
  10. 如何用鲲鹏弹性云服务器部署《Hadoop伪分布式》
  11. 多继承、经典类与新式类、新式类的C3算法详解
  12. 【Docker】Docker 安装 Prometheus并且交给 grafana
  13. Java程序员须知的七个日志管理工具
  14. [转]PowerDesigner使用技巧
  15. 按一定条件筛选df1,返回结果中df1的索引取df2的数据
  16. mapabc 地图失效不能进行任何操作
  17. Centos 安装 glib
  18. 重磅突发!支付宝下架互联网存款产品,蚂蚁集团回应
  19. 前端H5各种qq,微博,fb,whatsapp等网页分享的链接
  20. 【Unity】使用事件实现自动开关门

热门文章

  1. SQLServer表关联查询
  2. Python 数据类型详解(字符串)
  3. 西雅图,夜未眠 2008-06-27
  4. 直升飞机领衔、三百辆婚车开道,三十台巨型吊车,小伟婚礼超豪华
  5. 生化危机2重制版 小笔记
  6. 解决org.springframework.beans.factory.NoUniqueBeanDefinitionException No qualifying bean of type
  7. 面试-字符串匹配ABBA模式
  8. MySQL/oracle服务器误删文件的恢复过程
  9. 何恺明:从高考状元到CV领域年轻翘楚,靠“去雾算法”成为“CVPR最佳论文”首位华人得主...
  10. 〖全域运营实战白宝书 - 高转化文案速成篇⑤〗- 如何撰写内容型文案?