Jump to content

[SOLVED] Реализация движения по лестнице в VR-проекте


Recommended Posts

Здравствуйте!

Я работаю над VR-проектом, и у меня стоит задача реализовать перемещение по обычной ступенчатой лестнице наклонённой под углом в 45 градусов с помощью джойстика на контроллере, настройки которого определены в компоненте ViveGeneralInput.cs. Как можно было бы сделать это оптимальным на Ваш взгляд способом? Я сначала полагал, что это реализуется привязкой к камере vr_player физического тела, но если координаты физического тела будут зависеть от координат камеры, то вертикальное перемещение не будет работать. Может быть существуют какие-то лаконичные пути решения задачи. 

Link to comment

Добрый день!

Quote

Может быть существуют какие-то лаконичные пути решения задачи. 

К сожалению, готового решения для такого случая нет, поэтому для того чтобы ответ был полезным, вы бы не могли более подробно описать, как вы себе представляете подъем по лестнице в VR, что происходит с игроком когда он заходит на лестницу? Возможно, вы уже попробовали что-то написать самостоятельно?

Как вы планируете осуществлять перемещение игрока? Обычно перемещение реализуется с помощью "телепортации", где используется контроллер для направления луча в точку, куда необходимо переместить игрока, а что планируете использовать вы?

Спасибо!

Link to comment
  • 1 month later...

Спасибо большое за Ваш ответ! 

On 8/30/2023 at 10:02 AM, bmyagkov said:

как вы себе представляете подъем по лестнице в VR

Я представляю реализацию подъёма по лестнице путём равномерного перемещения без рывков объекта vr_player типа PlayerDummy в плоскости, параллельной плоскости угла подъёма лестницы. 

On 8/30/2023 at 10:02 AM, bmyagkov said:

Как вы планируете осуществлять перемещение игрока?

Перемещение будет осуществляться с помощью Vive манипулятора путём взаимодействия с круглой сенсорной панелью, которую я предварительно настроил в компоненте ViveGeneralInput.cs

On 8/30/2023 at 10:02 AM, bmyagkov said:

Возможно, вы уже попробовали что-то написать самостоятельно?

Сам пока что не реализовывал возможные решения, но есть вариант, при котором за NodeDummy "hmd_controller" будет закреплена компонента, которая будет отвечать за постоянный расчёт длины вектора от hmd_controller до поверхности пола, по которой перемещается vr_player. И если эта длина начнёт сокращаться (попал на лестницу), то скрипт поднимает vr_player по оси Z, пока длина снова не будет равна 1.7м (для примера).

Но проблема в том что для этого, скорее всего, понадобится расчёт вектора в каждой итерации метода UpdatePhysics(), что создаст нагрузку на оперативную память. Как вы думаете, какие пути решения это проблемы существуют? Будет ли ощутимой в данном случае нагрузка на память от такого постоянного просчёта длины + проверки на условие?

 

Link to comment

Здравствуйте, если Вас интересует только описанный случай то его можно довольно просто реализовать уже встроенными функциями в VRPlayer.cs и WalkMovement.cs, небольшими изменениями:
 

В VRPlayer.cs будем использовать метод LandTo, который должен выглядеть следующим образом, то есть нужно изменить только вычисление headOffset

public void LandTo(Vec3 position, bool isGroundPoint = false)
{
	if (HeadController == null)
		return;

	Vec3 headOffset = new Vec3(0, 0, currentPlayerHeight);

	if (!isGroundPoint)
	{
		// put player to the ground
		Vec3 pos2 = position + new Vec3(0, 0, -1) * (node as Player).ZFar;
		Unigine.Object hitObj = World.GetIntersection(position, pos2, 1, intersection);
		if (hitObj != null)
			node.WorldPosition = intersection.Point + new Vec3(headOffset);
	}
	else
		node.WorldPosition = position + new Vec3(headOffset);

	onTransformChanged?.Invoke();
}

В WalkMovement.cs будем использовать метод Move, который должен выглядеть следующим образом, то есть нужно сменить установку новой позиции для ноды напрямую на установление новой позиции через метод LandTo

public override void Move(VRPlayer player, float ifps)
{
	if (player == null || player.RightController == null)
		return;

	if (!VRInput.IsDeviceConnected(VRInput.VRDevice.RIGHT_CONTROLLER) || !VRInput.IsTransformValid(VRInput.VRDevice.RIGHT_CONTROLLER))
		return;

	Vec3 dir = Vec3.ZERO;
	dir.x = -VRInput.GetGeneralAxis(VRInput.GeneralAxes.MAIN_HORIZONTAL);
	dir.y = -VRInput.GetGeneralAxis(VRInput.GeneralAxes.MAIN_VERTICAL);

	if (dir.Length > DeadZone)
	{
		player.LandTo(player.WorldPosition + dir * Speed * ifps);
	}
}

Такой вариант должен покрывать требования предложеного Вами случая

  • Like 1
Link to comment

Большое спасибо! Сделал всё по указаниям, получил желаемый результат. Больше вопросов нет.

  • Like 1
Link to comment
  • bmyagkov changed the title to [SOLVED] Реализация движения по лестнице в VR-проекте
23 minutes ago, Oolong said:

Большое спасибо! Сделал всё по указаниям, получил желаемый результат. Больше вопросов нет.

Пожалуйста!

Link to comment
×
×
  • Create New...