internal void CalibrateFullBodyTrackingManual(SpawnedAvatar spawnedAvatar) { _logger.Info("Running manual full body tracking calibration"); CalibrationData.FullBodyCalibration fullBodyCalibration = _calibrationData.GetAvatarManualCalibration(spawnedAvatar.avatar.fileName); if (TryGetUncalibratedPoseForAvatar(DeviceUse.Waist, spawnedAvatar, out Pose waist)) { Vector3 positionOffset = Quaternion.Inverse(waist.rotation) * (spawnedAvatar.pelvis.position - waist.position); Quaternion rotationOffset = Quaternion.Inverse(waist.rotation) * spawnedAvatar.pelvis.rotation; fullBodyCalibration.waist = new Pose(positionOffset, rotationOffset); _logger.Info("Set waist pose correction " + fullBodyCalibration.waist); } if (TryGetUncalibratedPoseForAvatar(DeviceUse.LeftFoot, spawnedAvatar, out Pose leftFoot)) { Vector3 positionOffset = Quaternion.Inverse(leftFoot.rotation) * (spawnedAvatar.leftLeg.position - leftFoot.position); Quaternion rotationOffset = Quaternion.Inverse(leftFoot.rotation) * spawnedAvatar.leftLeg.rotation; fullBodyCalibration.leftFoot = new Pose(positionOffset, rotationOffset); _logger.Info("Set left foot pose correction " + fullBodyCalibration.leftFoot); } if (TryGetUncalibratedPoseForAvatar(DeviceUse.RightFoot, spawnedAvatar, out Pose rightFoot)) { Vector3 positionOffset = Quaternion.Inverse(rightFoot.rotation) * (spawnedAvatar.rightLeg.position - rightFoot.position); Quaternion rotationOffset = Quaternion.Inverse(rightFoot.rotation) * spawnedAvatar.rightLeg.rotation; fullBodyCalibration.rightFoot = new Pose(positionOffset, rotationOffset); _logger.Info("Set right foot pose correction " + fullBodyCalibration.rightFoot); } inputChanged?.Invoke(); }
private void UpdateUI(LoadedAvatar avatar) { DisableCalibrationMode(false); if (avatar == null) { _clearButton.interactable = false; _calibrateButton.interactable = false; _automaticCalibrationSetting.checkbox.interactable = false; _automaticCalibrationHoverHint.text = "No avatar selected"; return; } _currentAvatarSettings = _settings.GetAvatarSettings(avatar.fileName); _currentAvatarManualCalibration = _calibrationData.GetAvatarManualCalibration(avatar.fileName); UpdateCalibrationButtons(avatar); _ignoreExclusionsSetting.CheckboxValue = _currentAvatarSettings.ignoreExclusions; _bypassCalibration.CheckboxValue = _currentAvatarSettings.bypassCalibration; _bypassCalibration.checkbox.interactable = avatar.supportsFullBodyTracking; _bypassCalibrationHoverHint.text = avatar.supportsFullBodyTracking ? "Disable the need for calibration before full body tracking is applied." : "Not supported by current avatar"; _automaticCalibrationSetting.CheckboxValue = _currentAvatarSettings.useAutomaticCalibration; _automaticCalibrationSetting.checkbox.interactable = avatar.descriptor.supportsAutomaticCalibration; _automaticCalibrationHoverHint.text = avatar.descriptor.supportsAutomaticCalibration ? "Use automatic calibration instead of manual calibration." : "Not supported by current avatar"; }
public void UpdateUI(SpawnedAvatar avatar) { if (_currentAvatarSettings != null) { _currentAvatarSettings.useAutomaticCalibration.changed -= OnUseAutomaticCalibrationChanged; } UpdateCalibrationButtons(avatar); if (!avatar) { _clearButton.interactable = false; _calibrateButton.interactable = false; _automaticCalibrationSetting.interactable = false; _automaticCalibrationHoverHint.text = "No avatar selected"; return; } _currentAvatarSettings = _settings.GetAvatarSettings(avatar.prefab.fileName); _currentAvatarManualCalibration = _calibrationData.GetAvatarManualCalibration(avatar.prefab.fileName); _currentAvatarSettings.useAutomaticCalibration.changed += OnUseAutomaticCalibrationChanged; _ignoreExclusionsSetting.Value = _currentAvatarSettings.ignoreExclusions; _bypassCalibration.Value = _currentAvatarSettings.bypassCalibration; _automaticCalibrationSetting.Value = _currentAvatarSettings.useAutomaticCalibration; _automaticCalibrationSetting.interactable = avatar.prefab.descriptor.supportsAutomaticCalibration; _automaticCalibrationHoverHint.text = avatar.prefab.descriptor.supportsAutomaticCalibration ? "Use automatic calibration instead of manual calibration." : "Not supported by current avatar"; }
private void UpdateUI(LoadedAvatar avatar) { SetInteractableRecursively(avatar != null); UpdateCalibrationButtons(avatar); if (avatar == null) { _clearButton.interactable = false; _calibrateButton.interactable = false; _automaticCalibrationSetting.interactable = false; _automaticCalibrationHoverHint.text = "No avatar selected"; return; } _currentAvatarSettings = _settings.GetAvatarSettings(avatar.fileName); _currentAvatarManualCalibration = _calibrationData.GetAvatarManualCalibration(avatar.fileName); _ignoreExclusionsSetting.Value = _currentAvatarSettings.ignoreExclusions; _bypassCalibration.Value = _currentAvatarSettings.bypassCalibration; _automaticCalibrationSetting.Value = _currentAvatarSettings.useAutomaticCalibration; _automaticCalibrationSetting.interactable = avatar.descriptor.supportsAutomaticCalibration; _automaticCalibrationHoverHint.text = avatar.descriptor.supportsAutomaticCalibration ? "Use automatic calibration instead of manual calibration." : "Not supported by current avatar"; }
public void CalibrateFullBodyTrackingManual(SpawnedAvatar spawnedAvatar) { CalibrationData.FullBodyCalibration fullBodyCalibration = _calibrationData.GetAvatarManualCalibration(spawnedAvatar.avatar.fileName); if (_trackedDeviceManager.waist.tracked) { TrackedDeviceState pelvis = _trackedDeviceManager.waist; Vector3 positionOffset = Quaternion.Inverse(spawnedAvatar.pelvis.rotation) * (spawnedAvatar.pelvis.position - ApplyTrackedPointFloorOffset(spawnedAvatar, pelvis.position)); Quaternion rotationOffset = Quaternion.Inverse(pelvis.rotation) * spawnedAvatar.pelvis.rotation; fullBodyCalibration.waist = new Pose(positionOffset, rotationOffset); _logger.Info("Set waist pose correction " + fullBodyCalibration.waist); } if (_trackedDeviceManager.leftFoot.tracked) { TrackedDeviceState leftFoot = _trackedDeviceManager.leftFoot; Vector3 positionOffset = Quaternion.Inverse(spawnedAvatar.leftLeg.rotation) * (spawnedAvatar.leftLeg.position - ApplyTrackedPointFloorOffset(spawnedAvatar, leftFoot.position)); Quaternion rotationOffset = Quaternion.Inverse(leftFoot.rotation) * spawnedAvatar.leftLeg.rotation; fullBodyCalibration.leftFoot = new Pose(positionOffset, rotationOffset); _logger.Info("Set left foot pose correction " + fullBodyCalibration.leftFoot); } if (_trackedDeviceManager.rightFoot.tracked) { TrackedDeviceState rightFoot = _trackedDeviceManager.rightFoot; Vector3 positionOffset = Quaternion.Inverse(spawnedAvatar.rightLeg.rotation) * (spawnedAvatar.rightLeg.position - ApplyTrackedPointFloorOffset(spawnedAvatar, rightFoot.position)); Quaternion rotationOffset = Quaternion.Inverse(rightFoot.rotation) * spawnedAvatar.rightLeg.rotation; fullBodyCalibration.rightFoot = new Pose(positionOffset, rotationOffset); _logger.Info("Set right foot pose correction " + fullBodyCalibration.rightFoot); } }
internal VRPlayerInput(TrackedDeviceManager trackedDeviceManager, LoadedAvatar avatar, Settings settings, CalibrationData calibrationData) { _deviceManager = trackedDeviceManager; _settings = settings; _avatarSettings = settings.GetAvatarSettings(avatar.fileName); _calibrationData = calibrationData; _manualCalibration = calibrationData.GetAvatarManualCalibration(avatar.fileName); _deviceManager.deviceAdded += OnDevicesUpdated; _deviceManager.deviceRemoved += OnDevicesUpdated; _deviceManager.deviceTrackingAcquired += OnDevicesUpdated; _deviceManager.deviceTrackingLost += OnDevicesUpdated; _leftHandAnimAction = new SkeletalInput("/actions/customavatars/in/lefthandanim"); _rightHandAnimAction = new SkeletalInput("/actions/customavatars/in/righthandanim"); }