我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
          • 4. 仿射变换
            • 4.1 齐次坐标(Homogeneous Coordinates)
            • 4.2 齐次矩阵表达
          • 5. 平移变换
            • 5.1 定义
          • 6. 组合变换
            • 6.1 定义
            • 6.2 坐标系变换
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

几何变换(二)


4. 仿射变换

4.1 齐次坐标(Homogeneous Coordinates)

4.1.1 定义

齐次坐标就是将一个原本是n维的向量或者一个n维的点用一个n+1维坐标来表示,例如二维点[x,y],用[x,y,w]表示,它等同于笛卡尔坐标系中的[x/w,y/w]

[x,y,w]⇔[xw,yw]

4.1.2 齐次的含义

笛卡尔坐标[x,y],等同于齐次坐标[kx,ky,k],所以称作该坐标是"齐次",Homogeneous一词有“同质”的含义,译作同质坐标可能更准确一些

4.1.3 点和矢量

在图形学中,一般用[x,y,0]表示一个二维矢量,用[x,y,1]表示一个二维点。 这样可以保证矢量的“平移不变性”,也就是一个矢量经过平移变换,仍然保持和原先一致。

[10tx01ty001][xy0]=[xy0]

两个矢量的和或者差

u→±v→=[ux,uy,uz,0]±[vx,vy,vz,0]=[ux±vx,uy±vy,uz±vz,0]

仍然是一个矢量,而两个点的差也是矢量,点和矢量的和或者差也是矢量

vector+vector=vectorpoint−point=vectorpoint+point=?point+vector=point

其次坐标表示的两个点的和也是有意义的,表示两个点的中点

+[x2,y2,1]=[x1+x2,y1+y2,2]=[x1+x22,y1+y22,1]

4.2 齐次矩阵表达

4.2.1 线性变换无法表示图形学中所有的几何变换,因此需要定义一种变换为

α(v→)=τ(v→)+b→

用矩阵表达为

α(v→)=Av→+b→=[A11A12A13A21A22A23A31A32A33][xyz]+[bxbybz]=[x′y′z′]

常用4X4齐次矩阵来做这种运算

[A11A12A13bxA21A22A23byA31A32A33bz0001][xyz1]=[x′y′z′1]

5. 平移变换

5.1 定义

空间中的某一点u,移动到u+b→,那么用齐次矩阵表示这个变换为

T=[100bx010by001bz0001]

6. 组合变换

6.1 定义

图形学中将所有变换统一使用4X4的齐次坐标组合

R=Rn⋯R3R2R1

这样,一系列变换可以组合到一个矩阵中完成

⋯(R3(R2(R1u→))=(⋯R3R2R1)u→

6.2 坐标系变换

一个物体在不同坐标系中的变换,比如常用的局部坐标系到世界坐标系的变换

设新坐标系x'y'z'的原点在原坐标系的O→(xo,yo,zo)处,新坐标系的单位坐标矢量在原坐标系中的矢量为i′→,j′→,k′→,那么将物体的坐标从原先坐标系xyz转换到新坐标系x'y'z'的转换可以分为两部分

6.2.1 平移矩阵

构建平移矩阵,目的是将物体在原坐标系中的坐标做一个偏移,这个偏移可以视作将物体和新坐标系一起移动,将新坐标系的原点O挪到原坐标系的原点处,可以得到

T=[100−x0010−y0001−z00001]

6.2.2 构建旋转矩阵

接下来要构建一个旋转矩阵R,目的是将片以后的物体坐标和新坐标系旋转到和原坐标系一致,也就是经过这个矩阵,可以将新坐标系中的x′轴旋转到原坐标系的x轴,也就是:

R[ix′iy′iz′0]=[1000]

同理,也需要将y′轴旋转到y轴,z′轴旋转到z轴

这个矩阵并不好直接写出,但是它的逆矩阵就比较容易,也就是能够将写出

R−1=[ix′jx′kx′0iy′jy′ky′0iz′jz′kz′00001]

这个矩阵满足

R−1[1,0,0,0]T=[ix′,iy′,iz′,0]TR−1[0,1,0,0]T=[jx′,jy′,jz′,0]TR−1[0,0,1,0]T=[kx′,ky′,kz′,0]T

由于这是一个正交矩阵,所以

R=(R−1)T=[ix′iy′iz′0jx′jy′jz′0kx′ky′kz′00001]

6.2.3 组合后的坐标转换矩阵

RT=[ix′iy′iz′−(x0ix′+y0iy′+z0iz′)jx′jy′jz′−(x0jx′+y0jy′+z0jz′)kx′ky′kz′−(x0kx′+y0ky′+z0kz′)0001]=[ix′iy′iz′−O→⋅i′→jx′jy′jz′−O→⋅j′→kx′ky′kz′−O→⋅k′→0001]

验证

RT[ix′,iy′,iz′,0]T=[1,0,0,0]TRT[jx′,jy′,jz′,0]T=[0,1,0,0]TRT[kx′,ky′,kz′,0]T=[0,0,1,0]TRT[x0,y0,z0,1]T=[0,0,0,1]T
Prev
几何变换(一)
Next
法线变换