最近在写类似mc的游戏,方块挖掘过程中要实现射线与方块面的碰撞检测
先考虑二维的情况,应该是在大家初高中做数学题经常见到的
同样的道理就拿来放到3维用(我只证明了二维的,三维的还没验证,后面试一下就知道了
实际上这一步能完成所有操作 a+b+c 等于1即保证了在平面上,
a>=0 b>=0 c>=0即保证了在三角形内
目前的代码
-
static bool raycast2Triangle( const glm::vec3 &startPoint, const glm::vec3 &direction, const glm::vec3 &triP1, const glm::vec3 &triP2, const glm::vec3 &triP3, glm::vec3 &return_cross) { //应当在前面先判断下是否平行,若平行则直接不相交 //法向量 auto norm = glm::cross(triP2 - triP1, triP3 - triP1); //如果两个向量垂直浮点数不能直接判断等于0,要跟epsilon做比较 if (abs(glm::dot(direction, norm)) < std::numeric_limits<float>::epsilon()) { return false; } //起点到三角形三点的向量矩阵 glm::mat3x3 p2tvs(triP1 - startPoint, triP2 - startPoint, triP3 - startPoint); glm::vec3 k1k2k3 = glm::inverse(p2tvs) * direction; float n = 1 / (k1k2k3.x + k1k2k3.y + k1k2k3.z); return_cross = startPoint + (n)*direction; float a = n * k1k2k3.x; float b = n * k1k2k3.y; float c = n * k1k2k3.z; //全都大于0即在三角形内 if (a >= 0 && b >= 0 && c >= 0) { return true; } else { return false; } }