我正在努力用Java创建一个简单的3D渲染引擎。我已经搞砸了并且发现了一些不同的透视投影方法,但是我唯一一个部分工作的方法是奇怪的拉伸效果,离屏幕中心越远,物体移动,使它看起来非常不现实。基本上,我想要一个方法(无论多么简单或复杂)需要投射一个3D点,并将'相机'的3D点和旋转(可能?)作为参数,并返回屏幕上的位置这一点应该被吸引到。我不关心这种方法有多长/短/简单/复杂。我只是想让它产生你在现代3D第一人称射击游戏或任何其他游戏中看到的相同类型的视角,我知道我可能必须使用矩阵乘法。我真的不想使用OpenGL或任何其他库,因为如果可能的话,我非常希望将其作为学习练习并自行完成。
任何帮助都会受到很多赞赏:) 再次感谢 - 詹姆斯
更新:为了展示“拉伸效果”的含义,我在这里展示了一些演示的屏幕截图。在这里,一个以coords(-20,-20,-5)为中心的立方体(40x40x10)是用我唯一可用的投影方法绘制的(下面的代码)。三个屏幕在第一个屏幕截图中显示相机位于(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;
}
答案 0 :(得分:1)
如果不加入数学,你真的不能这样做。网上有大量资源可以解释矩阵乘法,齐次坐标,透视投影等。这是一个很大的主题,并且没有必要重复任何所需的计算。
以下是您学习的可能起点:
http://en.wikipedia.org/wiki/Transformation_matrix
几乎不可能说出你当前的方法有什么问题 - 但是根据你的解释,当一个物体离开中心时看起来很奇怪的一种可能性就是你的视野太宽了。这导致了一种鱼眼镜头失真,世界的太多视角被压在屏幕的边缘。