Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML, Box2d] Piłka przelatuje przez statyczną krawędź (b2EdgeShape)

Ostatnio zmodyfikowano 2014-01-29 20:54
Autor Wiadomość
DejaVu
» 2014-01-24 17:18:08
@kubawal - ja wyznaję zasadę: "długi kod, to zły kod". Skoro musisz przebijać się przez 200 linii kodu, aby zrealizować prostą kolizję dwóch obiektów (co jest punktem wyjściowym dla biblioteki Box2D) to znaczy, że:
1. albo przykład jest fatalny, bo taka operacja powinna być prosta;
2) albo biblioteka jest źle zaprojektowana.

Skoro da się napisać przykład, który ma 30 linijek kodu, który zaprezentuje działanie najprostszego scenariusza użycia biblioteki, to takie przykłady powinny się właśnie znajdować na początku manuala. Tymczasem we wspomnianym manualu masz opisane poszczególne elementy i jeden wielki program demonstrujący działanie różnych elementów fizyki.
P-103051
kubawal
Temat założony przez niniejszego użytkownika
» 2014-01-24 18:16:16
Mam pewien pomysł. Czy Box2d podczas przyłączania fixtur'y do ciała alokuje kopię kształtu? Czy topSh nie powinno być w pamięci wolnej?
C/C++
b2EdgeShape topSh;
//...
top->objB2->CreateFixture( & topSh, 1.0f ); // ?

P-103078
pekfos
» 2014-01-24 18:20:56
Box2D does not keep a reference to the shape. It clones the data into a new b2Shape object. 
Manual ;)
P-103080
kubawal
Temat założony przez niniejszego użytkownika
» 2014-01-24 18:25:57
No to już nie wiem, co może być nie tak...
Sprawdziłem pozycje podczas aktualizacji obiektów, i pasują...

Objs updated ->
name: top edge
size: 500 2
pos: 100 100(SF), 350 101(B2)
edge 2 vertex (local): 500 0
center (local): 250 1
name: left edge
size: 2 400
pos: 100 100(SF), 101 300(B2)
edge 2 vertex (local): 2 400
center (local): 1 200
name: right edge
size: 2 400
pos: 600 100(SF), 601 300(B2)
edge 2 vertex (local): 2 400
center (local): 1 200
name: ground
size: 800 2
pos: 0 750(SF), 400 751(B2)
edge 2 vertex (local): 800 0
center (local): 400 1
name: ball
size: 19.8904 20
pos: 200 1.078(SF), 209.945 11
edge 2 vertex (local): 0 0
center (local): 9.94522 10
Objs updated ->
name: top edge
size: 500 2
pos: 100 100(SF), 350 101(B2)
edge 2 vertex (local): 500 0
center (local): 250 1
name: left edge
size: 2 400
pos: 100 100(SF), 101 300(B2)
edge 2 vertex (local): 2 400
center (local): 1 200
name: right edge
size: 2 400
pos: 600 100(SF), 601 300(B2)
edge 2 vertex (local): 2 400
center (local): 1 200
name: ground
size: 800 2
pos: 0 750(SF), 400 751(B2)
edge 2 vertex (local): 800 0
center (local): 400 1
name: ball
size: 19.8904 20
pos: 200 1.2936(SF), 209.945 1
edge 2 vertex (local): 0 0
center (local): 9.94522 10
P-103081
maly
» 2014-01-24 19:07:44
Zaraz spróbuję jeszcze zrobić debugowe wyświetlanie pozycji
b2Draw
P-103098
DejaVu
» 2014-01-24 23:19:05
No właśnie... ta cała integracja rysowania Box2D z biblioteką SFML jest niestety toporna... więc jeżeli wyliczenia w konsoli się zgadzają to po prostu masz problemy z renderowaniem obiektów na właściwych pozycjach :)
P-103119
kubawal
Temat założony przez niniejszego użytkownika
» 2014-01-25 12:52:50
b2Draw
Twierdzisz, żeby spróbować rozszerzyć b2DebugDraw jako silnik SFML?
Można spróbować...

