C++ AABB碰撞使实际精灵的大小加倍

C++ AABB碰撞使实际精灵的大小加倍,c++,opengl,aabb,C++,Opengl,Aabb,所以,我让这个代码用于AABB碰撞,直到我决定在Y轴上制作一个比在X轴上更大的精灵。我试图修复代码,但现在它只是将冲突大小增加了一倍,而不是实际的精灵大小。例如,雪碧1 iVec2(50100)的尺寸,雪碧2 iVec2(30,30)的尺寸 CollisionData Collision::DoCollision(游戏对象和对象1、游戏对象和对象2){ iVec2中心(object1.Position.x+object1.Size.x/2,object1.Position.y+object1.S

所以,我让这个代码用于AABB碰撞,直到我决定在Y轴上制作一个比在X轴上更大的精灵。我试图修复代码,但现在它只是将冲突大小增加了一倍,而不是实际的精灵大小。例如,雪碧1 iVec2(50100)的尺寸,雪碧2 iVec2(30,30)的尺寸

CollisionData Collision::DoCollision(游戏对象和对象1、游戏对象和对象2){
iVec2中心(object1.Position.x+object1.Size.x/2,object1.Position.y+object1.Size.y/2);
iVec2半_区段(object2.Size.x/2,object2.Size.y/2);
iVec2 aabb_中心(object2.Position.x+half_extents.x,object2.Position.y+half_extents.y);
iVec2差异=中心-aabb_中心;
iVec2差异2=中心-aabb_中心;
iVec2钳制=glm::钳制(差异,-half_区段,half_区段);
iVec2 clamped2=glm::clamp(差异2,-iVec2(object1.Size.x/2,object1.Size.y/2),iVec2(object1.Size.x/2,object1.Size.y/2);
iVec2最近=aabb_中心+夹紧;
iVec2 closest2=aabb_中心+卡箍2;
差=最近-中心;
差2=最接近的2-中心;

如果(glm::length(difference),我建议做一个简单的重叠检查

如果两段重叠,可通过以下方式进行检查:

overlap = (x1+w1) > x2 && (x2+w2) > x1
其中,
x1
是第一段的起点,
w1
是第一段的宽度。
x2
是起点,
w2
是第2n段的宽度

如果要检查与轴对齐的边界框是否重叠,则ypu必须对两个尺寸进行测试

bool overlap = 
    (object1.Position.x + object1.Size.x) > object2.Position.x) &&
    (object2.Position.x + object2.Size.x) > object1.Position.x) &&
    (object1.Position.y + object1.Size.y) > object2.Position.y) &&
    (object2.Position.y + object2.Size.y) > object1.Position.y);
如果要知道重叠的数量,必须计算长方体的中心点,并将中心点的距离与长方体的一般一半大小进行比较:

CollisionData Collision::DoCollision(GameObject &object1, GameObject &object2) {

    iVec2 center1(
        object1.Position.x + object1.Size.x / 2,
        object1.Position.y + object1.Size.y / 2);
    iVec2 center2(
        object2.Position.x + object2.Size.x / 2,
         object2.Position.y + object2.Size.y / 2);

    iVec2 dist = center1 - center2;
    iVec2 size((object1.Size.x + object2.Size.x) / 2, (object1.Size.y + object2.Size.y) / 2);


    iVec2 difference = size - iVec2(abs(dist.x), abs(dist.y));

    bool overlap = difference.x > 0 && difference.y > 0;

    if ( overlap )
    {
        iVec2 min1 = object1.Position;
        iVec2 min2 = object2.Position;
        iVec2 max1 = object1.Position + object1.Size;
        iVec2 max2 = object2.Position + object2.Size;

        bool horizontal = difference.x > difference.y;
        if ( min2.x > min1.x && max1.x < max2.x || min1.x > min2.x && max2.x < max1.x )
             horizontal = false;
        else if ( min2.y > min1.y && max1.y < max2.y || min1.y > min2.y && max2.y < max1.y )
             horizontal = true;

        return std::make_tuple(
            GL_TRUE, !horizontal ? (dist.x < 0 ? LEFT: RIGHT) : (dist.y < 0 ? UP : DOWN), difference );
    }

    return std::make_tuple(GL_FALSE, UP, glm::vec2(0, 0));
}
CollisionData Collision::DoCollision(游戏对象和对象1、游戏对象和对象2){
iVec2中心1(
object1.Position.x+object1.Size.x/2,
object1.Position.y+object1.Size.y/2);
iVec2中心2(
object2.Position.x+object2.Size.x/2,
object2.Position.y+object2.Size.y/2);
iVec2距离=中心1-中心2;
iVec2大小((object1.size.x+object2.size.x)/2,(object1.size.y+object2.size.y)/2);
iVec2差异=尺寸-iVec2(绝对值(dist.x)、绝对值(dist.y));
布尔重叠=差.x>0和差.y>0;
如果(重叠)
{
iVec2 min1=对象1.位置;
iVec2 min2=对象2.位置;
iVec2 max1=object1.Position+object1.Size;
iVec2 max2=object2.Position+object2.Size;
bool水平=差异.x>差异.y;
if(min2.x>min1.x&&max1.xmin2.x&&max2.xmin1.y&&max1.ymin2.y&&max2.y
我曾经使用过该代码,但我需要在碰撞时向后推对象,因此我使用VectorDifference()进行检查它落在哪里,向上、向下、向左、向右……否则我不知道在这里推回对象,使用最后一个键也没用。@ether是的,我明白了。但是如果对象是左、右、向上或向下,则用
dist
编码。如果
dist.x
小于0,则
object1
object2
的左边。哇,明白了吗rking,非常感谢,但还有一个小问题…它不知道何时使用dist.x和dist.y.@ether如果
difference.x>difference.y,那么你必须使用
dist.x
。看到答案了。可能你必须上下交换
,这取决于你的坐标系,我不知道。事实上,我已经知道了但是仍然会犯类似的错误,如果物体2 x的大小大于y的大小,或者反之亦然,那么如果一个物体是,比如说在左边,它仍然会被移到顶部,因为差异很大。。。
CollisionData Collision::DoCollision(GameObject &object1, GameObject &object2) {

    iVec2 center1(
        object1.Position.x + object1.Size.x / 2,
        object1.Position.y + object1.Size.y / 2);
    iVec2 center2(
        object2.Position.x + object2.Size.x / 2,
         object2.Position.y + object2.Size.y / 2);

    iVec2 dist = center1 - center2;
    iVec2 size((object1.Size.x + object2.Size.x) / 2, (object1.Size.y + object2.Size.y) / 2);


    iVec2 difference = size - iVec2(abs(dist.x), abs(dist.y));

    bool overlap = difference.x > 0 && difference.y > 0;

    if ( overlap )
    {
        iVec2 min1 = object1.Position;
        iVec2 min2 = object2.Position;
        iVec2 max1 = object1.Position + object1.Size;
        iVec2 max2 = object2.Position + object2.Size;

        bool horizontal = difference.x > difference.y;
        if ( min2.x > min1.x && max1.x < max2.x || min1.x > min2.x && max2.x < max1.x )
             horizontal = false;
        else if ( min2.y > min1.y && max1.y < max2.y || min1.y > min2.y && max2.y < max1.y )
             horizontal = true;

        return std::make_tuple(
            GL_TRUE, !horizontal ? (dist.x < 0 ? LEFT: RIGHT) : (dist.y < 0 ? UP : DOWN), difference );
    }

    return std::make_tuple(GL_FALSE, UP, glm::vec2(0, 0));
}