您的位置:首页 > 其它

仿射变换-空间曲线绕定点旋转的公式推导

2009-02-13 09:34 603 查看
最近正好在写render的东西,顺便把这个推一下。

可能有些数学语言比较难懂,我会解释。

问题是由论坛上问到圆柱体旋转而起,下面文章也将圆柱体为主,其他曲线可以参考类推。

问题:

绕原点旋转的圆柱体公式。

思路1:

1 圆柱体公式表达

2 三维仿射变换

3 怎么求璇转角

1 圆柱体公式表达

空间任意曲线可以表示为:

xAxT=0 (1)

其中,x=[x y z 1] xT表示x的转置,把矩阵转一下,行变列,列边行。

A是一个正定的4*4的矩阵,且AT=A ,正定的意思是A

>0 对于球面,椭圆面等需要正定矩阵A

对于双曲面,抛物面等,不需要正定,也不需要AT=A

举两个例子

A=[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 -c]; c是常数,c>0

代到公式(1)内

算出来为 x^2+y^2+z^2=c 这是球面

那么对于圆柱体公式

x^2+y^2=c

那么其对应的正定矩阵为

A=[1 0 0 0;0 1 0 0;0 0 0 0;0 0 0 -c];

A=[2 0 0 0;-2 1 0 0;-2 0 1 0;0 0 0 -c];

这个矩阵与上面相比较,第一列改了3个参数。大家自己乘一下

算出来(x-y)^2+(x-z)^2=c 这是什么?

这个是以y=z,x=0为对称轴的圆柱体

如果对这个还有问题,找线性代数的书,翻到正定二次型,看一下就好

2 三维仿射变换

上面的比较简单,只是抄了一下书。下面理解起来稍微有些困难,是我自己语言总结的 :)

三维仿射变换,其实是进行两次二维的仿射变换。每次仿射变换时,只需要考虑两个坐标。

二维仿射变换推导过程这里略过,网上有很多。

首先给出旋转点的公式,即二维的仿射变换

考虑点P(x,y),绕原点旋转了α 度后变成了P0(x0,y0),这里默认|P0|=|P|,因为我们只做旋转,不做伸缩

这是个简单的平面解析几何问题,很容易得到结果

x0=x*cosα-y*sinα

y0=x*sinα+y*cosα

这就是二维的旋转公式,也是最简单的仿射变换公式

写成矩阵形式

x0=Wx

其中,x0=[x0 y0]T x=[x y]T W=[cosα -sinα ; sinα cosα];

那么对于三维旋转而言,我们可以分解为两次二维的旋转(为什么要这样?因为只进行一次三位的变换会引起非线性项,这是我们不想看到的东西,有兴趣地可以自己推一下)

当然,将会有些小小的不同,两次二维的旋转是一次绕x轴,一次绕y轴

第一次,在yoz平面内旋转,即绕x轴旋转

x0=W0x

其中,x0=[x0 y0 z0 1]T x=[x y z 1]T W0=[1 0 0 0;0 cosα -sinα 0;0 sinα cosα 0;0 0 0 1];

可能有人奇怪,为什么向量最后多了一个1。这个1是给未来的伸缩作准备的。因为旋转的矩阵W只要稍加修改,便能成为既能旋转又能伸缩的矩阵,虽然我们现在不考虑伸缩,但将来可能会用到。况且要和之前的正定二次型做一个统一。

第二次,在xoz平面内旋转,即绕y轴旋转

x1=W1x0

其中,W1=[cosβ 0 -sinβ 0;0 1 0 0;sinβ 0 cosβ 0;0 0 0 1]; x1=[x1 y1 z1 1]T

至此,我们得到了旋转后的x1坐标

对于程序而言,只要把每个点乘上W0和W1即可。

剩下的问题是α和β怎么得到

3 怎么求旋转角

由上面的两次仿射变换,可以简单的得到旋转后的结果





由图示这里直接给出旋转角γ与α和β的关系

γ与α和β可以通过映射的原理求出来,当然还有一点,α所在平面和β所在平面是垂直的

cosγ=cosα+cosβ 有兴趣地可以自己推一下

这个公式有什么意义?

这个公式的意义在于我们可以随便找一个α,然后根据γ,解出β,然后进行两次的仿射变换

当然,要满足-1<cos<1的条件

4 总结

进行仿射变换步骤如下:

对于旋转角γ

任取α,根据cosγ=cosα+cosβ 解出β

根据α和β,进行两次仿射变换。将每个点乘以矩阵W0和W1

问题:

1 怎么保证两次旋转后能得到正确的旋转角?

2 怎么求出第一节中,(x-y)^2+(x-z)^2=c的仿射变换矩阵?

想通这两个问题,就可以理解整个过程了

提示:

1 自己手动推一遍,画几张图

2 只要做一次仿射变换就能得到答案了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: