碰撞深度计算

struct Projection {
    float min;
    float max;
};

Projection project(const std::vector<glm::vec2>& vertices, const glm::vec2& axis) {
    Projection projection;
    projection.min = glm::dot(axis, vertices[0]);
    projection.max = projection.min;
    for (int i = 1; i < vertices.size(); i++) {
        float dotProduct = glm::dot(axis, vertices[i]);
        if (dotProduct < projection.min) {
            projection.min = dotProduct;
        } else if (dotProduct > projection.max) {
            projection.max = dotProduct;
        }
    }
    return projection;
}

bool overlap(const Projection& p1, const Projection& p2) {
    return p1.max >= p2.min && p2.max >= p1.min;
}

glm::vec2 getMTV(const std::vector<glm::vec2>& vertices1, const std::vector<glm::vec2>& vertices2) {
    float minOverlap = std::numeric_limits<float>::max();
    glm::vec2 MTV;

    for (int i = 0; i < vertices1.size(); i++) {
        glm::vec2 axis = glm::normalize(vertices1[(i + 1) % vertices1.size()] - vertices1[i]);
        Projection p1 = project(vertices1, axis);
        Projection p2 = project(vertices2, axis);
        if (!overlap(p1, p2)) {
            return glm::vec2(0.0f);
        } else {
            float overlap = std::min(p1.max, p2.max) - std::max(p1.min, p2.min);
            if (overlap < minOverlap) {
                minOverlap = overlap;
                MTV = axis * overlap;
            }
        }
    }

    for (int i = 0; i < vertices2.size(); i++) {
        glm::vec2 axis = glm::normalize(vertices2[(i + 1) % vertices2.size()] - vertices2[i]);
        Projection p1 = project(vertices1, axis);
        Projection p2 = project(vertices2, axis);
        if (!overlap(p1, p2)) {
            return glm::vec2(0.0f);
        } else {
            float overlap = std::min(p1.max, p2.max) - std::max(p1.min, p2.min);
            if (overlap < minOverlap) {
                minOverlap = overlap;
                MTV = axis * overlap;
            }
        }
    }

    return MTV;
}

以上是一个简单的C++实现

C++中实现MTV算法的步骤:

  1. 计算两个物体在所有可能的分离轴上的投影。
  2. 如果两个物体在某个分离轴上的投影重叠,则它们之间没有发生碰撞。
  3. 如果两个物体在所有可能的分离轴上的投影都不重叠,则它们之间发生了碰撞。
  4. 计算出它们之间的最小平移向量(MTV),并将其中一个物体沿着MTV移动,直到两个物体不再重叠。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值