三维坐标变换:坐标变换



坐标变换

坐标变换是图形学中很基本操作无论绘制 2维还是 3维图形都会遇到下面将会讲到

  1. 如何根据坐标架进行点坐标变换
  2. 如何根据坐标架生成变换矩阵
  3. 如何通过矩阵作点坐标变换
  4. 曲线、曲面方程如何作变换
炮炮版权所有 2004
http://alphasun.icpcn.com/alphasun/index.htm
http://alphasun.html.533.net/alphasun/index.htm
msn: [email protected] QQ: 43626070


1. 如何根据坐标架进行点坐标变换


首先坐标架定义成

struct PNT3D{ double x,y,z;};struct FRAME{ PNT3D O, OX, OY, OZ;};

假设有个点 p 定义在 frame 所在坐标系 WC(World Coordinate) 的中也就是说 p 在 frame 的外为了将 p 转入 frame我们首先需要作平移

p1 = p - frame.O;

这个时候 p1 相当于定义在个将 WC 平移到 frame.O 个坐标架的中这个坐标架和 frame.O 供用坐标原点但是 3个坐标轴并不定相同为了得到 frame 中 3个坐标分量我们只须将 p1 和 3个基矢量作点积

WC->frame 变换公式:

p2.x = p1*frame.OX = (p-frame.O)*frame.OX;p2.y = p1*frame.OY = (p-frame.O)*frame.OY;p2.z = p1*frame.OZ = (p-frame.O)*frame.OZ;

其中 * 代表点积这里所得到 p2 就是 WC 中 p 在 frame 中对应到此为止我们完成了电从坐标架的外变换到坐标架内同样我们也可以采用简单思路方法把点从坐标架内变换到坐标架的外

假设 p 是 frame 的内首先

p1 = p.x*frame.OX + p.y*frame.OY + p.z*frame.OZ;

上面公式将 p 各个分量作为权值将 3个坐标架基矢量累加起来得到 p1 相当于平移 WC 和 frame 重合坐标原点坐标架中接下来自然是处理平移

frame->WC 变换公式:

p2 = p1 + freame.O; = p.x*frame.OX + p.y*frame.OY + p.z*frame.OZ + frame.O;

p2 就是转换到 WC

2.如何根据坐标架生成变换矩阵


矩阵在图形中应用十分广泛它可以表达更复杂变换形式这里所指矩阵是左乘矩阵即矩阵位于点左边

\">

我们可以用个矩阵来代表从坐标架外到坐标架中变换也可以用个矩阵代表从坐标架的中到坐标架的外变换下面 mat 是按照行优先规则存放矩阵从坐标架中变换到坐标架外 frame->WC 矩阵如下

frame->WC 变换矩阵:

mat[0] = OX.x; mat[1] = OY.x; mat[2] = OZ.x; mat[3] = Oc.x;mat[4] = OX.y; mat[5] = OY.y; mat[6] = OZ.y; mat[7] = Oc.y;mat[8] = OX.z; mat[9] = OY.z; mat[10] = OZ.z; mat[11] = Oc.z;mat[12] = 0; mat[13] = 0; mat[14] = 0; mat[15] = 1;

其中OX, OY, OZ 是坐标架 3个基矢量Oc 是坐标架坐标原点我们将这个矩阵乘以点 p(x,y,z,1)

p1 = mat*p;

我们可以得到 p1 就是 WC 坐标系下面下面是这个矩阵推导过程如果觉得头大可以跳过去

推导过程




首先我们来看上面得到根据个坐标架从坐标架内转换到坐标架外公式

\" width=534>

Px 是被转换P1 是转换后为了书写方便我们把 frame.OX 写成 OX其余类推于是得到:

\" width=417>

这个公式已经可以看到矩阵影子了为了进步向 4*4 矩阵靠近我们采用齐次形式:

\" width=383>

我们把它逐渐展开我们就得到了这大堆东西这下子矩阵相乘形式出来了这里 4*4 矩阵就是上面 mat



搞定了 frame->WC 矩阵我们现在来搞 WC->frame 矩阵

WC->frame 变换矩阵:

mat[0] = OX.x; mat[1] = OX.y; mat[2] = OX.z; mat[3] = -(Oc.x*OX.x + Oc.y*OX.y + Oc.z*OX.z);mat[4] = OY.x; mat[5] = OY.y; mat[6] = OY.z; mat[7] = -(Oc.x*OY.x + Oc.y*OY.y + Oc.z*OY.z);mat[8] = OZ.x; mat[9] = OZ.y; mat[10] = OZ.z; mat[11] = -(Oc.x*OZ.x + Oc.y*OZ.y + Oc.z*OZ.z);mat[12] = 0; mat[13] = 0; mat[14] = 0; mat[15] = 1;

写代码时候把这堆抄过去就行了如果不想看推导就跳过下面部分

推导过程


同样我们根据上面式子出发进行推导

\" width=226>

在这里我们把点也搞成了齐次形式是更好向 4*4 矩阵迈进我们继续拆解上面第 2个式子右面部分

\" width=429>

其实也很容易出来(不过炮炮是想了很长时间才想出来:)




3.如何通过矩阵作点坐标变换
这个最好办了我们这里讨论矩阵都是左乘矩阵所以把矩阵乘以点就完成了变换

x = M[0][0]*Px + M[0][1]*Py + M[0][2]*Pz + M[0][3];y = M[1][0]*Px + M[1][1]*Py + M[1][2]*Pz + M[1][3];z = M[2][0]*Px + M[2][1]*Py + M[2][2]*Pz + M[2][3];

这里 M 是个 4*4 2维存放行优先矩阵


4.曲线、曲面方程如何作变换
曲线、曲面方程有参数方程、非参数方程等形式当然曲线、曲面还可能由微分方程描述这个时候微分方程如果没有公式解事情就很麻烦计算机中般比较容易处理参数方程参数方程作变换形式上很简单

\" width=238>

右边结果会得到个矢量最终可以得到 (F1x, F1y, F1z) 形式这是个新参数方程如果曲线曲面由非参数方程描述 F(x,y,z)=0比如

\" width=118>

这个时候你可以尝试解出 x,y,z:

令 x = uy = v可以得到

\" width=102>

这下得到参数方程了可以按照前面讲步骤作转换最后你会得到曲线、曲面变换后参数方程接下来你可以尝试着消去这些中间参数 u,v这个过程可能会比较艰难



如果遇到隐式方程无法解出比如

\" width=150>

这是最倒霉情况求解是没希望当然如果你不要求精确公式你还是可以先令 x=u y=v代入的后用泰勒展开求 z 级数这也是个思路方法哦:)



Tags:  平面坐标变换 坐标变换公式 坐标变换矩阵 三维坐标变换

延伸阅读

最新评论

发表评论