2014-11-23 6 views
0

Я пытаюсь выполнить тест пересечения треугольника треугольника Томаса Моллера (http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/pubs/tritri.pdf).glm :: dot, возвращающий вектор

В настоящий момент я собираюсь отфильтровать все случаи, когда расстояние от одной из треугольных вершин до плоскости, на которой лежит другой треугольник, не равно нулю, а все расстояния имеют один и тот же знак. В моей функции checkForCollision у меня есть строка, где я вычисляю произведение точек одного нормального треугольника и других вершин. Однако Visual Studio говорит мне, что:

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

Вот мой код:

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

Я думаю, что вы, возможно, неправильно алгоритм тест столкновения треугольник треугольник. Точечным произведением двух векторов является скаляр. Не имеет смысла добавлять скаляр в вектор, ergo - ошибку компилятора.

Я думаю, что проблема заключается в вашем понимании d_2 - из бумаги Вашего сайта:

d_2 = - N_2 * V_2_0

Где:

  • d_2 является скаляр в плоском уравнении (N_2 * X + d_2 = 0) - считать его как кратчайшее расстояние от плоскости до начала вашей системы координат.
  • N_2 - нормальный вектор плоскости треугольника 2
  • «*» на самом деле точка, как в точечном продукте.
  • V_2_0 является вершиной 0 треугольника 2

В вашем коде, однако, d_2 является triangle2d который вы интерпретировали как вектор и вычисляется как для каждого компонента векторного произведения:

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

Вместо этого учтите, что d_2 действительно должен быть скаляром и рассчитан как точечное произведение нормального треугольника 2 с одной из его вершин:

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