3

我正在用 Java 创建一个简单的 3D 渲染引擎。我搞砸了,发现了几种不同的透视投影方法,但我得到部分工作的唯一一种方法有奇怪的拉伸效果,对象被移动得离屏幕中心越远,看起来非常不切实际。基本上,我想要一种方法(无论它需要多么简单或复杂),该方法将要投影的 ​​3D 点以及“相机”的 3D 点和旋转(可能?)作为参数,并返回屏幕上的位置那一点应该画在。我不在乎这种方法有多长/短/简单/复杂。我只是希望它能够生成与您在现代 3D 第一人称射击游戏或任何其他游戏中看到的相同的视角,而且我知道我可能必须为此使用矩阵乘法。我不

任何帮助将不胜感激:)再次感谢 - 詹姆斯

更新:为了说明我所说的“拉伸效果”的含义,这里有一些我放在一起的演示的屏幕截图。这里以坐标 (-20,-20,-5) 为中心的立方体 (40x40x10) 是使用我唯一可以使用的投影方法绘制的(代码如下)。三个屏幕在第一个屏幕截图中显示 (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;
}
4

1 回答 1

1

如果不陷入数学困境,你真的无法做到这一点。网上有很多资源可以解释矩阵乘法、齐次坐标、透视投影等。这是一个很大的话题,在这里重复任何所需的计算是没有意义的。

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

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

几乎不可能说出您当前的方法有什么问题 - 但根据您的解释,当物体远离中心时它看起来很奇怪的一种可能性是您的视野太宽。这会导致一种鱼眼镜头失真,其中太多的世界观被挤压到屏幕边缘。

于 2011-04-08T22:17:51.287 回答