2014-11-23 4 views
0

Tomas Moller의 삼각 삼각형 교차 테스트 (http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/pubs/tritri.pdf)를 구현하려고합니다.벡터를 반환하는 glm :: dot

현재 삼각형 정점 중 하나에서 다른 삼각형이있는 평면까지의 거리가 0이 아니며 모든 거리가 같은 부호를 갖는 모든 경우를 필터링하는 것까지입니다. 내 checkForCollision 함수에서 나는 한 삼각형의 법선과 다른 꼭지점의 내적을 계산하는 선을 가지고 있습니다. 난 당신이 삼각형 삼각형 충돌 테스트 알고리즘을 잘못 해석했다고 생각

struct triangle 
{ 
    glm::vec3 vertex0, vertex1, vertex2; 

    triangle(glm::vec3 vert1, glm::vec3 vert2, glm::vec3 vert3) 
    { 
     vertex0 = vert1; 
     vertex1 = vert2; 
     vertex2 = vert3; 
    } 
}; 

struct triangleDistance 
{ 
    float vertex0, vertex1, vertex2; 
}; 

int sign(const double inputNumber) 
{ 
    if (inputNumber >= 0) return 1; 
    else return -1; 
} 

bool signIsTheSame(const triangleDistance inputDistance) 
{ 
    return (sign(inputDistance.vertex0) == sign(inputDistance.vertex1) && 
     sign(inputDistance.vertex1) == sign(inputDistance.vertex2)); 
} 

bool noneAreZero(const triangleDistance inputDistance) 
{ 
    return (inputDistance.vertex0 == 0 || inputDistance.vertex1 == 0 || inputDistance.vertex2 == 0); 
} 

glm::vec3 computeTriangleNormal(const triangle inputTriangle) 
{ 
    glm::vec3 crossTerm1, crossTerm2; 
    return glm::normalize(glm::cross((inputTriangle.vertex1 - inputTriangle.vertex0), 
     (inputTriangle.vertex2 - inputTriangle.vertex0))); 
} 

bool checkForCollision(const triangle triangle1, const triangle triangle2) 
{ 
    glm::vec3 triangle2Normal = computeTriangleNormal(triangle2); 
    glm::vec3 triangle2d = -triangle2Normal * triangle2.vertex0; 

    triangleDistance triangle1Distance; 

    triangle1Distance.vertex0 = glm::dot(triangle2Normal, triangle1.vertex0) + triangle2d; 
    triangle1Distance.vertex1 = glm::dot(triangle2Normal, triangle1.vertex1) + triangle2d; 
    triangle1Distance.vertex2 = glm::dot(triangle2Normal, triangle1.vertex2) + triangle2d; 

    return (signIsTheSame(triangle1Distance) && noneAreZero(triangle1Distance)); 

    return false; 
} 

답변

0

:

Error 7 error C2440: '=' : cannot convert from 'glm::detail::tvec3<glm::mediump_float>' to `'float'` 

여기 내 코드입니다 : 그러나 Visual Studio에서 내게 말하고있다. 두 벡터의 내적은 스칼라입니다. 벡터에 스칼라를 추가하는 것은 의미가 없으며 컴파일러 오류가 발생합니다.

나는 문제가 d_2라는의 이해에 달려있다 생각 - 종이 당신의 사이트에서 :

d_2라는 = -이 * V_2_0

N_2 장소 :

  • d_2라는이 평면 방정식 (N_2 * X + d_2 = 0)의 스칼라 - 평면에서 좌표계의 원점까지의 최단 거리로 생각하십시오.
  • N_2는 삼각형 평면의 법선 벡터입니다.
  • '*'는 내적에서와 같이 실제로 점입니다.

    glm::vec3 triangle2d = -triangle2Normal * triangle2.vertex0; 
    

    :

  • V_2_0 코드에서 삼각형 2

의 정점 0, 그러나, d_2라는 당신이 컴퍼넌트마다의 벡터 제품으로 벡터를로 해석하고 계산 한 triangle2d입니다 대신 d_2가 실제로 스칼라이어야하고 꼭지점 중 하나와 함께 삼각형 2 법선과 내적 점으로 계산되어야한다고 생각하십시오.

float triangle2d = glm::dot(-triangle2Normal, triangle2.vertex0);