3D到2D投影

时间:2012-06-26 02:59:32

标签: java 3d

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

查看针孔相机型号

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

ProjectedX = WorldX * D /(D + worldZ)

ProjectedY = WorldY * D /(D + worldZ)

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

答案 1 :(得分:0)

这是你的最低限度。

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

符号是:

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

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

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

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

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