我正在用Java创建一个简单的3D渲染引擎。我尝试了几种不同的透视投影方法,但是只有一种部分可行,离屏幕中心越远的物体出现了奇怪的拉伸效果,看起来非常不真实。基本上,我想要一个方法(无论它需要多么简单或复杂),它可以将一个要投影的3D点和“相机”的3D点和旋转(可能?)作为参数,并返回该点在屏幕上应该绘制的位置。我不关心这个方法有多长/短/简单/复杂。我只想它能生成与现代3D第一人称射击游戏或任何其他游戏中看到的透视相同的效果,并且我知道我可能需要使用矩阵乘法。我不想使用OpenGL或任何其他库,因为我很想将其作为学习练习并自己开发,如果可能的话。
非常感谢您的帮助:) 再次感谢 - James
更新:为了说明我所说的“拉伸效果”,以下是我制作的演示的一些屏幕截图。这里绘制了一个立方体(40x40x10),位于坐标(-20,-20,-5)的中心,使用我唯一得到的透视投影方法(以下是代码)。这三个屏幕截图展示了相机在第一个截图中位于(0, 0, 50),然后在X维度上移动以显示其他两个截图中的效果。
我正在使用的投影代码:
public static Point projectPointC(Vector3 point, Vector3 camera) {
Vector3 a = point;
Vector3 c = camera;
Point b = new Point();
b.x = (int) Math.round((a.x * c.z - c.x * a.z) / (c.z - a.z));
b.y = (int) Math.round((a.y * c.z - c.y * a.z) / (c.z - a.z));
return b;
}