当前位置: 首页 > 知识库问答 >
问题:

圆弧的碰撞检测

洪飞扬
2023-03-14

那么,我如何实现圆弧线的冲突检测呢?我必须使用Box 2d碰撞,还是可以使用矩形之类的其他方法?

顺便说一句,我讨厌box2d,因为我不了解其中的大部分内容,所以如果有一个解决方案排除box2d的话,我会非常感激。

黄色的弧线继续在黑色的圆圈上旋转。我如何在这里实现碰撞检测?

请帮忙!谢谢!

共有1个答案

汲利
2023-03-14

要避免使用Box2D,您可以将形状定义为多边形,并使用polygon.contains(x,y)方法或使用Intersector

下面是使用两者的示例:

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Circle;
import com.badlogic.gdx.math.Intersector;
import com.badlogic.gdx.math.Polygon;

public class Test extends ApplicationAdapter implements InputProcessor{
    private ShapeRenderer sr;
    private Polygon polya;

    private boolean isColliding = false;
    private Circle mp;

    @Override
    public void create () {

        //define arc as polygon 
        // the more points used to define the shape will 
        // increase both required computation and collision precision
        polya = new Polygon();

    // create vertices
    float section = 15f;
    float[] newVerts = new float[200];
    for(int i = 0; i < 50; i++){
        newVerts[i*2] = (float)Math.sin(i/section); //x 0 to 98 even
        newVerts[i*2+1] = (float)Math.cos(i/section); //y 1 to 99  odd

        newVerts[199-i*2] = (float)Math.cos(i/section); //x 100 to 108
        newVerts[198-i*2] = (float)Math.sin(i/section) + 0.2f; //y 101 to 199

    }

    polya.setVertices(newVerts);
    polya.scale(50);
    polya.setOrigin(1, 1);
    polya.rotate(60);

        //define circle to act as point for checking intersections
        mp = new Circle(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,4);
        // setup batchers
        sr = new ShapeRenderer();
        sr.setAutoShapeType(true);

        Gdx.input.setInputProcessor(this);

    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // check collision with polygon
        isColliding = polya.contains(mp.x,mp.y);

        //check collision using Intersector
        isColliding = Intersector.isPointInPolygon(polya.getTransformedVertices(),0,polya.getVertices().length,mp.x,mp.y);


        sr.begin();
        sr.setColor(Color.WHITE);
        if(isColliding){
            sr.setColor(Color.RED);
        }
        sr.polygon(polya.getTransformedVertices());
        sr.circle(mp.x,mp.y,mp.radius);
        sr.end();

    }

    @Override
    public void dispose () {
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        int newy = Gdx.graphics.getHeight() - screenY;
        polya.setPosition(screenX, newy);
        return false;
    }


    (... removed unused input processor methods for clarity ...)
}
 类似资料:
  • 如何检查线段与圆弧之间的距离? 圆弧是未填充的,所以只有圆的外缘是计数的一部分。 我想做冲突检测。基本上我有两个圆形物体。一个在直线上移动,另一个在圆弧上移动。物体有碰撞半径。 请注意,这不是精确的碰撞检测,因为我相信没有闭合形式的解决方案来进行以恒定速度移动的时间分析(有迭代解决方案)。 我只需要伪代码。虽然我可以通过将弧转换为两个没有厚度的弧,并在endpoint上转换两个圆,并使用传统算法来

  • 我正在编写一个游戏,涉及碰撞的一个移动的圆,由用户控制,和一个移动的矩形,由计算机控制。 完整的代码可以在这里找到:游戏 我在圆和矩形之间的碰撞检测方面遇到了麻烦。当矩形是静态的,碰撞检测工作完美。当圆和矩形的边缘在任一边接触时,程序就会按照它应该的方式进行操作。 这是碰撞检测功能。 谢谢。

  • 有没有数学方法可以求出两个圆圈碰撞所需要的时间?如果我能得到那个时间值,我就能把圆圈移动到那个时候的位置,然后在那个点上碰撞它们。 编辑:等速

  • 我想创造一个和乒乓球一样的游戏。我创建了一个沿着圆周移动的桨。注意桨是弧形的。我想知道我如何检测球和桨之间的碰撞。为了更好地理解这个:http://gyazo.com/7bac8acdf0faf66005015d496498ca33球将在圆圈内,当与桨碰撞时反射出去。提前感谢!

  • 我正在编写软件,扩展圆-矩形碰撞检测(交集),以包括对碰撞的响应。圆边和圆矩形是相当直接的。但一圈又一圈地把我难住了。 例如,在离散事件模拟中,让两个圆碰撞,一个红一个绿。我们可能会出现以下情况: 在它们碰撞后,我们可以立即: 这里的RIP和GIP是在前一个时钟滴答的圆圈的位置。在当前时钟滴答时,在RDP和GDP处检测到冲突。然而,当两个圆位于RCP和GCP时,碰撞发生在时钟滴答之间。在时钟滴答声

  • 我花了数小时寻找解决方案:我正在用libgdx开发一个自上而下的小游戏(可能这与我使用的引擎有关)。现在我必须在我的角色(圆形)和墙(矩形)之间实现碰撞检测。如果可以滑动,我希望角色在碰撞时沿着墙滑动。让我解释一下: 如果我向上移动45度,我可能会撞到墙的下面、左边或角落。 如果我与左边相撞,我想停止x运动,只向上移动。如果我离开墙壁,那么我想继续向上移动。与下侧相同(停止y运动) 如果我与角落相