线性变换-镜像
2D镜像,基于x轴进行镜像变换。(以轴为镜子)(x轴不变,y取反)
镜像矩阵,2D和3D公式(针对3D空间任意一平面进行镜像变换,n为镜像平面的法向量)(我们的镜像平面都是经过原点的)
[10 20 30] 以z轴为镜子(xy平面为镜像平面)进行镜像变换得到[10 20 -30]
基于以上的公式进行镜像(也叫反射反射)编程:我们把它分为两种重载一种为对标准的坐标轴平面进行镜像变换,一种为对任意平面进行镜像变换。
-
对标准的坐标轴平面进行镜像变换编程。
-
当对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; } }
对任意的坐标轴平面进行镜像变换编程。
线性变换-切变
2D切变,相当于附加了一个x轴上基于y点的offset偏移值。(x坐标发生了变化,y没变,x被y切变)
s为根据y坐标的切变。
3D切变:
-
x和y被z切变,s是x坐标的切变,t是y的切变,z不变。(s,t为切变的系数)