Make a billiards game
Make a billiards game
Hello team,
Recently, I have chosen BEPUphysics1 to simulate physics for my billiards game. I have set it up to run but not success in making it realistic. The balls are bouncing unexpectedly and spinning infinitively.
This is my settings:
- Use Entity.ApplyImpulse(spin, force) to strike the cue ball
- Set CollisionResponseSettings.BouncinessVelocityThreshold = 0
- Ball's mass is 0.1, linearDamping is 0.12, angularDamping is 0.45
- Bounciness of ball and bumper is set to 1, table's friction is 1 too
I'm very appreciated if anyone give me some idea about that.
Thanks,
conant
Recently, I have chosen BEPUphysics1 to simulate physics for my billiards game. I have set it up to run but not success in making it realistic. The balls are bouncing unexpectedly and spinning infinitively.
This is my settings:
- Use Entity.ApplyImpulse(spin, force) to strike the cue ball
- Set CollisionResponseSettings.BouncinessVelocityThreshold = 0
- Ball's mass is 0.1, linearDamping is 0.12, angularDamping is 0.45
- Bounciness of ball and bumper is set to 1, table's friction is 1 too
I'm very appreciated if anyone give me some idea about that.
Thanks,
conant
Re: Make a billiards game
BouncinessVelocityThreshold should be nonzero. A threshold that is too low can introduce excessive tiny bounces, especially when the bounces become too small to properly represent for the time step duration (imagine something that would bounce 120 times a second in reality- a time step duration of 1/60f is too long to capture that motion).
With angular damping that high, the ball should not continue spinning very long at all. Either something is resetting the damping, or something is adding momentum to the ball. Hard to say without more information.
With angular damping that high, the ball should not continue spinning very long at all. Either something is resetting the damping, or something is adding momentum to the ball. Hard to say without more information.
Re: Make a billiards game
Thanks for your fast replying.
Actually, I need more bounciness for my balls. Currently, I see the balls move like backward after bouncing against the table cushions. If a ball's velocity is low, it even sticks to the cushions although the ball and cushions bounciness is all set to 1. Can I set the balls up to move naturally?
About spinning, it's a my bad expression. It's not spinning infinitively but exceedingly. Is there any parameter to limit that angular velocity? (like maxAngularVelocity in Unity)
Actually, I need more bounciness for my balls. Currently, I see the balls move like backward after bouncing against the table cushions. If a ball's velocity is low, it even sticks to the cushions although the ball and cushions bounciness is all set to 1. Can I set the balls up to move naturally?
About spinning, it's a my bad expression. It's not spinning infinitively but exceedingly. Is there any parameter to limit that angular velocity? (like maxAngularVelocity in Unity)
Re: Make a billiards game
Not sure I understand the behavior here. Bounciness set to 1 for all involved objects is the highest physically valid value. There might be other things going on- if you can reproduce the behavior in the demos in a stripped down repro, I could provide more information.Actually, I need more bounciness for my balls. Currently, I see the balls move like backward after bouncing against the table cushions. If a ball's velocity is low, it even sticks to the cushions although the ball and cushions bounciness is all set to 1. Can I set the balls up to move naturally?
There is not, but a maximum angular velocity is physically incorrect and so the lack of it should not make the simulation less realistic. Is something incorrectly applying too much angular velocity? For example, earlier you mentioned 'Entity.ApplyImpulse(spin, force)'- the first parameter is the location at which to apply the impulse, and the second parameter is the impulse itself. If the impulse is applied at a very distant location (for example, from an incorrect 'spin' parameter), that would introduce far more angular velocity due to the long lever arm.About spinning, it's a my bad expression. It's not spinning infinitively but exceedingly. Is there any parameter to limit that angular velocity? (like maxAngularVelocity in Unity)
Re: Make a billiards game
You're right! I re-checked and saw the spin is provided with a too high value. So it's fixed by reducing it to a low reasonable value (not over the ball radius). AwesomeThere is not, but a maximum angular velocity is physically incorrect and so the lack of it should not make the simulation less realistic. Is something incorrectly applying too much angular velocity? For example, earlier you mentioned 'Entity.ApplyImpulse(spin, force)'- the first parameter is the location at which to apply the impulse, and the second parameter is the impulse itself. If the impulse is applied at a very distant location (for example, from an incorrect 'spin' parameter), that would introduce far more angular velocity due to the long lever arm.
I attach my physics folder source (can't share all sources with you) and a video demonstrating the problem (can't attach, so I share it here: https://vimeo.com/443317851). Actually, I'm using Unity for the project and is moving to another physics engine (don't use built-in Unity physics engine for some reason)Not sure I understand the behavior here. Bounciness set to 1 for all involved objects is the highest physically valid value. There might be other things going on- if you can reproduce the behavior in the demos in a stripped down repro, I could provide more information.
To make it easier for you to follow, I show my current settings here:
- Create a Sphere for each ball. radius = 0.5, friction = 0, bounciness = 1
- Create a Box for the table floor. width = 12, height = 6.5, length = 0.2, friction = 1, bounciness = 0
- Create a Box for each rail (cushion). width/height is optional, length = 0.1, friction = 0, bounciness = 1
- Attachments
-
- Billiards.zip
- (939.01 KiB) Downloaded 1215 times
Re: Make a billiards game
Looks like it's working as expected given the friction, inertia, and damping. The ball bounces away from the wall, but is still spinning. The ball's angular momentum is turned into linear momentum by friction with the table surface.
You may want to scale down the inertia tensor. There's a InertiaHelper.InertiaTensorScale field which scales all automatically computed inertia tensors; it defaults to 2.5 to help with stability in some more difficult cases. Try setting it to 1 before any entities are created.
The friction may also require some tuning- the higher it is, the more angular momentum will feed back into linear momentum.
You may want to scale down the inertia tensor. There's a InertiaHelper.InertiaTensorScale field which scales all automatically computed inertia tensors; it defaults to 2.5 to help with stability in some more difficult cases. Try setting it to 1 before any entities are created.
The friction may also require some tuning- the higher it is, the more angular momentum will feed back into linear momentum.
Re: Make a billiards game
It works like a charm Thank you for your explanation!
Re: Make a billiards game
Hi Norbo,
I currently have a problem implementing an aiming system for the game. I found the ball is moving not exactly as the direction provided to ApplyImpulse(location, direction * force). What parameters cause this? Can you give me some suggestions?
Thanks,
conant
I currently have a problem implementing an aiming system for the game. I found the ball is moving not exactly as the direction provided to ApplyImpulse(location, direction * force). What parameters cause this? Can you give me some suggestions?
Thanks,
conant
Re: Make a billiards game
If the location is offset from the center of mass, the impulse will introduce spin, and friction with the table will then turn that into linear momentum. Unless the spin was perfectly aligned, it would result in divergence from the direction.
To accurately predict the physics simulation, you could run a snapshot of the simulation forward. It's not guaranteed to be deterministic unless you jump through a bunch of hoops, but it'll be pretty darn close until high chaos events start happening.
To accurately predict the physics simulation, you could run a snapshot of the simulation forward. It's not guaranteed to be deterministic unless you jump through a bunch of hoops, but it'll be pretty darn close until high chaos events start happening.
Re: Make a billiards game
Hi Norbo, I have fixed the above problem by trying a trick: setting the cue ball position to the correct contact point at the frame it reaches to a target ball. This may not seem one correct coding, but it works
Currently, I have another task that is making the physics deterministic across platforms. So I chose this one: https://github.com/sam-vdp/bepuphysics1int. After a lot of trial and error, I finally make it deterministic across 2 devices (one PC, one Android). But there are very strange things that break the deterministic (I don't know why). Suppose I have 2 spaces, it breaks when:
Can you have some guess on this and give me some clue to debug?
Currently, I have another task that is making the physics deterministic across platforms. So I chose this one: https://github.com/sam-vdp/bepuphysics1int. After a lot of trial and error, I finally make it deterministic across 2 devices (one PC, one Android). But there are very strange things that break the deterministic (I don't know why). Suppose I have 2 spaces, it breaks when:
- Change width/height/length of a box (of both spaces) to another value
- Add a box in a space but not another space
Can you have some guess on this and give me some clue to debug?
Re: Make a billiards game
To ensure determinism, all interactions with the engine should be done in exactly the same order. Entity lists being in different orders can be enough to introduce nondeterminism. Assume everything has to be bitwise identical at each step of any process.
This is a result of order-dependent processes, like the solver. Constraint execution order matters, and constraint order can be affected by collision pair generation order, which can be affected by the broad phase topology, which can be affected by entity order, and so on.
This is a result of order-dependent processes, like the solver. Constraint execution order matters, and constraint order can be affected by collision pair generation order, which can be affected by the broad phase topology, which can be affected by entity order, and so on.
Re: Make a billiards game
After checking, it's actually that entity list order matters. The problem is solved. Thank you so much for these quick and exact replies!