很抱歉,如果这是一个愚蠢的问题,我对3D工作还很陌生。
我有很多针孔相机,有一个3x3的旋转矩阵和一个基于原点(0,0,0)的平移向量。
我使用的系统可以移动原点并旋转相机(尽管所有相机都保持相对),从而为每个相机生成一个新的旋转矩阵和平移矢量,我可以访问这些矩阵和矢量。
那么,我的问题是:给定一个在原始空间中具有3D位置的点,如何使用同一相机的新旋转/平移来计算同一点在新空间中的3D位置?
当我问问题的时候,有没有更有效的方法?
我假设你的点的位置是相对于原点矩阵的,你说它可以平移/旋转。
假设所有这些都是必要的,你的积分的新位置由给出
pos_newCoord = R^-1 * T^-1 * pos_oldCoord
你所做的是你取下你的新原点,将其翻译回旧原点,并将其展开
newOrigin = myTranslation(myRotation(oldOrigin))
def newCoordinates(point):
return inverse(myRotation)(inverse(myTranslation)(point))
你可以预先计算逆运算,尤其是当你使用4d矩阵时。
"如何根据相机的旋转和平移变化来确定原点的旋转和翻译变化?"-OP
如果您没有被告知此信息,您可以按照以下方式恢复它。我们将使用4d点和4v4仿射变换矩阵(en.wikipedia.org/wiki/Afine_transformation)。
- 取任意4个摄像头
- 考虑原始摄影机点与其平移/旋转的点
- 可能有一种更好的线性代数方法可以做到这一点,但如果你访问维基百科链接,我们会注意到有一个3x3子矩阵a和一个3x1子矩阵b,因此有12个未知数。4个点,每个点有3个方程,可以得到12个方程。有一个解决方案,因为这种形式的矩阵是可逆的。使用您喜欢的线性方程求解技术系统进行求解,例如12x12矩阵上的高斯消去法
我建议使用齐次坐标来跟踪矩阵和变换。我认为你的问题是如何在不同的相机视图之间来回转换点。
如果将摄影机变换表示为单个矩阵运算M
,则向后仅为inverse(M)
。更好的是,如果你的相机矩阵是由几个步骤组成的,你可以反转这些步骤。例如,如果为M=rotatex(theta) * scale(sx, sy, sz) * translate(x, y, z)
,则为inverse(M) = translate(-x, -y, -z) * scale(1/sx, 1/sy, 1/sz) * rotatex(-theta)
。请注意,您还必须颠倒顺序。这是"袜子/鞋子"的财产。你先穿上袜子,然后再穿上鞋子。要反转,请先脱下鞋子,然后再脱下袜子。
一旦可以从每个相机向前和向后移动,就可以轻松地在任何相机视图之间交换点。