2014-11-23 247 views
0

我正在尝试执行Tomas Moller的三角形 - 三角形相交测试(http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/pubs/tritri.pdf)。glm :: dot返回一个向量

目前,我要过滤掉所有从三角形顶点之一到另一个三角形所在平面的距离不为零,且所有距离都有相同符号的情况。在我的​​3210函数中,我有一条线,用于计算一个三角形法线和其他顶点的点积。但是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

我想你可能误解三角三角碰撞测试算法。两个向量的点积是一个标量。在向量中添加标量是没有意义的,如果发生编译器错误。

我认为问题出在你D_2的理解 - 从纸张你网站:

D_2 = - N_2 * V_2_0

其中:

  • D_2是平面方程中的标量(N_2 * X + d_2 = 0) - 将其视为从平面到坐标系原点的最短距离。
  • N_2是三角形平面的法线向量2
  • '*'实际上是一个点,就像点积中的一样。
  • V_2_0是三角形2

在代码的顶点0,但是,D_2是您已解释为一个矢量,并计算为每组件矢量乘积triangle2d:

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

相反,认为d_2实际上应该是一个标量,并将其计算为三角形2的顶点与它的顶点之间的点积:

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