Mimilun Posted December 23, 2020 Share Posted December 23, 2020 Функция Game.getIntersection() ищет пересечения в области указанного цилиндра, если я все правильно понял. Можно сделать, чтобы этот "цилиндр" был видимым? В UE4 подобные лучи можно видеть для отладки. Link to comment
fox Posted December 23, 2020 Share Posted December 23, 2020 Здравствуйте, Mimilun! Quote Функция Game.getIntersection() ищет пересечения в области указанного цилиндра, если я все правильно понял. Да, все верно. Пересечения с препятствиями в заданном объеме цилиндра определяются таким образом (буду использовать C#, поскольку вы не уточнили язык): obstacle = Game.GetIntersection(p1, p2, radius, mask, game_intersection_object); здесь: p1 - начальная точка луча p2- конечная точка на луче radius - радиус цилиндра Quote Можно сделать, чтобы этот "цилиндр" был видимым? В UE4 подобные лучи можно видеть для отладки. Конечно можно! Для визуализации разного рода вспомогательных элементов (линий, сфер, параллелепипедов, цилиндров и т.д.) служит класс Visualizer. (в описании класса есть несколько примеров использования, они доступны для разных языков программирования). Допустим, что мы хотим нарисовать сам луч (p1 - p2) и цилиндр, в котором будем искать препятствия с помощью Game Intersection. Для этого нам понадобятся методы Visualizer.RenderSolidCylinder() и Visualizer.RenderVector(): gi = new GameIntersection();// <-- объект GameIntersection для размещения результата vec3 p1 = new vec3(0.0f); // <-- начальная точка vec3 p2 = new vec3(30.0f); // <-- конечная точка float radius = 5.0f; // <-- радиус цилиндра float duration = 10.0f; // <-- длительность отображения вспомогательного элемента (в секундах) // вот так мы ищем пересечения с препятствиями в объеме цилиндра Obstacle obstacle = Game.GetIntersection(p1, p2, radius, 1, gi); // Теперь переходим к отрисовке вспомогательных элементов // надо посчитать высоту цилиндра (она равна расстоянию между начальной и конечной точкой) float height = MathLib.Length(p2-p1); // нам нужна матрица трансформации для цилиндра, // получаем ее, используя функцию SetTo(p1, p2, Up), // которая осуществляет перенос в точку p1 и поворот в направлении точки p2 (вектор Up для нас - ось Z (0,0,1) ) mat4 transform_matrix = MathLib.SetTo(p1, p2, new vec3(0.0f,0.0f,1.0f)); // теперь рисуем наш цилиндр полупрозрачным красным цветом Visualizer.RenderSolidCylinder(radius, height, transform_matrix, new vec4(1.0f, 0.0f, 0.0f, 0.2f), duration); // рисуем луч черным цветом Visualizer.RenderVector(p1, p2, new vec4(0.0f, 0.0f, 0.0f, 1.0f), 0.25f, false, duration); Следует обратить внимание, что методы Visualizer.RenderSolidCylinder(), Visualizer.RenderVector(), которые мы используем, равно как и другие методы Vizualizer.Render*() отрисовывают фигуру в течение заданного времени (duration). Чтобы отображать фигуры постоянно можно либо задать duration = MathLib.INFINITY , либо, пока это необходимо, вызывать соответствующие методы каждый кадр в Update(), не указывая длительность отображения: public override bool Update() { //... // рисуем наш цилиндр полупрозрачным красным цветом Visualizer.RenderSolidCylinder(radius, height, transform_matrix, new vec4(1.0f, 0.0f, 0.0f, 0.2f)); // рисуем луч черным цветом Visualizer.RenderVector(p1, p2, new vec4(0.0f, 0.0f, 0.0f, 1.0f)); } Надеюсь, мой ответ вам помог. Спасибо! 2 Link to comment
Recommended Posts