首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >3d到2d投影矩阵

3d到2d投影矩阵
EN

Stack Overflow用户
提问于 2008-09-25 00:37:53
回答 3查看 21.2K关注 0票数 16

我在3D空间中有3个点,我知道它们的确切位置。假设它们是:(x0,y0,z0)(x1,y1,z1)(x2,y2,z2)

另外,我有一个相机,它正在观察这三个点,我知道这三个点在相机视图平面上的2D位置。例如,从摄像机的角度来看,(x0,y0,z0)将是(x0',y0')(x1,y1,z1)将是(x1',y1')(x2,y2,z2)将是(x2',y2')

找到将这些3D点投影到相机视图平面上的2D点的投影矩阵的最简单方法是什么?我们对摄像机的位置一无所知。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-25 01:07:10

这为您提供了两个集合,每个集合包含3个变量的三个方程:

代码语言:javascript
复制
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'

d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'

只要使用任何在你的情况下解联立方程最简单的方法就行了(“手工”解决这些问题甚至不难)。那么你的变换矩阵就是((a,b,c)(d,e,f))。

..。

实际上,这是过度简化,并假设相机指向您的3D坐标系的原点,而没有透视。

对于透视图,变换矩阵的工作方式更类似于:

代码语言:javascript
复制
               ( a, b, c, d )   ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
               ( i, j, k, l )   ( zt )

( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;

但是4x3矩阵比12个自由度更受约束,因为我们应该有

代码语言:javascript
复制
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1

所以你应该有4个点来得到8个方程来覆盖相机位置和角度的6个变量,以及另外1个用于缩放二维视点的变量,因为我们将能够消除“中心”坐标(xc,yc)。

因此,如果你有4个点,并将你的2-D视点转换为相对于显示器的中心,那么你可以得到13个变量的14个联立方程并求解。

不幸的是,其中六个方程不是线性方程。幸运的是,这些方程中的所有变量都被限制在-1和1之间的值,因此求解方程仍然可能是可行的。

票数 12
EN

Stack Overflow用户

发布于 2008-09-25 01:13:26

您的相机有(至少)7个自由度-3个用于位置,3个用于方向,1个用于FOV。如果我错了,我肯定有人会纠正我,但看起来3分并不足以完全解决问题。

要获得此问题的一般解决方案,请查看Graphics Gems II中的“View Correlation”。

票数 3
EN

Stack Overflow用户

发布于 2008-09-25 01:08:35

我认为没有足够的信息来找到一个明确的解决方案。在不知道相机位置和视图平面的情况下,有无限多的矩阵可以解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/130829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档