3D数学基础及图形开发(六)矩阵的线性变换-镜像和切变

线性变换-镜像

2D镜像,基于x轴进行镜像变换。(以轴为镜子)(x轴不变,y取反)

Paste_Image.png

镜像矩阵,2D和3D公式(针对3D空间任意一平面进行镜像变换,n为镜像平面的法向量)(我们的镜像平面都是经过原点的)

[10 20 30] 以z轴为镜子(xy平面为镜像平面)进行镜像变换得到[10 20 -30]

Paste_Image.png
基于以上的公式进行镜像(也叫反射反射)编程:我们把它分为两种重载一种为对标准的坐标轴平面进行镜像变换,一种为对任意平面进行镜像变换。
  • 对标准的坐标轴平面进行镜像变换编程。


    Paste_Image.png
  • 当对x坐标发生镜像时,那x轴的坐标全取反,y轴z轴不变。(以此类推)
    //镜像
    void Matrix4x3::setupReflect(int axis ,float k)
    {
    switch (axis)
    {
    case 1: //k为0时,X坐标发生镜像 不为0则是,X=k的平面发生镜像
    m11 = -1.0f; m12 = 0.0f; m13 = 0.0f;
    m21 = 0.0f; m22 = 1.0f; m23 = 0.0f;
    m31 = 0.0f; m32 = 0.0f; m33 = 1.0f;

          tx = 2.0f*k;
          ty = 0.0f;
          tz = 0.0f;
          break;
      case 2:  //k为0时,Y坐标发生镜像   不为0则是,Y=k的平面发生镜像
          m11 = 1.0f;  m12 = 0.0f;   m13 = 0.0f;
          m21 = 0.0f; m22 = -1.0f;    m23 = 0.0f;
          m31 = 0.0f; m32 = 0.0f;   m33 = 1.0f;
    
          tx = 0.0f;
          ty = 2.0f*k;
          tz = 0.0f;
          break;
      case 3:  //k为0时,Z坐标发生镜像   不为0则是,Z=k的平面发生镜像
          m11 = 1.0f;  m12 = 0.0f;   m13 = 0.0f;
          m21 = 0.0f; m22 = 1.0f;    m23 = 0.0f;
          m31 = 0.0f; m32 = 0.0f;   m33 = -1.0f;
    
          tx = 0.0f;
          ty = 0.0f;
          tz = 2.0f*k;
          break;
      default:
          assert(false);
          break;
      }
    }
    
  • 对任意的坐标轴平面进行镜像变换编程。

Paste_Image.png
Paste_Image.png

线性变换-切变

2D切变,相当于附加了一个x轴上基于y点的offset偏移值。(x坐标发生了变化,y没变,x被y切变)

s为根据y坐标的切变。


Paste_Image.png

3D切变:

  • x和y被z切变,s是x坐标的切变,t是y的切变,z不变。(s,t为切变的系数)


    Paste_Image.png
Paste_Image.png

切变的编程实现:

Paste_Image.png
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容