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 投影的主要内容,如果未能解决你的问题,请参考以下文章

4D转3D透视投影

投影方式- Unity3D游戏开发培训

转如何在IOS中使用3D UI - CALayer的透视投影

Shader数学基础之深入探索透视投影变换

如何构建透视投影矩阵(无 API)

iOS动画 三维透视投影 m34