I am currently writing a Minecraft clone in Unity as my pet project, and I'm trying to implement raycasts for it, so that I can know which block the player looks at (I will use raycasts for other purposes too). The world of the game is a 3D grid of perfect unit cubes. Each element of a grid is either solid or not. I want to be able to shoot a ray from any point of my world and get the point where that ray hits the surface of a first solid block in it's way.
Here's a c# pseudocode of what my game aproximately looks like:
// An aproximation of what Unity's Vector3 looks like.
public struct Vector3
{
public float x, y, z;
}
public class World
{
public bool[,,] blocks;
public bool IsSolid(Vector3 pos) // i.e. if pos is inside a solid block
{
return blocks[Math.Floor(pos.x), Math.Floor(pos.y), Math.Floor(pos.z)]
}
public Vector3 Raycast(Vector3 origin, Vector3 direction)
{
// some algorithm, that returns the point at which ray hits a solid block
}
}
Note, that coordintaes of any Vector3
may not be whole nubers, it is entirely possible for rays to start (or end) at fractional coordinates. For simplicity you may (or may not) assume that world is infinite and a ray will always hit some block eventually. Remeber, that Raycast()
should return the point at which the ray hits the surface of a cube.
What is the best algorithm I can use for this? My priorities (in order) are:
- Speed - making a raycast should be fast
- Elegance - the algorithm should reasonably straightforward and concise
- Generality - the algorithm should be easy to modify (i.e. add some extra functionality to it.)
Here's a Q/A for some possible questions:
Q: Why not use Unity's native colliders and raycasts?
A: Unity's colliders and raycast are too slow and aren't optimized for my needs, furthermore, that is by no means elegant of generic.
Q: Do you want an implementation of an algorithm or just the basic concept?
A: I'm fine with just understanding the basis of an aglorithm, but I would really apreciate an implementaion (preferably in C#).