3

我正在尝试用 Java(实际上是Processing )编写一个带有一些很酷的 3D 效果的游戏。

我可以选择两个 3D 渲染器,但都没有默认渲染器的质量或灵活性。我在想,如果我能得到一个功能来进行项目

假设我有一组浮动在 3D 空间中的坐标 (x, y, z)。我将如何获得应该在 2D 屏幕上绘制该点的位置(透视)?

只是为了澄清,我只需要最低限度(不考虑相机的位置,我可以通过偏移点来获得这种效果) - 我不是重写 OpenGL。

是的,我看到这方面还有很多其他问题——但似乎没有一个问题真正有明确的答案。

4

2 回答 2

2

这是你的最低限度。

column = X*focal/Z + width/2
row = -Y*focal/Z  + height/2

符号是:

X、Y、Z是距离单位(如毫米或米)的 3D 坐标;

焦距是以像素为单位的相机焦距(对于 VGA 分辨率,焦距 = 500 是一个合理的选择,因为它会产生大约 60 度的视野;如果图像尺寸较大,则按比例缩放焦距);请注意,物理焦点~1cm << Z,这简化了上一个答案中提出的公式。

高度和宽度是图像或传感器的尺寸(以像素为单位);

行、列- 是图像像素坐标(注意:行从顶部开始向下,而 Y 向上)。这是一组以相机中心(X、Y、Z)和图像左上角(行、列,见绿线)为中心的标准坐标系。 坐标系

您确实不需要使用 OpenGL,因为这些公式很容易实现。但是会有一些副作用,例如当您的对象有多个表面时,它们将无法正确显示,因为您无法模拟遮挡。因此,您可以添加一个深度缓冲区,它是一个简单的二维数组,具有浮点 Z 值,可以跟踪哪些像素更近,哪些更远;如果尝试在同一投影位置多次写入,则总是越靠近的像素获胜。祝你好运。

于 2014-02-24T05:33:55.840 回答
1

查看针孔相机型号

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

ProjectedX = WorldX * D / ( D + worldZ )

ProjectedY = WorldY * D / ( D + worldZ )

其中 D 是投影平面和眼睛之间的距离

于 2012-06-26T05:57:43.253 回答