假设相机位于(0,0,1)点,查看原点。 -z方向进入屏幕。超出z = -100的对象不可见(远视平面)。在远视平面上,x和y在右边100处被裁剪,在左边-100处被裁剪为x轴,同样被裁剪为y轴。
视口窗口宽度为600像素,高度为300像素。在2d像素坐标(x2d,y2d)上,(0,0)是左上角,x2d向右增加,y2d向下增加。
给定上述参数,给定点(x,y,z)计算(x2d,y2d)的公式是什么?每个3d点都映射到一个像素,除非裁剪了3d点(在视口中不可见)。 假设透视投影。
请不要提供谈论3d投影理论的链接。我正在寻找具有给定参数的特定问题的具体解决方案。
答案 0 :(得分:2)
如果您只想知道相似的三角形,那么您想要做的就是从3D位置找到2D屏幕位置。不需要触发器。只需要构成一个与屏幕外的像素距离相近的变量 - 称为focal_length。您可以调整该数字以使其看起来更逼真(太低看起来非常有弹性)
这个解决方案是在x中向前看,向后看只需要和额外的线来消极z,这在我的拙见中只是不必要的复杂性,但我不知道你的目的。
首先剪掉你范围之外的像素(只需使用几个if语句。我不会伪代码出来)
然后将自己定位在3D世界中:
x0 = x - yourx
y0 = y - youry
z0 = z - yourz
(在您的示例中为yourx = 0, youry = 0, yourz = -1
)
然后离开:
x2d = focal_length * x0 / z0
y2d = focal_length * y0 / z0
简单吧?我只是通过思考火车轨道来做到这一点,现在我正在尝试制作一个基本的3D游戏;)
如果你想进入3D旋转或隐藏面孔等数学......那就是事情变得棘手。
顺便说一下,根据屏幕坐标的方式,您可能需要在x2d或y2d方程中的一个或另一个上的负号。呃,你明白了。
答案 1 :(得分:2)
这应该解释一切:
视野是屏幕的极限。在“我的世界”中,FOV在整个屏幕上都是70度。
该点在y或z平面上的距离的角度(如果向下看x轴),并且是您计算的任何平面的x / y或x / z的反正切。之后,只需调整点相对于眼睛位置和方向的位置即可。通过使用角度的正弦值并进行一些数学运算来调整眼睛方向的相对位置。绘制出来总是有帮助的。好diagram from the Wikipedia article on 3D projection:
我没有给你这个代码,但这应该给你一个良好的开端。
答案 2 :(得分:1)
我建议你从这里开始:
http://msdn.microsoft.com/en-us/library/bb206269(v=vs.85).aspx
通读,它将让您了解所有坐标转换的工作原理。这是一个很好的解释:)
修改:您提出的具体问题是巨大的。该链接为您提供了如何让自己进入投影空间的解释。您可能还想查看视口(http://msdn.microsoft.com/en-us/library/bb206341(v=VS.85).aspx)。将坐标变换透视投影到2d平面后,只需将x,y和z除以生成的w坐标即可。
很抱歉,如果这对你来说不够好,但它是一个非常复杂的数学。虽然我理解它,但我需要花费数小时的时间向你解释这一切,并且通过堆栈溢出的介质,我不太可能得到我的观点。如果您阅读它们,上面的MSDN链接将使您完全了解3D转换管道。