help me with grid based movement in 3d

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By azulfato
:warning: Old Version Published before Godot 3 was released.

I have a grid-map node and I want the player to move grid-based, think about Ultima and old 3d dungeon crawler games’ movement.
In 2d we have world_to_map function for tilemap but there is no similar func for 3d grid-map.
heres a img so ye can understand it better.
left key pressed

what i need is a way to get the world position ( vector3) of the tile that the player is on and the adjacent tiles.
Or a better way of doing this kind of movement.

I can share my project files if needed.

:bust_in_silhouette: Reply From: Zylann

Weird, TileMap provides them but not its 3D counterpart, apparently.

Anyway, you can get the conversion between world and grid-space with these formulas (a bit simplified), assuming your world node is centered at (0,0,0) with a scale of (1,1,1):

func world_to_grid(pos):
	var v = pos / tile_size
	return Vector3(floor(v.x), floor(v.y), floor(v.z))


func grid_to_world(pos):
	var v = pos * tile_size
	# This second calculation is to center the position on the tile
	return v + tile_size/2.0

If your game is fully grid-based, you can create your own grid_position variable in your objects using a script for your game logic, and convert to world coordinates when you want to change the position of the node. So to advance 1 cell forward, you would do grid_position.z += 1, then spatial.set_translation(grid_to_world(grid_position)) to update the node.

And, if your game is with full grid logic, you can create all the game in a matrix with the logic working over it and reconstruct a GridMap for the visual part based on that matrix (the old way) and just use the map-to-world for movement simulations/animations

eons | 2017-01-12 13:29