那里能够找到关于视锥拣选的资料?

抬头看路 2002-04-02 01:36:01
最好是中文的,如果有代码就更好了。
我的mail:whyjld@sina.com
...全文
39 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
RealRender 2002-04-03
  • 打赏
  • 举报
回复
//-----------------------------------------------------------------------------
// Name: IntersectTriangle()
// Desc: Given a ray origin (orig) and direction (dir), and three vertices of
// of a triangle, this function returns TRUE and the interpolated texture
// coordinates if the ray intersects the triangle
//-----------------------------------------------------------------------------
BOOL CMyD3DApplication::IntersectTriangle( const D3DXVECTOR3& orig,
const D3DXVECTOR3& dir, D3DXVECTOR3& v0,
D3DXVECTOR3& v1, D3DXVECTOR3& v2,
FLOAT* t, FLOAT* u, FLOAT* v )
{
// Find vectors for two edges sharing vert0
D3DXVECTOR3 edge1 = v1 - v0;
D3DXVECTOR3 edge2 = v2 - v0;

// Begin calculating determinant - also used to calculate U parameter
D3DXVECTOR3 pvec;
D3DXVec3Cross( &pvec, &dir, &edge2 );

// If determinant is near zero, ray lies in plane of triangle
FLOAT det = D3DXVec3Dot( &edge1, &pvec );
if( det < 0.0001f )
return FALSE;

// Calculate distance from vert0 to ray origin
D3DXVECTOR3 tvec = orig - v0;

// Calculate U parameter and test bounds
*u = D3DXVec3Dot( &tvec, &pvec );
if( *u < 0.0f || *u > det )
return FALSE;

// Prepare to test V parameter
D3DXVECTOR3 qvec;
D3DXVec3Cross( &qvec, &tvec, &edge1 );

// Calculate V parameter and test bounds
*v = D3DXVec3Dot( &dir, &qvec );
if( *v < 0.0f || *u + *v > det )
return FALSE;

// Calculate t, scale parameters, ray intersects triangle
*t = D3DXVec3Dot( &edge2, &qvec );
FLOAT fInvDet = 1.0f / det;
*t *= fInvDet;
*u *= fInvDet;
*v *= fInvDet;

return TRUE;
}

HRESULT CMyD3DApplication::Pick()
{
D3DXVECTOR3 vPickRayDir;
D3DXVECTOR3 vPickRayOrig;

m_dwNumPickedTriangles = 0L;

// Get the pick ray from the mouse position
if( GetCapture() )
{
D3DXMATRIX 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 view matrix
D3DXMATRIX matView, m;
m_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
D3DXMatrixInverse( &m, NULL, &matView );

// 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;
}

// Get the picked triangle
if( GetCapture() )
{
LPDIRECT3DVERTEXBUFFER8 pVB;
LPDIRECT3DINDEXBUFFER8 pIB;
m_pObject->GetLocalMesh()->GetVertexBuffer( &pVB );
m_pObject->GetLocalMesh()->GetIndexBuffer( &pIB );

struct VERTEX { D3DXVECTOR3 p, n; FLOAT tu; FLOAT tv; };
DWORD dwFVF = m_pObject->GetLocalMesh()->GetFVF();

WORD* pIndices;
VERTEX* pVertices;
DWORD dwNumFaces = m_pObject->GetLocalMesh()->GetNumFaces();
pIB->Lock( 0,0,(BYTE**)&pIndices, 0 );
pVB->Lock( 0,0,(BYTE**)&pVertices, 0 );

for( DWORD i=0; i<dwNumFaces; i++ )
{
D3DXVECTOR3 v0 = pVertices[pIndices[3*i+0]].p;
D3DXVECTOR3 v1 = pVertices[pIndices[3*i+1]].p;
D3DXVECTOR3 v2 = pVertices[pIndices[3*i+2]].p;

// Check if the pick ray passes through this point
if( IntersectTriangle( vPickRayOrig, vPickRayDir, v0, v1, v2,
&m_fPickT, &m_fPickU, &m_fPickV ) )
{
VERTEX* v;
m_pVB->Lock( 0, 0, (BYTE**)&v, 0 );
v[3*m_dwNumPickedTriangles+0] = pVertices[pIndices[3*i+0]];
v[3*m_dwNumPickedTriangles+1] = pVertices[pIndices[3*i+1]];
v[3*m_dwNumPickedTriangles+2] = pVertices[pIndices[3*i+2]];
m_pVB->Unlock();

m_dwNumPickedTriangles++;
}
}

pVB->Unlock();
pIB->Unlock();

pVB->Release();
pIB->Release();
}

return S_OK;
}

这个你看看,是在用鼠标选取mesh中的三角形的,
里面有个不错的三角形相交函数,
源代码很长,
选取了一部分给你,
在dx8的sample中有,
波西尼尼 2002-04-03
  • 打赏
  • 举报
回复
程序专区就是c++,vb 之类的论坛,
抬头看路 2002-04-02
  • 打赏
  • 举报
回复
程序专区 是哪里?
波西尼尼 2002-04-02
  • 打赏
  • 举报
回复
http://www.gametutorials.com这里面有示例哈,你去看一看嘛,

还有就是你到程序专区去看一下,那里有你要的答案啊!
波西尼尼 2002-04-02
  • 打赏
  • 举报
回复
http://www.gametutorials.com/这里面有好的示例的,你去看一看吗
chenlee 2002-04-02
  • 打赏
  • 举报
回复
http://www.gametutorials.com/的opengl教学部分有示例。

E文的,不过有代码。

8,303

社区成员

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

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