c++ - GJK算法三角面测试

标签 c++ algorithm math vector collision-detection

我正在重建我的 GJK 算法,但我在四面体的三角面测试方面遇到问题。不过,我的点和边测试已经完成。

我想测试原点是否在四面体之外并且最接近特定的三角形面。

到目前为止,我的方法是计算三角形面的法线并进行一系列点积测试以确定原点是否在该面的外部并且最接近该面。我的方法有一个主要问题:我不能保证我的法线朝外。请参阅我制作的这张图以获得更好的描述:

如您所见,同一个三角形,根据顶点的排序,需要不同的叉积“排序”来产生朝外的法线。我有什么办法可以确保它们朝外吗?如果没有,是否有更好的方法来测试这些面孔?这是我的流程示例:

if (dot(ABC, AO) > 0) {
        if (dot(ACD, AO) <= 0) {
            if (dot(ADB, AO) <= 0) {
                if (dot(DCB, DO) <= 0) {
                    // closest to face of ABC

                }
            }
        }
    }
}

引用:

ABC, ACD, ADB, DCB = triangular face normals (as you can see I'm assuming the 'left' triangle from the picture)

AO = vector from A to origin

DO = vector from A to origin

最佳答案

让我们来处理人脸 ABC。使用 N = cross(B-A, C-A) 形成法线。如果dot(N, D-A) > 0,则N为内指,需要反转。最后,如果需要,规范化 N 以获得一个正常的单位。

关于c++ - GJK算法三角面测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673973/

相关文章:

c++ - 为什么我的函数调用不匹配这个通用函数实现?

c++ - 是否可以编译具有在编译时无法解析的外部依赖项的静态库?

algorithm - SICP,费马测试问题

algorithm - 什么是线性规划?

bash - 我如何执行此计算并将其输出到标准输出?

c# - WPF 两个 Line 对象的交点坐标

没有类的 C++ 用户定义转换运算符?

c++ - 动态 2d 阴影 - 混合问题

java - 从第二个字符串中删除第一个字符串中存在的字符

基于另一个部分列表的排序对列表进行排序的算法