Jump to content

Как найти высоту поверхности?


photo

Recommended Posts

Всем привет!

Уважаемые разработчики, подскажите пожалуйста! Я размещаю на поверхности какие-либо объекты (грибы, растения, вещи инвентаря и т.д.) Координаты X и Y тут все просто. Но как найти высоту поверхности под/над размещаемом объекте? Подскажите, есть ли метод позволяющий, к примеру, по известным глобальным координатам X и Y определить из карты высот, нужную мне, что бы spawn-предмет не проваливался или не парил под/над поверхностью? Или есть другой способ?

Спасибо!

Link to comment

Обычно для этого вручную бросают пустышку, которая и служит точкой спавна чего-то.

Link to comment
20 hours ago, dmitrij.shevchenko said:

Обычно для этого вручную бросают пустышку, которая и служит точкой спавна чего-то.

Да, можно, накидал пустышек по всему миру и спавни по их координатам что угодно... Это выход из ситуации в какой-то мере. Только много ручной работы, и нет рандомности при спавне. А вдруг есть метод который всё это упращает?) Помню в Unity делал игру, там это реализовывал. Летом можно было рассаживать ягоду, осенью грибы в местах о которых не знал сам. И росли они при каждом новом заходе в игру в разных местах, в лесу, в определенной области. Как то так.  

Link to comment
7 hours ago, Yurickon said:

Да, можно, накидал пустышек по всему миру и спавни по их координатам что угодно... Это выход из ситуации в какой-то мере. Только много ручной работы, и нет рандомности при спавне. А вдруг есть метод который всё это упращает?) Помню в Unity делал игру, там это реализовывал. Летом можно было рассаживать ягоду, осенью грибы в местах о которых не знал сам. И росли они при каждом новом заходе в игру в разных местах, в лесу, в определенной области. Как то так.  

Для этого у Clutter'a есть параметр Seed, можно дергать через Set Seed и получать псевдослучайный результат, остальное Clutter посчитает сам в пределах области. С полностью случайным спавном есть проблема - никому не нужно чтобы грибы вдруг появились в стволе дерева, или в камне, или трава выросла там где лежит камень.

Link to comment

Добрый день!

Для нахождения координат точки поверхность над/под объектом, Вы можете воспользоваться методом getIntersection() следующим образом:

	float z_shift = 100;
	// начальная точка линии, по которой ищем пересечение
	vec3 p0 = node.Position;
	// конечная точка линии, по которой ищем пересечение
	vec3 p1 = p0 + new vec3(0.0, 0.0, -z_shift);

	Unigine.Object obj = World.GetIntersection(p0, p1, intersectionMask, intersection);

	// проверка на то, что пересечение было найдено
	if (obj)
	{
		vec3 point = intersection.Point; // точка пересечения с поверхностью
		node.Position = point; // смещаем ноду в точку пересечения
	}

где intersectionMask - маска поверхности, на которую Вы хотите опустить свою ноду (не совпадающая с маской самой ноды, чтобы не находить пересечение с ней же); z_shift - максимальное расстояние по оси Z, на котором ищем пересечение с поверхностью.

В зависимости от значения z_shift Вы можете искать пересечения, как над нодой, так и под ней.

В этой статье приведена более подробная информация о getIntersection().

 

Для того, чтобы переместить ноду на ближайшую поверхность при работе в редакторе, можете воспользоваться кнопкой Drop To Ground:

snaptoground.png

Link to comment
×
×
  • Create New...