鏡面反射使用傾斜矩陣鳄炉,是為了解決在反射面下面的物體也會(huì)被渲染到反射面上的bug。
解決的辦法是把反射平面作為反射相機(jī)的近裁剪面.
最后可推導(dǎo)出公式:
具體參考Mathematics for 3D Game Programming and Computer Graphics這本書(shū)。
對(duì)照4-0_AngryBots地面反射的實(shí)現(xiàn)方法:
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的計(jì)算原理(不太看懂這個(gè)):
根據(jù)公式來(lái)看,-2為什么突然變+2了避矢?原來(lái)要結(jié)合(5.66)和(5.67)來(lái)看,Qz==M4.Q==(0,0,-1,0) . q(圖片的大Q和方法的小q是一樣的,這個(gè)小q是方法的小q)蔚晨,Qz就是等于-1盟戏,但是方法里面的q向量的z分量是1,所以只能再加個(gè)負(fù)號(hào)表示宫静。
最后的矩陣第三行等于裁剪面減去矩陣第四行,具體在書(shū)里有說(shuō)糯耍。