3D到2D投影

我正在尝试使用一些很酷的3D效果在Java(实际上是处理 )中编写游戏。

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

所以说我有一组浮动在3D空间中的坐标(x,y,z)。 如何在2D屏幕上显示应该绘制的点(透视图)?

只是为了澄清,我只需要最低限度 (不考虑相机的位置,我只能通过抵消点来获得这种效果) – 我不是在重写OpenGL。

是的,我看到还有很多其他问题 – 但它们似乎都没有真正的答案。

这是你的最低限度。

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

符号是:

X,Y,Z是距离单位的3D坐标,例如mm或米;

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

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

row,column – 是图像像素坐标(注意:行从顶部开始向下然后向下,而Y向上)。 这是一组以摄像机中心(X,Y,Z为中心)和左上角图像(行,列,见绿线)为中心的标准坐标系。 协调系统

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

看看针孔相机型号

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

ProjectedX = WorldX * D /(D + worldZ)

ProjectedY = WorldY * D /(D + worldZ)

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