bevy_xpbd icon indicating copy to clipboard operation
bevy_xpbd copied to clipboard

Clockwise triangle collider doesn't work

Open JonasAAA opened this issue 1 year ago • 2 comments
trafficstars

Versions

bevy 0.13.2 bevy_xpbd_2d 0.4.2

Description

It seems that the collider of a clockwise ordered Triangle2D doesn't register collisions with other polygons, such as triangles, rectangles, etc.

Example

Below code spawns a triangle with vertices in the clockwise direction and a square. The two shapes are overlapping at spawn, so that should be printed, and shapes should be moved to be disjoint. Neither of these happen.

However, if I swap the triangle vertices so that they are ordered anticlockwise, everything works as expected - I get a message about entities overlapping at spawn, and the shapes are flung out of view very quickly.

use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
use bevy_xpbd_2d::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(PhysicsPlugins::default())
        .insert_resource(Gravity(Vec2::ZERO))
        .add_systems(Startup, (setup_camera, spawn_objects))
        .run();
}

fn setup_camera(mut commands: Commands) {
    commands.spawn(Camera2dBundle::default());
}

fn spawn_objects(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<ColorMaterial>>,
) {
    let shape = Triangle2d::new(
        Vec2::new(0.0, -100.0),
        Vec2::new(0.0, 100.0),
        Vec2::new(200.0, 0.0),
    );

    commands.spawn((
        MaterialMesh2dBundle {
            mesh: meshes.add(shape).into(),
            material: materials.add(Color::BLUE),
            transform: Transform::from_translation(Vec3::new(-75.0, 0.0, 0.0)),
            ..default()
        },
        RigidBody::Dynamic,
        shape.collider(),
    ));

    let shape = Rectangle::new(100.0, 100.0);
    commands.spawn((
        MaterialMesh2dBundle {
            mesh: meshes.add(shape).into(),
            material: materials.add(Color::YELLOW),
            transform: Transform::from_translation(Vec3::new(50.0, 0.0, 0.0)),
            ..default()
        },
        RigidBody::Dynamic,
        shape.collider(),
    ));
}

JonasAAA avatar Jun 12 '24 15:06 JonasAAA