step_by_step实例学习

矩阵变换

平移

image-20230106090323761

​ 因为所有的位移值都要乘以向量的w行,所以位移值会加到向量的原始值上。这样使用一个4维向量表示一个3维向量叫做齐次坐标。通常对于表示点的矩阵会让w=1,而对于表示向量的矩阵会让w=0,因为点可以被做变换而向量不可以,可以改变一个向量的长度和方向,但是长度和方向一样的所有向量都是相等的,不管他们的起点在哪里,所以可以把所有的向量起点放到原点来看。对于向量设置w=0然后乘以变换矩阵会得到和自身一样的向量。

旋转

image-20230106093340662

旋转后的坐标变换

image-20230106093352086 image-20230106093404574

旋转矩阵

绕z轴

image-20230106093419847

绕y轴

image-20230106093429878

绕z轴

image-20230106093440038

更好的方法是四元组

缩放

进行缩放变换其实很简单。我们从最开始的原变换矩阵来看,回忆平移变换矩阵的样子,我们保持结果矩阵中V1,V2和V3保持原样的办法是让变换矩阵主对角线上的值都为’1’,这样原向量一次都和1相乘之后依然保持不变,各分量之间互不影响。所以,这里的缩放变换,只要把那些‘1’换成我们想缩放的值,原向量各分量分别乘以这些值之后就会在相应坐标轴上进行相应的缩放了,值大于1则放大,值小于1则缩小。

如果片断着色器没有显式地请求那个变量(你可以使用同一个顶点着色器混合并匹配多个片断着色器)那么一般的驱动优化会丢弃顶点着色器vs中只是影响该变量的操作(特定的shader程序是针对vs和fs的配对组合)。但如果片断着色器fs确实使用到了那个变量,光栅器会在光栅化阶段对其进行插值,并且每一次片断着色器fs的调用都会提供一个匹配特定位置的插值后的值,这意味着相邻的两个像素的值都略有不同(虽然随着三角形离摄像头越来越远那样会越来越不合适)。

***经常情况下依赖插值的两个变量是三角形的法向量和纹理坐标***。顶点的法向量通常是计算包含这个顶点的所有三角形法向量的平均值而得。如果物体不是平坦的话那么每个三角形的三个顶点的法向量会各不相同,那样我们可以通过插值来计算每个像素的法向量,那些向量会用于光线的计算,从而产生更逼真可信的光照效果。插值对于纹理坐标的应用也类似,这些坐标作为模型的一部分定义在每个顶点上。为了用贴图覆盖三角形你必须对每个像素进行一样的插值操作并给每个像素定义正确的纹理坐标,这些坐标都是插值的结果

复合变换

1
2
3
4
glm::mat4 Rotation_tree2 = eulerAngleYXZ(gOrientation1.y, gOrientation1.x, gOrientation2.z);
glm::mat4 Transla_tree2 = translate(mat4(), gPosition2);
glm::mat4 Scaling_tree2 = scale(mat4(), vec3(0.3f, 0.3f, 0.3f));
glm::mat4 Model_tree2 = Transla_tree2 * Rotation_tree2 * Scaling_tree2;
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信