标签: collision-detection

加速球体之间的碰撞检测

我正在编写一个物理引擎/模拟器,它结合了3D太空飞行,行星/恒星引力,船舶推力和相对论效应.到目前为止,它的进展非常顺利,但是,我需要帮助的一件事是碰撞检测算法的数学计算.

我正在使用的运动的迭代模拟基本如下:

(注意:3D矢量是全部大写.)

For each obj

    obj.ACC = Sum(all acceleration influences)

    obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2     (*EQ.2*)

    obj.VEL = obj.VEL + (obj.ACC * dT)

Next
Run Code Online (Sandbox Code Playgroud)

哪里:

obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object

obj.Radius is the radius (scalar) of the object

dT is the time delta or increment
Run Code Online (Sandbox Code Playgroud)

我基本上需要做的是找到一个有效的公式,从上面的(EQ.2)派生出两个对象(obj1,obj2),并告诉他们是否碰撞,如果碰到,在什么时候.我需要确切的时间,以便我可以确定它是否在这个特定的时间增量(因为加速器在不同的时间增量会有所不同),并且还可以找到确切的位置(我知道该怎么做,给定时间)

对于这个引擎,我将所有对象建模为球体,所有这些公式/ algortithim需要做的是弄清楚在哪些点:

(obj1.POS - …
Run Code Online (Sandbox Code Playgroud)

simulation math 3d physics collision-detection

7
推荐指数
1
解决办法
3879
查看次数

XNA C#2D平台游戏

我正试图在XNA中制作(弄清楚如何......)2d平台游戏.

我知道如何创建一个平铺网格以及如何执行碰撞检测.我在播放器的9个边界拼贴上执行碰撞检测,但我想知道是否有更好的方法来执行碰撞检测.

我读过Braid不使用瓷砖而是拼凑图像或其他东西,你如何对它们进行碰撞检测?并且比使用瓷砖更好吗?

c# xna tiles collision-detection

7
推荐指数
1
解决办法
1万
查看次数

Python和Pygame:球与圆的内部碰撞

我正在制作一个游戏,其中球一个更大的圆圈内部反弹.较大的圆圈不会移动.

这是我目前用于这些冲突的代码:

def collideCircle(circle, ball):
    """Check for collision between a ball and a circle"""
    dx = circle.x - ball.x
    dy = circle.y - ball.y

    distance = math.hypot(dx, dy)

    if distance >= circle.size + ball.size:
        # We don't need to change anything about the circle, just the ball
        tangent = math.atan2(dy, dx)
        ball.angle = 2 * tangent - ball.angle
        ball.speed *= elasticity + 0.251

        angle = 0.5 * math.pi + tangent
        ball.x -= math.sin(angle)
        ball.y += math.cos(angle) …
Run Code Online (Sandbox Code Playgroud)

python pygame physics collision-detection

7
推荐指数
2
解决办法
7924
查看次数

圆圈之间的2d碰撞响应

我正在尝试计算2个碰撞球的新速度,但在解决另一个问题之前不能真正做到这一点.

由于在数字世界中几乎从未发生真正的碰撞,我们总是会遇到"碰撞"球重叠的情况.

想象一下,有100个球随机移动,所以,如果我理解正确的话,程序应该如下:

  • 移动球(x += vx; y+= vy)
  • 得到最重要的(或完全碰撞的)球
  • 将球"及时"移回到那一刻
  • 执行碰撞计算

如果以上是正确的,那么,我怎么能"及时"将球移动到第一次碰撞点?已知数据:

  • 球的所有坐标(b[i].x,b[i].y)
  • XY速度(b[i].vx,b[i].vy)
  • lest重叠球之间的距离(dist)

我应该只计算dist与碰撞的完美距离的百分之几,然后简单地向后移动xy坐标相同的百分比vxvy?

math physics collision-detection

7
推荐指数
1
解决办法
5474
查看次数

2d球没有正确碰撞

我只是想编写一个漂亮的物理游戏.

球碰撞看起来不错,但如果球碰撞得太慢,它们会互相"粘".我不知道他们为什么这么做.

这是我的碰撞功能:

private void checkForCollision(ArrayList<Ball> balls) {
    for (int i = 0; i < balls.size(); i++) {
        Ball ball = balls.get(i);
        if (ball != this && ball.intersects(this)) {
            this.collide(ball, false);
        }
    }
}

public boolean intersects(Ball b) {
    double dx = Math.abs(b.posX - posX);
    double dy = Math.abs(b.posY - posY);
    double d = Math.sqrt(dx * dx + dy * dy);
    return d <= (radius + b.radius);
}

private void collide(Ball ball, boolean b) {
    double m1 = this.radius;
    double …
Run Code Online (Sandbox Code Playgroud)

java 2d collision-detection

7
推荐指数
2
解决办法
1161
查看次数

Sprite Kit低性能,在一个位置具有多个节点

我已经设置了一个包含200个精灵节点的场景,并将它们随机放置在屏幕上,如下所示:

for(int i = 0; i < bubbleCount; i++) {
    CGSize size = [self getRandomSize];
    SKSpriteNode *bubble = [SKSpriteNode spriteNodeWithTexture:texture size:size];
    bubble.anchorPoint = CGPointMake(0.5, 0.5);
    bubble.position = [self getRandomPosition];
    bubble.name = BUBBLE;

    SKPhysicsBody *physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:size.width/2];
    physicsBody.dynamic = YES;
    physicsBody.affectedByGravity = NO;
    physicsBody.allowsRotation = NO;
    physicsBody.categoryBitMask =  0;
    physicsBody.contactTestBitMask = 0;
    physicsBody.collisionBitMask = 0;

    bubble.physicsBody = physicsBody;

    [self addChild:bubble];
}
Run Code Online (Sandbox Code Playgroud)

只要节点彼此保持距离,我就可以稳定60 fps.当我施加力使节点开始向场景中心移动并相互重叠时,性能会急剧下降到2-3 fps.我猜这与碰撞检测有关,而不是渲染(如果我用更大的半径初始化物理体,开始时性能非常低).我已将类别,接触和碰撞掩码设置为0,但它没有帮助.

collision-detection ios sprite-kit

7
推荐指数
1
解决办法
2098
查看次数

Swift/SpriteKit多重碰撞检测?

在此输入图像描述

你好.

我有一个多重碰撞问题.有一颗子弹击中敌人(红色矩形).然后,它得分.有一个螺旋(红色圆圈),当敌人(红色矩形)接触时,它会触发场景结束.

在这种情况下,当敌人击中螺旋,它工作,场景结束,我们进入菜单屏幕.但是,当子弹击中敌人时,同样的事情发生了,我不知道为什么.

现在,这是我的代码:

struct PhysicsCategory {
    static let None : UInt32 = 0
    static let All : UInt32 = UInt32.max
    static let enemyOne : UInt32 = 0b1
    static let enemyTwo : UInt32 = 0b1
    static let bullet : UInt32 = 0b10
    static let spiral : UInt32 = 0b111
}

 spiral.physicsBody = SKPhysicsBody(rectangleOfSize: spiral.size)
        spiral.physicsBody?.categoryBitMask = PhysicsCategory.spiral
        spiral.physicsBody?.contactTestBitMask = PhysicsCategory.enemyOne
        spiral.physicsBody?.collisionBitMask = PhysicsCategory.None
...
        enemyOne.physicsBody = SKPhysicsBody(rectangleOfSize: enemyOne.size)
        enemyOne.physicsBody?.dynamic = true
        enemyOne.physicsBody?.categoryBitMask = PhysicsCategory.enemyOne
        enemyOne.physicsBody?.contactTestBitMask = PhysicsCategory.bullet | PhysicsCategory.spiral
        enemyOne.physicsBody?.collisionBitMask …
Run Code Online (Sandbox Code Playgroud)

collision-detection collision ios sprite-kit swift

7
推荐指数
1
解决办法
7645
查看次数

碰撞后正确附加到GameObject?

如何在碰撞后正确地将GameObject附加(或"粘贴")到另一个GameObject?问题:我希望GameObject在碰撞后附加,即使它正在改变比例.

"附上碰撞"代码:

protected Transform stuckTo = null;
protected Vector3 offset = Vector3.zero;

public void LateUpdate()
{
    if (stuckTo != null)
        transform.position = stuckTo.position - offset;
}  

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;

    if(stuckTo == null 
       || stuckTo != col.gameObject.transform)
        offset = col.gameObject.transform.position - transform.position;

    stuckTo = col.gameObject.transform;
}
Run Code Online (Sandbox Code Playgroud)

