Page 1 of 1
Going too far from the center of the world
Posted: Wed Aug 10, 2022 4:58 am
by Ats
Hello
In Omeganaut, the player ship was staying at 0 on the z axis, and everything was moving towards him: enemies, buildings, planets... This was a weird choice inherited from the very first demo I made so many years ago.
A few days ago, I started inverting all that. Now, the player and the camera flies on the z axis. This is handy for avoiding updating the physics of non-moving objects on each and every frame.
But now I have a few questions:
Big boy engines such as Unity and Unreal gets weird when the objects are too far from the center of the world: physics, animations, lights... So I was wondering if this could be an issue in ZGE?
And if it is the case, at which distance could things start to break?
And how could I retrieve each and every object currently alive to teleport them to the center of the world, let's say, at the end of each stage:
Is there a function for that? Or should I store everything manually in an array?
Thanks
Re: Going too far from the center of the world
Posted: Wed Aug 10, 2022 10:33 am
by Kjell
Hi Ats,
Ats wrote: ↑Wed Aug 10, 2022 4:58 amBig boy engines such as Unity and Unreal gets weird when the objects are too far from the center of the world: physics, animations, lights... So I was wondering if this could be an issue in ZGE?
Same thing in ZGE ( since it also uses 32-bit floating point values for most things ).
Ats wrote: ↑Wed Aug 10, 2022 4:58 amAnd if it is the case, at which distance could things start to break?
Depends on what you consider "to break". The loss of precision increases gradually as your values grow bigger. Here's a table with some numbers:
For more information you can read
this article.
Ats wrote: ↑Wed Aug 10, 2022 4:58 amAnd how could I retrieve each and every object currently alive to teleport them to the center of the world, let's say, at the end of each stage:
I guess the least intrusive way would be to just use the "getModels()" function and iterate through all category numbers you're using in your project.
K
Re: Going too far from the center of the world
Posted: Wed Aug 10, 2022 1:59 pm
by Ats
Thanks, that article was very helpful.
I totally forgot about getModels. I'll have to clean those category numbers before using it
(Just a little reminder for me, why the categories are important:
http://www.emix8.org/forum/viewtopic.ph ... ory#p10239)
Re: Going too far from the center of the world
Posted: Thu Aug 11, 2022 8:44 am
by Ats
Fun fact:
I inverted the whole thing to avoid using
zbtSetPosRot(CurrentModel.Obstacle_Body, CurrentModel.Position, CurrentModel.Rotation); in OnUpdate for all the non-moving objects. But it turned out that I still have to use it, otherwise colliding bodies would just get out of the ground if the object are planted into it. And since I don't move objects based on their colliding bodies, I had a hard time discovering why I was hitting invisible walls above some specific objects
But the game runs even smoother now, so it was worth it!
Re: Going too far from the center of the world
Posted: Thu Aug 11, 2022 9:00 am
by Kjell
Hmm,
Ats wrote: ↑Thu Aug 11, 2022 8:44 amBut it turned out that I still have to use it, otherwise colliding bodies would just get out of the ground if the object are planted into it.
Can't you adjust the colliders so you don't have objects that sit on / in the ground don't penetrate the floor collider? That would save you the physics solver calculations for those objects. Or otherwise use a separate collision group for the floor and don't have it interact with the colliders that penetrate it .. seems a bit silly to push colliders back into the floor because the physics engine is pushing them out every frame.
K
Re: Going too far from the center of the world
Posted: Thu Aug 11, 2022 1:53 pm
by Ats
Then there must be something I don't get with those bitmasks, because COL_OBSTACLE keeps colliding with itself...
For starters, is 00100000 = 0x20 or 0x32???
(Both doesn't work)
Code: Select all
// Collision groups
int COL_PLAYER = 0x1; // 00000001
int COL_LASERPLAYER = 0x2; // 00000010 Doesn't collide with Player and EnemyLaser
int COL_OBJECT = 0x4; // 00000100 Moving Object
int COL_ENEMY = 0x8; // 00001000 Same as COL_OBJECT but doesn't trigger Visor
int COL_LASERENEMY = 0x10; // 0x10 0x16 ? // 00010000
int COL_OBSTACLE = 0x20; // 0x20 x32 ? // 00100000 Ground and non moving objects, can go beneath ground
// Collision masks = things the group is supposed to collide with
int MASK_PLAYER = COL_OBJECT | COL_ENEMY | COL_LASERENEMY | COL_OBSTACLE;
int MASK_LASERPLAYER = COL_OBJECT | COL_ENEMY | COL_OBSTACLE;
int MASK_LASERENEMY = COL_OBJECT | COL_PLAYER | COL_ENEMY | COL_OBSTACLE;
int MASK_OBJECT = COL_PLAYER | COL_LASERPLAYER | COL_OBJECT | COL_ENEMY | COL_LASERENEMY | COL_OBSTACLE;
int MASK_ENEMY = COL_PLAYER | COL_LASERPLAYER | COL_OBJECT | COL_ENEMY | COL_LASERENEMY | COL_OBSTACLE;
int MASK_OBSTACLE = COL_PLAYER | COL_LASERPLAYER | COL_OBJECT | COL_ENEMY | COL_LASERENEMY;
Re: Going too far from the center of the world
Posted: Thu Aug 11, 2022 3:25 pm
by Kjell
Hi Ats,
Ats wrote: ↑Thu Aug 11, 2022 1:53 pmFor starters, is 00100000 = 0x20 or 0x32???
A binary value of 00100000 is 20 in hexadecimal and 32 in decimal, so 0x20 is correct. If you're having trouble with hexadecimal and binary i'd recommend keeping a calculator that has a programmer mode handy ( like the default one in Windows ).
Ats wrote: ↑Thu Aug 11, 2022 1:53 pmThen there must be something I don't get with those bitmasks, because COL_OBSTACLE keeps colliding with itself.
Why is COL_OBSTACLE 0x64? That looks like a mistake ( check out the binary value )
K
Re: Going too far from the center of the world
Posted: Thu Aug 11, 2022 3:56 pm
by Ats
Thanks.
Sorry, the 0x64 was a mistype. It's definitely 0x20. But it doesn't work either. The ground, which is an obstacle is still picking the objects out of it.
I remember I already had problems with 0x20 bitmask not working as expected. I'll make a strip down example when I'll get back home.
Re: Going too far from the center of the world
Posted: Fri Aug 12, 2022 2:34 pm
by Ats
After a lot of tests, the groups and masks are working, but not in my game. That might be coming from the order of creation / position / physics. I'll have to dig that when I'll have some time.