Hello,
I have a ‘beam’ that is a scaled StaticModel cylinder and a weapon whose bullet is a StaticModel too.
What material Technique may i use to blend these two together?
grokko
Hello,
I have a ‘beam’ that is a scaled StaticModel cylinder and a weapon whose bullet is a StaticModel too.
What material Technique may i use to blend these two together?
grokko
it isn’t clear what you want to achieve. May I ask you for a simple sketch or reference image?
Hi,
Sorry if my question wasn’t clear…
How can I blend two StaticModels together?
I have a LogicComponent which shoots a queue of StaticModel Nodes into the space. They’re load balanced so they
shoot and perform really well…but sometimes when I launch a flurry of shots in the space, and then turn a couple of degrees and launch more…the bullet Nodes hit each other and explode
on each other,
I’m kinda new to the great Urho so I suppose such a device of blending might be a technique?
Mike
Sounds like you have physics issue. You have to move bullet colliders to a separate layer and disable collisions with the same layer. This way bullets won’t collide with eachother only with non-bullet objects.
You have to move bullet colliders to a separate layer and disable collisions with the same layer.
Hi,
Thanks for helping! You mean like this…?
bd->SetCollisionLayer(1);
bd->SetCollisionEventMode(COLLISION_NEVER);
wherein ‘bd’ is a RigidBody pointer.
I tried a couple combinations, still nothing…
Mike
// for bullets
body->SetCollisionLayer(0x01);
body->SetCollisionMask(0x10);
// for targets
body->SetCollisionLayer(0x10);
body->SetCollisionMask(0x01);
You can use this layer and mask patten to avoid collision btw bullets.
so the layer is also a bitmask?
Yes. It’s super easy to use, too. Here’s a header file for dealing with collision layers that I used in a project recently:
#pragma once
// Collision layers and masks are &'ed together to determine if a collision event should occur.
namespace CollisionLayer
{
static const unsigned int None = 0;
static const unsigned int Controllable = 1 << 0;
static const unsigned int Static = 1 << 1;
static const unsigned int Platform = 1 << 2;
static const unsigned int Projectile = 1 << 3;
static const unsigned int All = -1;
}
namespace CollisionMask
{
static const unsigned int None = CollisionLayer::None;
static const unsigned int Controllable = CollisionLayer::Static | CollisionLayer::Platform | CollisionLayer::Projectile;
static const unsigned int Static = CollisionLayer::Controllable | CollisionLayer::Projectile;
static const unsigned int Platform = CollisionLayer::Controllable | CollisionLayer::Projectile;
static const unsigned int Projectile = CollisionLayer::Controllable | CollisionLayer::Static | CollisionLayer::Platform;
static const unsigned int All = CollisionLayer::All;
}
The CollisionLayer values are passed as the Layer, and the CollisionMask values are passed as the Mask. In a sense, the Layer is what the thing is and the Mask is what the thing collides with. In the above example we say our Controllable types (the player) can collide with Static/Platform/Projectile, and that our Projectile types can collide with Controllable/Static/Platform. Projectiles will not collide with other Projectiles as it is currently configured, but you can easily change that by using
static const unsigned int Projectile = CollisionLayer::Controllable | CollisionLayer::Static | CollisionLayer::Platform | CollisionLayer::Projectile;
To use this, you just set the Layer and Mask of each object to their corresponding values:
auto characterBody = characterNode->CreateComponent<RigidBody>();
characterBody->SetCollisionLayerAndMask(CollisionLayer::Controllable, CollisionMask::Controllable);
auto floorBody = floorNode->CreateComponent<RigidBody>();
floorBody->SetCollisionLayerAndMask(CollisionLayer::Platform, CollisionMask::Platform);
auto missileBody = missileNode->CreateComponent<RigidBody>();
missileBody->SetCollisionLayerAndMask(CollisionLayer::Projectile, CollisionMask::Projectile);
The SetCollisionLayerAndMask()
calls become trivial, and I find the collision logic is easier to configure. It’s also easy to add more Layers and Masks.
I just though that layer is a bit index, not a bitmask itself. Good to know before I spent hours debugging it