Мир игры представляет собой трехмерный массив вокселей (кубов).
Каждый воксел может быть пустым или занятым.
Мне нужно направить луч из любой точки мира и выяснить, где он впервые попадет на поверхность занятого воксела.
Код: Выделить всё
public struct Vector3 {
public float x, y, z;
}
public struct Vector3Int {
public int x, y, z;
}
public enum Voxel {
Empty,
Occupied,
}
public struct RaycastResult {
public bool success; // whether any block was hit by raycast
public Vector3 point; // point where ray hits the surface of first solid voxel
public Vector3Int block; // what block was hit by raycast
}
public class World {
public Voxel[,,] voxels;
public Voxel GetVoxel(Vector3Int position) {
return voxels[position.x, position.y, position.z]
}
public RaycastResult Raycast(Vector3 origin, Vector3 direction) {
// What to do here?
}
}
Есть ли (эффективный) способ сделать это в Unity без написания собственного рейкастера? Обратите внимание, что размер мира может быть очень большим.
Если нет хорошего встроенного решения, существует ли общий алгоритм?
Подробнее здесь: https://stackoverflow.com/questions/742 ... -cube-grid