Java中的透视三维投影

3
我正在用Java创建一个简单的3D渲染引擎。我尝试了几种不同的透视投影方法,但是只有一种部分可行,离屏幕中心越远的物体出现了奇怪的拉伸效果,看起来非常不真实。基本上,我想要一个方法(无论它需要多么简单或复杂),它可以将一个要投影的3D点和“相机”的3D点和旋转(可能?)作为参数,并返回该点在屏幕上应该绘制的位置。我不关心这个方法有多长/短/简单/复杂。我只想它能生成与现代3D第一人称射击游戏或任何其他游戏中看到的透视相同的效果,并且我知道我可能需要使用矩阵乘法。我不想使用OpenGL或任何其他库,因为我很想将其作为学习练习并自己开发,如果可能的话。

非常感谢您的帮助:) 再次感谢 - James

更新:为了说明我所说的“拉伸效果”,以下是我制作的演示的一些屏幕截图。这里绘制了一个立方体(40x40x10),位于坐标(-20,-20,-5)的中心,使用我唯一得到的透视投影方法(以下是代码)。这三个屏幕截图展示了相机在第一个截图中位于(0, 0, 50),然后在X维度上移动以显示其他两个截图中的效果。

相机在(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;
}
1个回答

1

如果你想深入了解编程,就必须掌握数学知识。网上有很多资源可以帮助你理解矩阵乘法、齐次坐标、透视投影等概念。这是一个庞大的主题,我们没有必要在这里重复任何必要的计算。

以下是你学习的可能起点:

http://en.wikipedia.org/wiki/Transformation_matrix

几乎不可能说出你当前方法的问题所在,但根据你的解释,当物体远离中心时看起来很奇怪的一个可能性是你的视野太宽了。这会导致一种鱼眼镜头畸变,使得太多的世界观被挤压到屏幕边缘。

谢谢,我知道我可能需要使用各种复杂的数学。我认为你说得对,拉伸问题可能是视野问题造成的。我尝试了一种不同(也更复杂)的方法,基于维基百科上关于3D透视投影的文章,其中涉及矩阵乘法和三角函数(sin和cos)。我还更新了帖子,附上了一些屏幕截图和代码,如果这能给你任何想法的话。再次感谢。 - jt78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接