感觉像是为了避免万向节死锁才产生的误差

jike_405459401 Transform 场景物体的... 最后由 极客学院_红结 于2015年08月07日回复

  • 3 回答
  • 6.3k 浏览

视频中出现的欧拉角误差应该是引擎为了避免万向节死锁的某种计算吧?我瞎猜的

  • 极客学院_红结 2015年08月06日 回答 #1楼
  • 似乎是,也似乎不是


    首先第一个问题,什么是万向节死锁




    我们所做的3d游戏也好,3d动画也好,都是处在一个3d的世界里的,为了量化一个物体的旋转,我们不能像在一张纸上那样,之指定一个角度,我们必须最少指定三个角度,也就是 x y z 三个角度。




    通常这三个角度是嵌套关系,例如,y 嵌套 x ,x 再嵌套 z 。


    这样就会导致,只要 y 产生变化, x 和 z 都会变化,同样,x 的变化也会影响到 z


    这样,我通过调整这三个轴的角度,就会把这个物体调整成任意角度。所以,我们称这个物体为万向节。




    理论上万向节可以随意调整,可以有一种情况例外


    我调整 x 轴,这是 z 会随着 x 的变化而变化,我通过 x 轴让 z 和 y 重合。这时候我们发现,我们“丢失“了一个轴,z 轴和 y 轴的效应相同了。这就是万向节死锁。这个时候,我还可以调整物体到任何一个角度,然而过程上,我必须同时调整三个轴。这就导致会产生一些超出预期的多余动作。


    823492_111200045_2.jpg


    例如,我想让这个挖掘机的挖臂从 A 运动到 B ,出现死锁后,他很有可能画个弧线才过去。



    为了防止这种现象,我们可以在程序里要求 z 轴和 y 轴永远不重合,这也就是你题目所说的,这完全有可能。




    然而,实际上存在另外一种方法




    那就是变化坐标系的层级。这样可以暂时避免一次死锁,然后新的坐标层级也会产生死锁。




    所以说,也有可能通过变化层级来解决死锁。那么误差,可能就不是为了解决死锁问题了。

  • 1 评论
  • jike_405459401 2015年08月06日 回答 #2楼
  • 变化坐标系层级具体是怎么操作的呢?我是初学图形学的新手,还请赐教

  • 0 评论
  • 极客学院_红结 2015年08月07日 回答 #3楼
  • 每种引擎的处理方式都可能不太一样。如果只是学习 Unity3D 的话,其实这些底层细节完全没有必要考虑。

  • 0 评论