游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2047|回复: 3

求助!关于D3D中图元的合取

[复制链接]

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2006-2-9 22:31:00 | 显示全部楼层 |阅读模式
      之前发了不少关于射线啊相交啊什么的贴,主要就是想要实现在D3D鼠标能选中MESH,但是搞了许久还是不成功.
      看了RES上的一篇文章,<<Direct3D中实现图元的鼠标拾取>>,
地址是:    http://dev.gameres.com/Program/Visual/3D/pick_2004_529.htm
略有头绪,但按照里面的方法确还是不成功.(文章里也有部分不太看的懂,关于投影空间转换到观察空间那部分,按照后面给的公式却始终不行).不知哪位朋友对这方面有研究,能讲解一二.或给一份源码也行啊.
      多谢多谢啊
      觉得3D游戏必有的啊,可是却很难找到相关资料.

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-2-9 22:42:00 | 显示全部楼层

Re:求助!关于D3D中图元的合取

pick的例子看了,代码倒是基本上都能看懂,但是不知道为什么啊....
主要就是由屏幕坐标转到世界坐标时不知道怎么办.查了一下网页,OPENGL提供了相应的函数,DX没有?
还有是具体的公式?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-10 01:21:00 | 显示全部楼层

Re:求助!关于D3D中图元的合取

pick的例子里有,就是那段得到透视矩阵和观察矩阵之后的运算

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-2-10 09:11:00 | 显示全部楼层

Re:求助!关于D3D中图元的合取

终于成了~!
谢谢楼上大大多次不厌其烦的提醒!
附D3D转换部分的源码:
(最后部分和<<Direct3D中实现图元的鼠标拾取>>一文中不同,不知道是不是因为原文我没看懂)
       D3DXMATRIXA16 matProj;
        m_pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );

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

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

        // Get the inverse of the composite view and world matrix
        D3DXMATRIXA16 matView, matWorld, m;
        m_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
        m_pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );

        m = matWorld * matView;
        D3DXMatrixInverse( &m, NULL, &m );

        // 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;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 10:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表