masz problemy z renderowaniem obiektów na właściwych pozycjach :)
Tylko, że pozycje na ekranie zgadzają się z pozycjami wypisanymi w konsoli...
P-103141
kubawal
Temat założony przez niniejszego użytkownika
» 2014-01-26 11:46:29
Spróbowałem zrobić ten debug draw, i wszystko jest nie na swoich miejscach :) Chociaż piłka też przelatuje przez krawędź, która przypadkiem znalazła się jej na drodze :/

Oto kod:
C/C++
class SFMLEngine
    : public b2Draw
{
    RenderWindow & win;
public:
    SFMLEngine( RenderWindow & w );
   
    /// Draw a closed polygon provided in CCW order.
    virtual void DrawPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color );
   
    /// Draw a solid closed polygon provided in CCW order.
    virtual void DrawSolidPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color );
   
    /// Draw a circle.
    virtual void DrawCircle( const b2Vec2 & center, float32 radius, const b2Color & color );
   
    /// Draw a solid circle.
    virtual void DrawSolidCircle( const b2Vec2 & center, float32 radius, const b2Vec2 & axis, const b2Color & color );
   
    /// Draw a line segment.
    virtual void DrawSegment( const b2Vec2 & p1, const b2Vec2 & p2, const b2Color & color );
   
    /// Draw a transform. Choose your own length scale.
    /// @param xf a transform.
    virtual void DrawTransform( const b2Transform & xf ) { } // tego mi się nie chciało robić, poza tym nie wiem jak rysowanie takiego czegoś miałoby wyglądać...
};
SFMLEngine::SFMLEngine( RenderWindow & w )
    : win( w )
{
}

void SFMLEngine::DrawPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color )
{
    ConvexShape c( vertexCount );
   
    for( int i = 0; i < vertexCount; i++ )
    {
        c.setPoint( i, B2toSF( vertices[ i ] ) );
    }
   
    c.setOutlineColor( Color::White );
    c.setFillColor( Color::Transparent );
    win.draw( c );
}

void SFMLEngine::DrawSolidPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color )
{
    ConvexShape c( vertexCount );
   
    for( int i = 0; i < vertexCount; i++ )
    {
        c.setPoint( i, B2toSF( vertices[ i ] ) );
    }
   
    c.setOutlineColor( Color::White );
    c.setFillColor( Color::Red );
    win.draw( c );
}

void SFMLEngine::DrawCircle( const b2Vec2 & center, float32 radius, const b2Color & color )
{
    Vector2f pos = B2toSF( b2Vec2( center.x - radius, center.y - radius ) );
    CircleShape c( B2toSF( radius ) );
    c.setOutlineColor( Color::White );
    c.setFillColor( Color::Transparent );
    win.draw( c );
}

void SFMLEngine::DrawSolidCircle( const b2Vec2 & center, float32 radius, const b2Vec2 & axis, const b2Color & color )
{
    Vector2f pos = B2toSF( b2Vec2( center.x - radius, center.y - radius ) );
    CircleShape c( B2toSF( radius ) );
    c.setPosition( pos );
    c.setOutlineColor( Color::White );
    c.setFillColor( Color::Red );
    win.draw( c );
}

void SFMLEngine::DrawSegment( const b2Vec2 & p1, const b2Vec2 & p2, const b2Color & color )
{
    VertexArray v( sf::Lines, 2 );
    v[ 0 ].position = B2toSF( p1 );
    v[ 0 ].color = Color::White;
    v[ 1 ].position = B2toSF( p2 );
    v[ 1 ].color = Color::White;
   
    win.draw( v );
}

I tak wygląda wyświetlanie z użyciem kodu z pierwszego postu:

Jak widać, wszystko jest na dobrych miejscach.

A tak mój świat widzi Bod2d:

Jak widać, albo źle zaimplementowałem SFMLEngine (mało prawdopodobne, ale nie jestem pewien co do DrawCircle() i DrawSolidCircle()), albo źle tworzę obiekty Box2d (bardziej prawdopodobne). Zauważcie, że tutaj piłka też przelatuje przez krawędź(może jednak w DrawSolidCircle() jest jakiś błąd?)
P-103222
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona