将 2D 屏幕坐标转换为 3D 世界坐标
Convert a 2D screen coordinate to a 3D world coordinate
现在我可以将 3D 世界坐标转换为 2D 屏幕坐标。我可以通过这个来实现这一点:
D3DXMATRIX viewMatrix = renderer->viewMatrix;
D3DXMATRIX projectionMatrix = renderer->projectionMatrix;
D3DXMATRIX viewProjectionMatrix = D3DXMATRIX();
D3DXMatrixMultiply(&viewProjectionMatrix, &viewMatrix, &projectionMatrix);
D3DXVECTOR3 pScreen = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 pWorld(world->getX(), world->getY(), world->getZ());
D3DXVec3TransformCoordImpl(&pScreen, &pWorld, &viewProjectionMatrix);
现在pScreen
包含 2D 屏幕坐标
如何反转以从 2D 屏幕坐标中获取 3D 世界坐标?我正在使用D3DXVec3TransformCoord
函数的实现:
D3DXVECTOR3* WINAPI D3DXVec3TransformCoordImpl(D3DXVECTOR3* pout, CONST D3DXVECTOR3* pv, CONST D3DXMATRIX* pm)
{
FLOAT norm = pm->m[0][3] * pv->x + pm->m[1][3] * pv->y + pm->m[2][3] * pv->z + pm->m[3][3];
if (norm)
{
pout->x = (pm->m[0][0] * pv->x + pm->m[1][0] * pv->y + pm->m[2][0] * pv->z + pm->m[3][0]) / norm;
pout->y = (pm->m[0][1] * pv->x + pm->m[1][1] * pv->y + pm->m[2][1] * pv->z + pm->m[3][1]) / norm;
pout->z = (pm->m[0][2] * pv->x + pm->m[1][2] * pv->y + pm->m[2][2] * pv->z + pm->m[3][2]) / norm;
}
else
{
pout->x = 0.0f;
pout->y = 0.0f;
pout->z = 0.0f;
}
return pout;
}
你可以像这样使用 SolvePnP 库:
int max = std::max(img.rows,img.cols);
Mat camMatrix = (Mat_<double>(3,3) <<
max_d, 0, img.cols/2.0,
0, max_d, img.rows/2.0,
0, 0, 1.0);
// 2d -> 3d correspondence
vector<Point2d> pts2d = ...
vector<Point3d> pts3d = ...
Mat rvec,tvec;
solvePnP(pts3d, pts2d, camMatrix, Mat(1,4,CV_64F,0.0), rvec, tvec, false, SOLVEPNP_EPNP);
// get 3d rot mat
Mat rotM(3, 3, CV_64F);
Rodrigues(rvec, rotM);
// push tvec to transposed Mat
Mat rotMT = rotM.t();
rotMT.push_back(tvec.reshape(1, 1));
// transpose back, and multiply
camMatrix * rotMT.t();
相关文章:
- 在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- OpenGL屏幕坐标到世界坐标
- 如何在3D世界中获得对象相对于父母的绝对位置
- 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标
- 计算世界坐标中z_far平面的顶点
- 如何将世界坐标转换为相机图像坐标
- 如何使用writeCloud() OpenCV函数来构建给定3D点坐标的点云
- 将 2D 屏幕坐标转换为 3D 世界坐标
- 如何获得世界坐标屏幕(DX11,C )的射线方向
- 在给定的世界坐标下修改网格上的纹理
- 相机外在矩阵到世界坐标
- 用于插入 std::unordered_set 的 3D 间坐标的唯一键
- 如何将像素坐标转换为世界坐标
- 图像点(像素)到真实世界坐标(米)
- 在OpenGL 2.1中,即使在2D空间(具有2D纹理),也可以安全使用3D TEX坐标
- 在3D世界中的显示器上固定位置绘制2D文本-OpenGL
- 使用点云库将点云转换为世界坐标
- 鼠标坐标到3D世界/投影点碰撞
- 使用GLM + Answer将屏幕转换为3D世界坐标后效果不佳