我正在使用 Monotouch 和 openTK 为 iOS 编写粒子引擎。我的方法是投影每个粒子的坐标,然后在这个屏幕位置写一个正确缩放的纹理矩形。
它工作正常,但我在计算正确的深度值时遇到了麻烦,以便精灵将正确地过度绘制并被场景中的 3D 对象过度绘制。
这是我今天使用的代码:
//d=distance to projection plane
float d=(float)(1.0/(Math.Tan(MathHelper.DegreesToRadians(fovy/2f))));
Vector3 screenPos=Vector3.Transform(ref objPos,ref viewMatrix, out screenPos);
float depth=1-d/-screenPos.Z;
然后我在屏幕坐标处绘制一个三角带,将上面计算的深度值作为 z 坐标。
结果几乎是正确的,但并不完全正确。我想我需要以某种方式考虑近和远的剪裁平面(在我的情况下,近是 1,远是 10000),但我不确定如何。我尝试了各种方法和算法,但没有得到准确的结果。
我很感激这方面的一些帮助。