比较关心的是具体如何计算,看了一点图形学3d坐标变换的书,不过现在看公式看得一头雾水,急需几道详细的例题来了解怎样计算。
请好心人帮忙给出下面两道题的解答过程(或者有类似问题的解答过程也可以)
1 物体obj在(10,10,10),camera在(0,0,50),camera看着obj 
求camera lookat矩阵,并给出计算过程(请用数学方法推导,不要使用api) 2 obj1在(10,10,10)没旋转。obj2在(50,50,100),z轴旋转30度。 
用矩阵方法计算obj1在obj2坐标系下的矩阵和坐标,并给出计算过程。矩阵最好用openGL方式(列优先)表示,如果是行优先请说明。  
新人没积分,过两天积分多了一定补上,拜谢。

解决方案 »

  1.   

    物体转化到camera 坐标系。camera坐标系的基坐标是 100 
                                                    010
                                                    001  (是相机坐标系的不是世界坐标 )
    也就是吧lookat           100
             right * A转换为 010  求得 A
             up              001因为开始相机的坐标为 位置为pos,移到原点求得T
    T*A得到矩阵(实际上就是将相机移到世界坐标系重合),再将其它所有的物体也这样移动
      

  2.   

    谢谢yin老师...
    look at矩阵会求了(纸面计算的结果一点也不像例题的答案,计算量很大,要不是用openGl验证了一下,我肯定认为自己算错了)。
    关于第二题: 计算在新坐标系下的坐标,就是 M = Mrot(30, 0, 0, 1)*Mtrans(50,50,100)计算出这个变换矩阵M, 
    然后用M乘obj1的坐标(10,10,10,1)T吧。但是此处的:求obj1在obj2坐标系下的矩阵是什么意思?按照我现在的一点理解:一个矩阵是指一种变换。我不明白单独给定一个坐标系和一个点,这个点的矩阵是什么意思,这个矩阵是什么变换的矩阵?难道是在这个坐标系下,把坐标系原点移动到给定点的变换矩阵吗?如果是这样,只需要平移一下就可以了,不过原题里还涉及到旋转,只平移似乎还不对...
    我表达的可能有点乱...
      

  3.   

    其实一个矩阵就相当于一个新的坐标系,这个坐标系是相对于当前坐标的,既然是坐标系的变换就有平移和旋转(其实还有别的比如说镜像,投影等等).
    在这种情况下就是把obj1这个物体变换到以obj2为坐标中心的一个新的坐标系中.
      

  4.   

    谢谢P_hantom
    请详细说一下吧。我刚才想了一下,我在2楼的思路似乎不对。
    求obj1在obj2坐标系下的坐标:我现在的思路是这样: 
       1) 求矩阵M, M是把原坐标系变换到obj2坐标系的矩阵,过程是:M=  Mrot(30, 0, 0, 1)*Mtrans(50,50,100)   // 平移,旋转的顺序对吗?
       2)因为:对ojb2坐标系下的一个点P有 M*P = P在原坐标系下的坐标; 那么,求P在新坐标系下坐标的方法就是 P乘以M的逆矩阵。 所以求obj1在obj2下的坐标就是:M的逆矩阵乘以obj1的坐标(10,10,10,1)T。
       不过这样求逆矩阵太麻烦了,有更好的方法吗?对于另一个问题:“求obj1在ojb2坐标系下的矩阵”,还是不明白要求什么,能给出具体的计算过程吗?
      

  5.   

    http://blog.csdn.net/zhyinty/archive/2008/12/25/3607558.aspx
      

  6.   

    DirectX 分别提供了左手系和右手系创建ViewMatrix的方法D3DXMATRIX * D3DXMatrixLookAtLH(
      D3DXMATRIX *pOut,
      CONST D3DXVECTOR3 *pEye,
      CONST D3DXVECTOR3 *pAt,
      CONST D3DXVECTOR3 *pUp
    );
     xaxis.x           yaxis.x           zaxis.x          0
     xaxis.y           yaxis.y           zaxis.y          0
     xaxis.z           yaxis.z           zaxis.z          0
    -dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l
    D3DXMATRIX * D3DXMatrixLookAtRH(
      D3DXMATRIX *pOut,
      CONST D3DXVECTOR3 *pEye,
      CONST D3DXVECTOR3 *pAt,
      CONST D3DXVECTOR3 *pUp
    );
    zaxis = normal(Eye - At)
    xaxis = normal(cross(Up, zaxis))
    yaxis = cross(zaxis, xaxis)
        
     xaxis.x           yaxis.x           zaxis.x          0
     xaxis.y           yaxis.y           zaxis.y          0
     xaxis.z           yaxis.z           zaxis.z          0
    -dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l