求助,D3Dpick的问题。

csdn网速很慢 2011-10-18 12:42:30
我照着D3D 的pick例子复制到自己的程序里但是生成的拾取射线总是指向世界的原点附近。 但是我鼠标点的并不是原点附近。
请问这是哪一步错了?

这是我复制的代码
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;

我感觉好像是自己对这个拾取射线理解错了,求搞过的高人解答下。
...全文
76 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fox_linda 2011-12-08
  • 打赏
  • 举报
回复
test
csdn网速很慢 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lirunfa 的回复:]

最后要逆到模型的空间中。
[/Quote]
恩 我看出来了。1楼算出来的是世界空间中的射线。 是不是要逆到物体的模型空间。这个怎么做。射线没有做世界的逆转换到那个空间了?
lirunfa 2011-10-22
  • 打赏
  • 举报
回复
最后要逆到模型的空间中。
雪人2015 2011-10-21
  • 打赏
  • 举报
回复
你最后的变换怎么手工进行?很不清晰。

不过代码似乎是对的,由于不够清晰而且不知道你程序内部的其他的地方是否正确。

m._41,_m._42,m._43其实就是相机的世界坐标。

给你个比较清晰的代码:


d3d::Ray CalcPickingRay(int x, int y)
{
float px = 0.0f;
float py = 0.0f;

D3DVIEWPORT9 vp;
Device->GetViewport(&vp);

D3DXMATRIX proj;
Device->GetTransform(D3DTS_PROJECTION, &proj);

px = ((( 2.0f*x) / vp.Width) - 1.0f) / proj(0, 0);
py = (((-2.0f*y) / vp.Height) + 1.0f) / proj(1, 1);

d3d::Ray ray;
ray._origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
ray._direction = D3DXVECTOR3(px, py, 1.0f);

return ray;
}

void TransformRay(d3d::Ray* ray, D3DXMATRIX* T)
{
// transform the ray's origin, w = 1.
D3DXVec3TransformCoord(
&ray->_origin,
&ray->_origin,
T);

// transform the ray's direction, w = 0.
D3DXVec3TransformNormal(
&ray->_direction,
&ray->_direction,
T);

// normalize the direction
D3DXVec3Normalize(&ray->_direction, &ray->_direction);
}


其中的d3d::Ray是一个自定义的射线结构体。CalcPickingRay获得世界坐标中的射线,TransformRay将射线转换到世界坐标。

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