3D世界变换

一直弄不清3D场景中scaleOrientation的作用,还有scale、orientation(roation)、translation的顺序问题,以往都是试图查一下,关于前者网上几乎找不到什么清晰的说明,想了一想SDK中应当有专业清晰的说明,于是翻了SDK,果然讲得很清楚。

一、关于scaleorientation

sdk上指明了this property rotate the coordination before the scale property is applied.刚一看没怎么懂,仔细想了一下,它是说在scale域作用之前旋转,而通常的旋转好像发生有scale之后,于是在场景中实测了一下,终于见到了效果。确实如果缩放不均匀时,效果才会显现出来。譬如scale 2 1 1,scaleorientation为 0 0 1 1.57,如果使用默认的scaleorientation(0 0 1 0)原本发生在X轴向上的绽放则发生在了Y轴上。

由于可见 ,效果相当于在父坐标系与本地坐标系之间补充了一次旋转机会。

二、关于缩放、旋转、位移的顺序问题

在网上找到了一篇认为解释的比较到位的文章,这里直接抄了:http://blog.csdn.net/pizi0475/article/details/9840921

一个三维场景中的各个模型一般需要各自建模,再通过坐标变换放到一个统一的世界空间的指定位置上。 这个过程在 3D 图形学中称作“世界变换” 。 世界变换有三种,平移、旋转和缩放 (实际还有不常用的扭曲和镜像,它们不是affine变换)。 这三种变换按各种顺序执行,结果是不同的。 可是实际的应用中一般按照 缩放 -> 旋转 -> 平移的顺序进行。 这样做的原因是可以获得最符合常理的变换结果。

比方说,通过世界变换希望获得的结果可能是:
将一个放在原点的物体(比方说可乐罐)移动到(30,50),让它自身倾斜 45 度,再放大 2 倍。

而不希望的结果是:
1. 和本地坐标轴成角度的缩放(会导致扭曲,像踩扁的可乐罐)。
2. 绕自己几何中心以外位置的原点的旋转 (地球公转式) 和缩放。

而颠倒了上述变换顺序就会得到这样不自然的结果。
具体的说:
* 当缩放在旋转之后进行时,会发生现象1。
* 当缩放和旋转在平移之后进行时会发生现象2。

这时因为:
1、在物体刚刚放入世界坐标系的时候使用的是本地坐标,也就是本地和全局坐标系的原点和坐标轴都是重合的(当然两者分别使用了左右手坐标系时除外 - 那是BUG),此时所有物体都“把世界坐标系当做自己的本地坐标系”。

2、而经过了坐标变换之后:
<1>缩放变换不改变坐标轴的走向,也不改变原点的位置,所以两个坐标系仍然重合。
<2>旋转变换改变坐标轴的走向,但不改变原点的位置,所以两个坐标系坐标轴不再处于相同走向。
<3>平移变换不改变坐标轴走向,但改变原点位置,两个坐标系原点不再重合。

这样就可以解释问什么缩放不能在旋转之后,而缩放和旋转都不能在平移之后了。 于是没有问题的顺序只能是 缩放 -> 旋转 -> 平移 。

posted @ 2019-08-19 15:07  IceArrow  阅读(442)  评论(0编辑  收藏  举报