Jump to content

Intersection


photo

Recommended Posts

Функция Game.getIntersection() ищет пересечения в области указанного цилиндра, если я все правильно понял.

Можно сделать, чтобы этот "цилиндр" был видимым? В UE4 подобные лучи можно видеть для отладки.

Link to comment

Здравствуйте, 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));
}

Надеюсь, мой ответ вам помог.

Спасибо!

  • Like 2
Link to comment
×
×
  • Create New...