此代码使GameObject在碰撞后完美连接.但是当GameObject改变比例(当它附着时)时,它在视觉上不再看起来与它碰撞的任何东西相关联.基本上,这段代码使GameObject在碰撞时仅保留原始比例.如何使GameObject始终坚持与碰撞的任何东西?它在过程中的规模是多少?我想避免养育子女:"虽然有点不安全,但是养育对手会造成奇怪的结果,比如随机传送或物体开始疯狂地移动和旋转等等." - SamedTarıkÇETİN:评论.

缩放脚本:

public Transform object1; //this is the object that my future-scaling GameObject collided with.
public Transform object2; //another object, the same …
Run Code Online (Sandbox Code Playgroud)

c# collision-detection collision unity-game-engine unity5

7
推荐指数
1
解决办法
998
查看次数

SCNPhysicsBody调用联系委托但不会高速冲突?

我在SceneKit中制作了一个测试"断路器"游戏,并试图加快速度.在某一点上,球会一直穿过我的界限.不太清楚为什么,我放慢到1 FPS并拍下这个截图:

截图

在查看Apple的文档时:

一个小小的身体可能移动得如此之快,以至于它完全穿过另一个物理身体而没有动画帧,两者相互接触.

然而,很明显球正在接触边界,但仍然通过.联系代表也将注册冲突.这是x速度和z速度各50-100.这种情况不应该导致球反弹,因为球在球触及障碍物的情况下渲染?除此之外,我如何在SceneKit中检查超快速碰撞?我听说在SpriteKit中可以使用usesPreciseCollisionDetection,但在SceneKit中似乎并非如此.

