• 坐标变换,空间变换的本质


    坐标变换或空间变换,本质是相对坐标的变化,绝对坐标没变。

    世界空间有两个物体A,B。将A变换到B的坐标空间意思是:将A从世界空间变换到B的局部坐标空间,也就是在B的局部坐标系中重新表示A的坐标(也就是求出A在B坐标系中的相对坐标)

    做法很简单:

    1A - B 得到一个向量 V,

    2把V分解(投影)到B的局部坐标的各轴上,一般用单位向量的点乘实现,因为点乘表示投影,即  x = dot(V, X), y=dot(V, Y), z=dot(V, Z),X,Y,Z是B坐标系的三个轴

    得到的结果就是A在B的局部坐标系中的坐标,物体A也就变换到了物体B的局部坐标系中,简称为A变换到了B的空间中。

    在游戏引擎开发中最常用的几种变换:

    例1渲染管线中为了渲染物体,将物体变换到相机空间

    例2渲染阴影贴图shadow map时,将相机变换到灯光空间

    原理如此,由上可以推导出一个变换矩阵,直接将1,2两上步骤合为一个矩阵,推导如下:

    1A - B 得到向量V用矩阵表示就是 A乘以一个平移矩阵m,其中m[3][0]=B.x, m[3][1]=B.y, m[3][2B.z,如下

    A - B = A * m,其中m为:

     m = 1   0  0  0

       0   1  0  0

       0   0  1  0

       B.x    B.y    B.z  1

    2将向量 V 分解(投影)到 B的局部坐标系的各轴上(X, Y, Z三个轴坐标基分别right, up, look向量)

    x =  dot(V, right)

    y =  dot(V, up)

    z = dot(V, look)

    那么表示成向量与矩阵的乘法就是如下:

     V *  right.x  up.x  look.x  0     = V * m1

      right.y  up.y  look.y  0

      right.z  up.z  look.z  0

      0    0    0    1

    将1,2两步合起来:

    A * m * m1 =  

    A*      1   0  0  0  *   right.x  up.x  look.x  0    = A *   right.x    up.x    look.x    0   = A * view

         0   1  0  0    right.y  up.y  look.y  0     right.y    up.y    look.y    0

        0   0  1  0     right.z  up.z  look.z  0     right.z    up.z    look.z    0

        B.x    B.y    B.z  1     0    0    0    1    dot(B, right)  dot(B, up)  dot(B, look)  1

    其中view也就是常说的视图矩阵,由此可以看出:

    1,视图矩阵不是相机变换的专利,而是所有物体都具有的一种旋转加平移的变换。

    这也就是U3D中 Transform.lookAt的原理,就是说每个物体都有一个视图变换矩阵,包括相机,灯光。这样我们就明白了什么是【变换到灯光空间】这个难以理解的概念

    2,将物体由世界坐标系W变换到某坐标C = 物体跟随C先移到W的原点,再旋转与W各轴对齐

  • 相关阅读:
    mysql索引及优化
    mysql5.5 uuid做主键与int做主键的性能实测
    php生成UUID
    Android 图片的裁剪与相机调用
    Android GPS 临近触发
    Android中GPS类及方法简介
    永久删除 tadb.exe
    linux服务器调整参数支持高并发
    隐藏nginx 版本号信息
    nginx 重写 rewrite 基础及实例
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/11386672.html
Copyright © 2020-2023  润新知