3d 如何将三维点更改为二维像素位置?

3d 如何将三维点更改为二维像素位置?,3d,3d,假设相机位于(0,0,1)点,观察原点-z方向进入屏幕。z=-100以外的对象不可见(远视平面)。对于x轴和y轴,在远视平面上,x和y分别在右侧和左侧分别剪裁为100和-100 视口窗口的宽度为600像素,高度为300像素。在二维像素坐标(x2d,y2d)上,(0,0)是左上角,x2d向右增加,y2d向下增加 给定上述参数,计算给定点(x,y,z)的(x2d,y2d)的公式是什么?除非剪裁了3d点(在视口中不可见),否则每个3d点都会映射到一个像素。 假设透视投影 请不要提供有关3d投影理论的链

假设相机位于(0,0,1)点,观察原点-z方向进入屏幕。z=-100以外的对象不可见(远视平面)。对于x轴和y轴,在远视平面上,x和y分别在右侧和左侧分别剪裁为100和-100

视口窗口的宽度为600像素,高度为300像素。在二维像素坐标(x2d,y2d)上,(0,0)是左上角,x2d向右增加,y2d向下增加

给定上述参数,计算给定点(x,y,z)的(x2d,y2d)的公式是什么?除非剪裁了3d点(在视口中不可见),否则每个3d点都会映射到一个像素。 假设透视投影


请不要提供有关3d投影理论的链接。我正在用给定的参数寻找这个特定问题的具体解决方案。

我建议您从这里开始:

通读一遍,你就会对所有坐标变换的工作原理有一个很好的了解。这是一个很好的解释:)

编辑:您提出的具体问题非常多。该链接确实为您提供了如何进入投影空间的解释。您可能还希望查看视口()。坐标变换后,透视投影到二维平面只需将x、y和z除以生成的w坐标即可


抱歉,如果这对你来说还不够好,但这是一个非常复杂的数学问题。虽然我确实理解这一点,但我会花上几个小时亲自向你们解释这一切,而且通过堆栈溢出的媒介,我不太可能很好地理解我的观点。如果您阅读了上面的MSDN链接,您将对3D转换管道有一个全面的了解。

如果您只想从3D位置中找到2D屏幕位置,那么如果您知道类似的三角形,那么就很容易了。不需要触发器。只要编一些变量,就是屏幕到眼睛的距离(以像素为单位),称之为焦距。您可以调整该体形,使其看起来更逼真(太低看起来很有弹性)

这个解决方案是为了在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游戏;)

如果你想进入三维旋转或隐藏面等数学。。。那就是事情变得。。。狡猾


顺便说一下,根据屏幕坐标的不同,您可能需要在一个或另一个或两个x2d或y2d方程上使用负号。我知道了。这应该可以解释一切:

视场是屏幕的极限。在Minecraft中,视场在整个屏幕上为70度

距离点多远的角度位于y或z平面(如果向下看x轴),并且是计算的任意平面的x/y或x/z的反正切。之后,只需调整点的位置,使其相对于眼睛的位置和方向。通过使用角度正弦和做一些数学运算,从眼睛方向调整相对位置。把它画出来总是有帮助的。A好的:


我没有给你这个代码,但这应该给你一个好的开始。

这似乎是一个家庭作业问题?我建议你把三角学课本拿出来。这不是家庭作业问题。一个编程和编码的问题。问题+1,-2对你的态度我知道你的反对票比你的赞成票多,所以我并不感到惊讶。你所做的只是在没有任何问题背景的情况下对其他问题投了反对票。所有你说的都是对态度投反对票。嗯?问题很清楚,我不是在寻找链接(连3d到2d转换都不谈!)。我正在寻找一个具体问题的具体解决方案,我在问题中精确地描述了这个问题。)@alan,在我看来,维基百科参考文献中给出了确切的具体解决方案。你检查过了吗?同样,msdn链接也是如此。你看了吗?我很想知道这些参考文献如何不能解决你的具体问题。@Alan:很公平,我在我的帖子中又增加了一点细节,但你问的问题是,在一篇堆栈溢出的帖子中,答案太大了。如果您不同意,很抱歉,但恐怕您必须先阅读大量的资料,然后才能掌握3D转换。@goz,这些msdn参考资料太棒了!谢谢这位业余失写者。@Alan:那么你想要的是被填鸭式地灌输答案,而不是学习如何去做?对我来说,这是不可能的。当然有一个矩阵,你可以将你的顶点乘以它,这将把你带到正确的投影空间(后面是w除法)并得到你的最终答案,但是推导出它的hot知识比随机矩阵有用很多倍。你可能想自己尝试一下,然后问一些你不懂的具体问题。那是你在网上发布的时候,依我看。