镜面反射使用倾斜矩阵,是为了解决在反射面下面的物体也会被渲染到反射面上的bug。
QQ图片20180821170628.png
解决的办法是把反射平面作为反射相机的近裁剪面.
QQ图片20180821171216.png
最后可推导出公式:
QQ图片20180821171351.png
具体参考Mathematics for 3D Game Programming and Computer Graphics这本书。
对照4-0_AngryBots地面反射的实现方法:
static Matrix4x4 CalculateObliqueMatrix (Matrix4x4 projection, Vector4 clipPlane)
{
Vector4 q = projection.inverse * new Vector4(
sgn(clipPlane.x),
sgn(clipPlane.y),
1.0F,
1.0F
);
Vector4 c = clipPlane * (2.0F / (Vector4.Dot (clipPlane, q)));
// third row = clip plane - fourth row
projection[2] = c.x - projection[3];
projection[6] = c.y - projection[7];
projection[10] = c.z - projection[11];
projection[14] = c.w - projection[15];
return projection;
}
q的计算原理(不太看懂这个):
QQ图片20180821172958.png
根据公式来看,-2为什么突然变+2了?原来要结合(5.66)和(5.67)来看,Qz==M4.Q==(0,0,-1,0) . q(图片的大Q和方法的小q是一样的,这个小q是方法的小q),Qz就是等于-1,但是方法里面的q向量的z分量是1,所以只能再加个负号表示。
最后的矩阵第三行等于裁剪面减去矩阵第四行,具体在书里有说。
网友评论