Как я могу имитировать лучи рук на HoloLens 1? - PullRequest
0 голосов
/ 18 июня 2019

Я устанавливаю новый проект, который предназначен для развертывания в обоих HoloLens 1 и 2, и я хотел бы использовать ручные лучи в обоих или, по крайней мере, иметь возможность имитировать их в HoloLens 1 при подготовке к HoloLens 2 .

Насколько я знаю, это:

  1. Настройка InputSimulationService только на жест (так что я могу проверить в редакторе)
  2. Добавление типа контроллера GGVH к параметрам DefaultControllerPointer в разделе MRTK / Pointers.

Это позволяет ему отображаться и реагировать на щелчки как в редакторе, так и на устройстве, но он не использует координаты руки, а вместо этого передает радиопередачи вперед от 0,0,0, что говорит о том, что ручной контроллер GGV предоставляет GripPosition ( конечно, без вращения из-за HL1), но без предоставления Pointer Pose.

Я полагаю, что самый простой способ сделать это - добавить позу указателя в контроллер GGV Hand или добавить (предполагаемое) вращение в GripPosition и использовать его в качестве действия позы в ShellHandRayPointer. Я не могу сразу увидеть, где настроить / вставить это в MRTK.

В качестве альтернативы, я мог бы настроить префаб DefaultControllerPointer, но я не решаюсь это сделать, поскольку в MRTK, похоже, все еще происходят частые изменения, и это может привести к головной боли при обновлении.

1 Ответ

0 голосов
/ 19 июня 2019

Вы можете создать собственный указатель, который будет определять вращение указателя на основе положения руки, а затем, как вы предложили, использовать Grip Pose вместо Pointer Pose для действия позы.

Код вашего пользовательского указателя будет выглядеть примерно так:

// Note you could extend ShellHandRayPointer if you wanted the beam bending, 
// however configuring that pointer requires careful setup of asset.
public class HL1HandRay : LinePointer
{
    public override Quaternion Rotation  
    {
        get
        {
            // Set rotation to be line from head to head, rotated a bit
            float sign = Controller.ControllerHandedness == Handedness.Right ? -1f : 1f;
            return Quaternion.Euler(0, sign * 35, 0) * Quaternion.LookRotation(Position - CameraCache.Main.transform.position, Vector3.up);
        }
    }

    // We cannot use the base IsInteractionEnabled
    // Because  HL1 hands are always set to have their "IsInPointing pose" field as false
    // You may want to do more thorough checks here, following BaseControllerPointer implementation
    public override bool IsInteractionEnabled => IsFocusLocked || IsTracked;
}

Затем создайте новый префаб указателя и настройте свой профиль указателя, чтобы использовать новый префаб указателя. Создание собственного префаба вместо изменения префабов MRTK имеет преимущество, заключающееся в том, что обновления MRTK не будут перезаписывать ваши префабы.

enter image description here

Вот некоторые снимки готового простого указателя, который я сделал, чтобы проверить это с выделенными соответствующими изменениями:

enter image description here

А затем компоненты, которые я использовал:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...