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