コード例 #1
0
float DesertScenePlane::GetHeight( 
	cGameObject* target )
{
	const auto& groupRepo = static_cast<cObjRenderer*>( 
		m_owner->GetRenderer( ))->GetGroupRepo( );

	BOOL collised = FALSE;
	float hitDist = 0.f;

	for ( auto* groupElem : groupRepo )
	{
		const auto& vertices = groupElem->GetVertex( );
		
		for ( int i = 0; i < vertices.size( ); i += 3 )
		{
			const float rayYPos = 10000.f;
			D3DXVECTOR3 rayPos( target->GetPosition( ).x, rayYPos,
				target->GetPosition( ).z );

			D3DXVECTOR3 v1;
			D3DXVec3TransformCoord( &v1, &vertices[i].p, &m_owner->GetWorld( ));
			D3DXVECTOR3 v2;
			D3DXVec3TransformCoord( &v2, &vertices[i+1].p, &m_owner->GetWorld( ) );
			D3DXVECTOR3 v3;
			D3DXVec3TransformCoord( &v3, &vertices[i+2].p, &m_owner->GetWorld( ) );

			collised = D3DXIntersectTri(
				&v1,
				&v2,
				&v3,
				&rayPos,
				&D3DXVECTOR3( 0.f, -1.f, 0.f ),
				nullptr,
				nullptr,
				&hitDist
			);

			if ( collised == TRUE )
			{
				target->GetPosition( ).y = rayYPos - hitDist;
				return ( rayYPos-hitDist );
			}
		}
	}

	return 0.f;
}
コード例 #2
0
bool ComTerrain::GetHeight(float & height, const D3DXVECTOR3 & pos)
{
	D3DXVECTOR3 rayPos(pos.x, pos.y + m_rayDistance, pos.z);
	D3DXVECTOR3 rayDir(0, -1, 0);
	float distance = 0.0f;

	for (int i = 0; i < m_vecIndices.size(); i += 3)
	{
		D3DXVECTOR3 v1 = m_vecVertices[m_vecIndices[i]].p;
		D3DXVECTOR3 v2 = m_vecVertices[m_vecIndices[i + 1]].p;
		D3DXVECTOR3 v3 = m_vecVertices[m_vecIndices[i + 2]].p;

		if (D3DXIntersectTri(&v1, &v2, &v3, &rayPos, &rayDir, NULL, NULL, &distance))
		{
			height = rayPos.y - distance;
			return true;
		}
	}

	return false;
}