Я пытаюсь выполнить тест пересечения треугольника треугольника Томаса Моллера (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;
}