首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从二维坐标计算三维点?

如何从二维坐标计算三维点?
EN

Stack Overflow用户
提问于 2015-01-28 00:59:57
回答 1查看 1.3K关注 0票数 0

最近,我遇到了一个涉及DirectX11和三维坐标计算的困境。我希望将鼠标坐标转换为这个3D坐标。我希望在插入多边形模型(默认立方体等)时,它的作用类似玛雅或统一。或者一个网格对象进入一个空空间。计算这个坐标需要什么步骤和数学?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-28 06:58:15

这是在光线追踪中使用的同样的数学,用于将屏幕坐标转换回3D空间中的光线。

以下是遗留的D3DXMath SDK示例"Pick10“中的Pick10代码

代码语言:javascript
复制
const D3DXMATRIX* pmatProj = g_Camera.GetProjMatrix();

POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( DXUTGetHWND(), &ptCursor );

// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / pd3dsdBackBuffer->Width ) - 1 ) / pmatProj->_11;
v.y = -( ( ( 2.0f * ptCursor.y ) / pd3dsdBackBuffer->Height ) - 1 ) / pmatProj->_22;
v.z = 1.0f;

// Get the inverse view matrix
const D3DXMATRIX matView = *g_Camera.GetViewMatrix();
const D3DXMATRIX matWorld = *g_Camera.GetWorldMatrix();
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMATRIX m;
D3DXMatrixInverse( &m, NULL, &mWorldView );

// Transform the screen space pick ray into 3D space
vPickRayDir.x = v.x * m._11 + v.y * m._21 + v.z * m._31;
vPickRayDir.y = v.x * m._12 + v.y * m._22 + v.z * m._32;
vPickRayDir.z = v.x * m._13 + v.y * m._23 + v.z * m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;

我一直想将它转换为DirectXMath,并将其重新发布到MSDN代码库中已有一段时间了,但它还没有达到堆栈的顶端。上面的代码假定为左手坐标。

请记住,一个2D屏幕位置加上转换矩阵只提供了3个自由度中的2个,所以你必须对深度做一些假设。

也可以搜索“在3D中挑选”这个词。

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

https://stackoverflow.com/questions/28182915

复制
相关文章

相似问题

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