Jump to content

Collisions always detected on Trigger


SpiderPig
 Share

Go to solution Solved by Josh,

Recommended Posts

Run this code and use the arrows keys to move the player and move to intercept the box on the left.   There's a few bugs here:

  • After the first collision - "Collison Detected" is still printed to the console even after you move away from the box
  • position, normal & speed are never above zero

I've only noticed these issues when using COLLISION_TRIGGER as the collision type.  So far normal collisions seem fine.

#include "UltraEngine.h"

using namespace UltraEngine;

class MyComponent : public Component {
private:
public:
    virtual void Collide(shared_ptr<Entity> collidedentity, const Vec3& position, const Vec3& normal, const float speed) {
        Print(WString((float)Millisecs() / 1000.0f) + " : Collision Detected : " + WString(position) + " : " + WString(normal) + " : " + WString(speed));
    }
};

int main(int argc, const char* argv[])
{
    //Get the displays
    auto displays = GetDisplays();

    //Create a window
    auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

    //Create a framebuffer
    auto framebuffer = CreateFramebuffer(window);

    //Create a world
    auto world = CreateWorld();

    //Create a camera    
    auto camera = CreateCamera(world);
    camera->SetClearColor(0.125);
    camera->SetPosition(0, 2, -6);
    camera->SetDebugPhysicsMode(true);

    //Create light
    auto light = CreateDirectionalLight(world);
    light->SetRotation(35, 35, 0);
    light->SetColor(3);

    auto trigger = CreateBox(world, 4);
    trigger->SetPosition(-4, 3, 0);
    trigger->SetCollisionType(COLLISION_TRIGGER);
    trigger->AddComponent<MyComponent>();

    auto floor = CreateBox(world, 100.0f, 0.1f, 100.0f);

    auto box = CreateCylinder(world, 0.5f, 1.8f);
    box->SetCollisionType(COLLISION_PLAYER);
    box->SetMass(1.0f);
    box->SetPosition(0, 0.05, 0);
    box->SetCollider(CreateCapsuleCollider(0.5f, 1.8f));

    auto joint = CreateKinematicJoint(Vec3(), box);
    joint->SetMaxForce(1000);
    joint->SetMaxTorque(1000);
    
    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        auto pos = box->GetPosition(true);
        auto speed = 0.25f;

        if (window->KeyDown(KEY_UP)) { pos.z += speed; }
        if (window->KeyDown(KEY_DOWN)) { pos.z -= speed; }
        if (window->KeyDown(KEY_LEFT)) { pos.x -= speed; }
        if (window->KeyDown(KEY_RIGHT)) { pos.x += speed; }

        joint->SetPose(pos, Vec3());

        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}

 

  • Thanks 1
Link to comment
Share on other sites

  • 3 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...