Technical Devblog 34 – Placement Test Function

Hi Floatlands fans, our lead programmer Vili will present a solution he worked on the previous week – placement test function. It checks if a certain object is colliding with the other objects in the world. This blog post will be a bit more technical, so just a heads up before you start reading.

PLACEMENT TEST FUNCTION

VILI VOLČINI

I’ve created a function that checks if 3D mesh object is colliding with the world – other 3D meshes and primitives. The hardest part here is to check if your 3D mesh is inside another 3D mesh and their walls/triangles are not colliding, because Unitys Physics.OverlapBox doesn’t return other 3D meshes. The reason is that 3D meshes are not usually topologically closed.

placement test function example specimen floatlands
This is my test 3D mesh. It has 1700 vertices and 580 triangles.

The function is called ‘CanPlaceMesh’ and returns true or false and looks like this:

I did an approximative calculation, because we don’t need 100% accuracy, but 90% or so suffices. The more important thing is that the function is fast. As you can see, my test mesh has 1700 vertices and that’s a lot of triangles. So I just took a small amount of triangle centers. The reason I choose triangle centers is because they have better distribution than just edges.

So out of 1700 points I get to check only around 1700/(8*3) = 70 points. Still quite too much, but remember, if I find that any point is colliding with the world, the algorithm stops and returns false – meaning it can’t place. So we check averagely 70/2 = 35 points.

placement test function triangle points floatlands
Triangle center points

If you look closely, points are located in triangle centers. Let me first show you this .gif and then explain the red and green points (and blue splitting plane):

placement test function splitting plane animation floatlands
Splitting plane animation

Explanation is simple: we dip 3D mesh into the ground, so we really need to ignore the bottom points of 3D mesh or else it will collide with ground. This is exactly what this plane is meant for and why it’s called ignorePointsPlane. Now you may wonder what I do with these points? Before I start testing if points collide with the world, I need to do a query for nearby colliders:

You may have noticed ‘Vector3.up * 10f’ – this extends query box up so it hits mesh colliders. If our mesh testCollider is inside another mesh collider, normal query box (testCollider.bounds) won’t detect it.

placement test function inside mesh floatlands

This is why I extend it upwards so that query box looks like this:

placement test function query box floatlands

And you see it hits a big island mesh. Now that I have collected all ‘nearby’ colliders, I can test if points are inside them or not. I made special functions for concave mesh colliders and convex+primitive colliders. Those functions work only on closed meshes so this is why we use only closed 3D colliders.

THE END RESULT:

dungeons placement test function finished lowpoly floatlands
Finished product acts like this

Join us on Discord


No Comments

Leave a Reply

Timelapse #7: RoboDog modeling and rigging

Floatlands Wikigamepedia lowpoly floatlands

Floatlands, lowpoly, survival

Floatlands, lowpoly, survival