Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Box2D i jego dziwne zachowanie


Rekomendowane odpowiedzi

Opublikowano

Witam.

 

Zacząłem się dziś bawić troche w Box2D i SFML, dostaję jednak dziwne rezultaty.

 

przy kodzie:

 

 

#include <Box2D/Box2D.h>
#include "SFML/Graphics.hpp"
#include <iostream>
 
int main()
{
 
    b2World world(b2Vec2(0.0f, 0.5f));
 
    b2BodyDef boxDef;
    boxDef.type = b2_dynamicBody;
    boxDef.position.Set(300.0f/50,100.0f/50);
 
    b2Body *boxB = world.CreateBody(&boxDef);
 
    b2PolygonShape boxShape;
    boxShape.SetAsBox(30.0f/2,30.0f/2);
 
    b2FixtureDef boxFixtureDef;
    boxFixtureDef.shape = &boxShape;
 
    boxB->CreateFixture(&boxFixtureDef);
 
 
//////////////////////////--------------------------------------------//////////////////////////
    b2BodyDef groundDef;
    groundDef.type = b2_kinematicBody; // jesli usuniemy to, co jest miedzy tymi kreskami, program dziala jak powinien, ewentualnie zmienimy wartosc na 1250.0f/50 (mniej więcej)
    groundDef.position.Set(0.0f, 500.0f/50);
 
    b2Body *groundB = world.CreateBody(&groundDef);
 
    b2PolygonShape groundShape;
    groundShape.SetAsBox(500.0f/50, 25.0f/50);
 
    groundB->CreateFixture(&groundShape, 1.0f);
//////////////////////////--------------------------------------------//////////////////////////
 
 
    sf::RenderWindow window(sf::VideoMode(800,600), "SFML");
 
    sf::RectangleShape ground;
    ground.setSize(sf::Vector2f(1000,50));
    sf::RectangleShape box;
    box.setSize(sf::Vector2f(30, 30));
    box.setOrigin(15,15);
 
    ground.setFillColor(sf::Color::Red);
    box.setFillColor(sf::Color::Blue);
    ground.setPosition(0, 500);
 
 
 
    float time = 1.0f;
    float steps = 60.0f;
    float timeSteps = time / steps;
 
    int velocityIt = 8, positionIt = 3;
 
    while(window.isOpen())
    {
        sf::Event e;
 
        while(window.pollEvent(e))
        {
            if(e.type == sf::Event::Closed)
            {
                window.close();
            }
        }
 
        b2Vec2 posBox = boxB->GetPosition();
 
        box.setPosition(sf::Vector2f(posBox.x*50, posBox.y*50));
 
        std::cout << posBox.x*50 << "," <<  posBox.y*50 << std::endl;
 
        world.Step(timeSteps, velocityIt, positionIt);
 
        window.clear();
 
 
 
        window.draw(box);
        window.draw(ground);
 
       
 
        window.display();
 
 
 
    }
 
 
}
 

 

 

 

 

ale symulacja nie przebiega poprawnie, chyba że usuniemy ziemię (ground).

Po jej usunięciu obiekt normalnie spada, tak jak powinien, a gdy ziemia jest,

to obiekt leci w górę aż do y=-275.

 

Program miał być taki prosty i krótki, chciałem tylko sprawdzić działanie Boxa wraz z SFML'em.

 

Ma ktoś jakiś pomysł?

 

Pozdrawiam.

1352970251-U713459.png

By Maxiu
"Because limits, like fears, are often just an illusion"

  • 3 tygodnie później...
Opublikowano

A kolega wie co to jest "Grawitacja" ?

Jesli natomiast ustawienie grawitacji funckja "setGravity" z obiektu swiata nie wystarcza/nie dziala to popraw Step.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...