I’m currently evaluating UE4 for a game project, and while there’s a great deal I like the look of, the idea of using float32’s for positions is the biggest problem I see. I’m worried about whether that will make the engine unsuitable. I’ve always used 64 bit integers as fixed point positions for very large worlds; that allows high spacial precision over huge areas (literally lightyears!) with no numeric instability issues, because they are fixed point. One subtracts the WS object position from the WS camera position and creates a float on the fly for sending positions to the graphics API. No origin offseting is needed. I’m dubious about this idea of floats as positions :(.
I don’t need visibility of remote actors beyond about 30 km from a camera position, but I absolutely do need actors to exist and be actively simulated at great distances from any origin point. The maximum distance between actors might be on the order of 500km.
I’m worried about this description from the docs pages:
If ALL actors are given the same origin, then I’m going to have numeric instability issues. Consider two actors A and B which are 500km apart. If the origin is set near A, then B’s positions will be 500km from the origin, if all actors indeed get the same origin. Floats have 23 bits of mantissa, so that’s almost 6 centimeters of positional error per mantissa LSB! Given that some float CPU ops often have several bits of precision loss, I could be looking at several tens of centimeters of positional error. I’m not sure that’s going to work.
In short, I don’t see how level streaming and a position offset system will solve the large world problem for me. I see how it solves the problem of streaming in content if you don’t care about simulating distant actors. But… I hope I’m just missing something. I’ve done a lot of web searching, and read this, but mostly what’s talked about is streaming in lower LODs of static meshes, which isn’t my worry.
Anyone know or have experience about this? If the above is a problem, are there any workarounds, such as running physics in multiple batches with the origin set by hand for each batch? That seems awkward, but is it possible?