为了准确了解边界的样子,它们是两个圆柱体,两者之间没有空隙.

在此输入图像描述 编辑:似乎将边界上的物理形状更改为凸面或凹面而不是边界框有帮助,但不能完全阻止联系人注册,但不会发生碰撞.如果我创建一个新的障碍,它也会相同 - 它会以足够高的速度通过,同时仍然注册联系代表.任何理论为什么?

编辑2:从这个问题的评论,这里是didBegin通过设置断点调用where的截图.你可以看到球刚刚离开障碍物.当x-velocity或z-velocity设置为大约29-40(dropbox.com/s/rbxh4rg0qhpgxmy/Breaker.zip?dl=0链接到下载项目)时,它开始通过,并且它是否通过是完全不可靠的或之后.始终虽然didBegin是所谓的,但并非总是如此didEnd 在此输入图像描述

collision-detection scenekit swift

7
推荐指数
0
解决办法
272
查看次数

Improve movement of space aliens

在此输入图像描述

I code a mini Android game scenario inspired by Space Invaders and Moon Patrol. It is possible to shoot an alien horizontally (see above).

It is also possible to shoot an alien vertically (see below).

在此输入图像描述

But adding aliens doesn't "scale", it will be very difficult to add for instance 15 aliens moving with respect to all possible collisions. The original space invaders and moon patrol solved this, is it possible to develop a different strategy than the one I …

java android collision-detection sprite game-physics

7
推荐指数
1
解决办法
250
查看次数