Oolong Posted August 28, 2023 Share Posted August 28, 2023 Здравствуйте! Я работаю над VR-проектом, и у меня стоит задача реализовать перемещение по обычной ступенчатой лестнице наклонённой под углом в 45 градусов с помощью джойстика на контроллере, настройки которого определены в компоненте ViveGeneralInput.cs. Как можно было бы сделать это оптимальным на Ваш взгляд способом? Я сначала полагал, что это реализуется привязкой к камере vr_player физического тела, но если координаты физического тела будут зависеть от координат камеры, то вертикальное перемещение не будет работать. Может быть существуют какие-то лаконичные пути решения задачи. Link to comment
bmyagkov Posted August 30, 2023 Share Posted August 30, 2023 Добрый день! Quote Может быть существуют какие-то лаконичные пути решения задачи. К сожалению, готового решения для такого случая нет, поэтому для того чтобы ответ был полезным, вы бы не могли более подробно описать, как вы себе представляете подъем по лестнице в VR, что происходит с игроком когда он заходит на лестницу? Возможно, вы уже попробовали что-то написать самостоятельно? Как вы планируете осуществлять перемещение игрока? Обычно перемещение реализуется с помощью "телепортации", где используется контроллер для направления луча в точку, куда необходимо переместить игрока, а что планируете использовать вы? Спасибо! Link to comment
Oolong Posted October 16, 2023 Author Share Posted October 16, 2023 Спасибо большое за Ваш ответ! 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
mifril Posted October 18, 2023 Share Posted October 18, 2023 Здравствуйте, если Вас интересует только описанный случай то его можно довольно просто реализовать уже встроенными функциями в 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); } } Такой вариант должен покрывать требования предложеного Вами случая 1 Link to comment
Oolong Posted October 19, 2023 Author Share Posted October 19, 2023 Большое спасибо! Сделал всё по указаниям, получил желаемый результат. Больше вопросов нет. 1 Link to comment
bmyagkov Posted October 19, 2023 Share Posted October 19, 2023 23 minutes ago, Oolong said: Большое спасибо! Сделал всё по указаниям, получил желаемый результат. Больше вопросов нет. Пожалуйста! Link to comment
Recommended Posts