2012-04-24 2 views
1

마우스가 가리키는 곳을 결정해야하는 사각형 영역이 있습니다.
D3DXIntersectTri를 사용하면 마우스가 가리키는 위치를 알 수 있지만 x, y, z 좌표를 계산하는 데 문제가 있습니다.D3DXIntersectTri에서 세계 좌표 가져 오기

정점 배열로 초기화 된 버텍스 버퍼에서 도면 : 지금까지,이 날 오른쪽 좌표를주지 않고이 방법이

vertices[0].position = D3DXVECTOR3(-10, 0, -10); 
vertices[1].position = D3DXVECTOR3(-10, 0, 10); 
vertices[2].position = D3DXVECTOR3(10, 0, -10); 
vertices[3].position = D3DXVECTOR3(10, 0, -10); 
vertices[4].position = D3DXVECTOR3(-10, 0, 10); 
vertices[5].position = D3DXVECTOR3(10, 0, 10); 

(영역 만의 작은 부분에서 작동 가장자리 둘 중 하나에 가까워 정확도가 떨어짐) :

BOOL Area::getcoord(Ray& ray, D3DXVECTOR3& coord) 
{ 
    D3DXVECTOR3 rayOrigin, rayDirection; 
    rayDirection = ray.direction; 
    rayOrigin = ray.origin; 

    float d; 

    D3DXMATRIX matInverse; 
    D3DXMatrixInverse(&matInverse, NULL, &matWorld); 

    // Transform ray origin and direction by inv matrix 
    D3DXVECTOR3 rayObjOrigin,rayObjDirection; 

    D3DXVec3TransformCoord(&rayOrigin, &rayOrigin, &matInverse); 
    D3DXVec3TransformNormal(&rayDirection, &rayDirection, &matInverse); 
    D3DXVec3Normalize(&rayDirection,&rayDirection); 

    float u, v; 
    BOOL isHit1, isHit2; 

    D3DXVECTOR3 p1, p2, p3; 
    p1 = vertices[3].position; 
    p2 = vertices[4].position; 
    p3 = vertices[5].position; 

    isHit1 = D3DXIntersectTri(&p1, &p2, &p3, &rayOrigin, &rayDirection, &u, &v, &d); 
    isHit2 = FALSE; 

    if(!isHit1) 
    { 
     p1 = vertices[0].position; 
     p2 = vertices[1].position; 
     p3 = vertices[2].position; 
     isHit2 = D3DXIntersectTri(&p1, &p2, &p3, &rayOrigin, &rayDirection, &u, &v, &d); 
    } 

    if(isHit1) 
    { 
     coord.x = 1 * ((1-u-v)*p3.x + u*p3.y + v*p3.z); 
     coord.y = 0.2f; 
     coord.z = -1 * ((1-u-v)*p1.x + u*p1.y + v*p1.z); 
     D3DXVec3TransformCoord(&coord, &coord, &matInverse); 
    } 

    if(isHit2) 
    { 
     coord.x = -1 * ((1-u-v)*p3.x + u*p3.y + v*p3.z); 
     coord.y = 0.2f; 
     coord.z = 1 * ((1-u-v)*p1.x + u*p1.y + v*p1.z); 
     D3DXVec3TransformCoord(&coord, &coord, &matWorld); 
    } 
    return isHit1 || isHit2; 
} 

답변

1

중도 좌표는 사용 방법에 따라 작동하지 않습니다. u와 v는 소스 벡터의 가중치를 정의합니다. 당신이 히트 포인트를 계산하려면, 당신은

coord = u * p1 + v * p2 + (1 - u - v) * p3 

을 계산해야합니다 그래서 다른 방법은 D 레이 매개 변수를 사용할 수 있습니다 :

coord = rayOrigin + d * rDirection 

두 가지 방법이 동일한 좌표 발생한다.

관련 문제