Java 中的透视 3D 投影
Posted
技术标签:
【中文标题】Java 中的透视 3D 投影【英文标题】:Perspective 3D Projection in Java 【发布时间】:2011-04-08 22:11:52 【问题描述】:我正在努力用 Java 创建一个简单的 3D 渲染引擎。我搞砸了,发现了几种不同的透视投影方法,但我唯一部分工作的方法有奇怪的拉伸效果,对象被移动得离屏幕中心越远,看起来非常不切实际。基本上,我想要一种方法(无论它需要多么简单或复杂),它需要一个 3D 点进行投影,并将“相机”的 3D 点和旋转(可能?)作为参数,并返回屏幕上的位置那一点应该画在。我不在乎这种方法有多长/短/简单/复杂。我只是希望它能够生成与您在现代 3D 第一人称射击游戏或任何其他游戏中看到的相同的视角,并且我知道我可能必须为此使用矩阵乘法。我真的不想使用 OpenGL 或任何其他库,因为如果可能的话,我很想把它作为一个学习练习并自己动手。
任何帮助将不胜感激:) 再次感谢 - 詹姆斯
更新:为了说明我所说的“拉伸效果”是什么意思,这里是我整理的一些演示的屏幕截图。这里以坐标 (-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;
【问题讨论】:
【参考方案1】:如果不沉迷于数学,你真的无法做到这一点。网络上有大量资源可以解释矩阵乘法、齐次坐标、透视投影等。这是一个很大的话题,在这里重复任何所需的计算是没有意义的。
这是您学习的一个可能起点:
http://en.wikipedia.org/wiki/Transformation_matrix
几乎不可能说出您当前的方法有什么问题 - 但根据您的解释,当物体远离中心时看起来很奇怪的一种可能性是您的视野太宽。这会导致一种鱼眼镜头失真,其中太多的世界观被挤压到屏幕边缘。
【讨论】:
谢谢,我知道我可能不得不使用各种复杂的数学。我认为你是对的,拉伸问题可能是由视野问题引起的。我尝试了一种基于 3D 透视投影的***文章的不同(并且更复杂)的方法,该方法涉及矩阵乘法和三角函数(正弦和余弦)。如果能给你任何想法,我还用一些屏幕截图和代码更新了这篇文章。再次感谢。以上是关于Java 中的透视 3D 投影的主要内容,如果未能解决你的问题,请参考以下文章