LWJGL - Как эффективно и результативно трассировать луч?

У меня есть начало координат и вектор направления, но я понятия не имею, как следить за лучом и проверять наличие столкновений...

Вот изображение луча, он выходит примерно на 6 блоков.

Vector3f cam = camera.getPosition();
Vector3f dir = getDirection();

dir.x *= 40;
dir.y *= 40;
dir.z *= 40;

Vector3f dest = new Vector3f(cam.x + dir.x, cam.y + dir.y, cam.z + dir.z);


public Vector3f getDirection()
{
    Vector3f vector = new Vector3f();

    float rotX = camera.yaw;
    float rotY = camera.pitch;

    vector.y = (float) -Math.sin(Math.toRadians(rotY));

    float h = (float) Math.cos(Math.toRadians(rotY));

    vector.x = (float) (h * Math.sin(Math.toRadians(rotX)));
    vector.z = (float) (-h * Math.cos(Math.toRadians(rotX)));

    return vector;
}

I have tried using gluUnProject and it worked a little bit but like when you picked a face of a block it wasn't very precise.

Кстати: я использую списки отображения для фрагментов и просто визуализирую квадраты блоков внутри этого списка отображения. У меня 60 фпс. Я искал и искал, но я не могу найти НИЧЕГО по трассировке лучей или выбору лучей ... Спасибо!


person Chiller    schedule 11.11.2012    source источник
comment
ИМХО, существует огромное количество математики, связанной с рейкастингом/трассировкой. Зависит от сцены, от типов объектов, которые вы хотите трассировать (треугольные сетки, геометрические фигуры, ...). Затем вам нужно сделать некоторое пространственное разделение, иначе вы будете сравнивать луч и объект для всех объектов в сцене, а это всегда очень медленно. Таким образом, вы должны использовать дерево BSP или дерево K-d для определения сцены.   -  person Sorceror    schedule 12.11.2012
comment
Вы можете найти полезную информацию о том, как реализовать выбор лучей в LWJGL, по адресу gamedev.stackexchange. .com/questions/31070/ray-picking-problems и stackoverflow.com/questions/10809021/lwjgl -3D-подбор   -  person Sorceror    schedule 12.11.2012
comment
Если вы хотите определить, попадает ли луч в куб, вам нужно понимать, что вы тестируете столкновения для 6 плоскостей. Я бы начал с просмотра кода пересечения плоскостей.   -  person seesharper    schedule 28.11.2012
comment
@Sorceror: для начала вам не нужны сложные структуры данных; вначале достаточно списка, состоящего всего из нескольких десятков объектов (и он может даже превосходить очень маленькие BSP-деревья и другие структуры ускорения)   -  person Sebastian Mach    schedule 22.01.2013
comment
@phresnel, конечно, зависит от размера сцены, но определение пересечения с каким-либо объектом на основе сетки довольно дорого (все треугольники без какого-либо теста AABB или чего-то еще), поэтому в конечном итоге вы все равно получите какое-то решение для разделения пространства.   -  person Sorceror    schedule 23.01.2013
comment
@Sorcerer: Действительно, за исключением случаев, когда вы просто развлекаетесь с некоторыми геометрическими объектами (например, классными сферами). Просто хотел немного отвлечься от комментария Необходима пугающая математика; потому что, как новичок, вам действительно не нужно много математики (и структур данных).   -  person Sebastian Mach    schedule 23.01.2013


Ответы (1)


Ваш вопрос очень неточен.
Поскольку ваша сцена выглядит как сетка, я предлагаю вам заглянуть в «3D Digital Differential Analyzer»:
http://www.cse.chalmers.se/edu/курс/_MY_MISSING_COURSE_2012/_courses_2011/TDA361_Computer_Graphics/grid.pdf
и:
http://en.wikipedia.org/wiki/Digital_Differential_analyzer_%28graphics_algorithm%29

person Tara    schedule 21.02.2013