public Vector3 TransformDirection(Vector3 directionInCharacterCoordinates) { Vector3 characterForward = Vector3.forward; switch (characterPivotType) { case CharacterPivotType.KinectHead: if (skeletonManager != null && skeletonManager.skeletons[kinectPlayerId] != null) { characterForward = skeletonManager.skeletons[kinectPlayerId].head.rotation * Vector3.forward; } else { characterForward = Vector3.forward; } break; case CharacterPivotType.KinectTorso: if (skeletonManager != null && skeletonManager.skeletons[kinectPlayerId] != null) { characterForward = skeletonManager.skeletons[kinectPlayerId].torso.rotation * Vector3.forward; } else { characterForward = Vector3.forward; } break; case CharacterPivotType.MoveController: { RUISPSMoveWand psmove = inputManager.GetMoveWand(moveControllerId); if (psmove != null) { characterForward = psmove.localRotation * Vector3.forward; } } break; } if (ignorePitchAndRoll) { characterForward.y = 0; characterForward.Normalize(); } characterForward = transform.TransformDirection(characterForward); return(Quaternion.LookRotation(characterForward, transform.up) * directionInCharacterCoordinates); }
public Vector3 TransformDirection(Vector3 directionInCharacterCoordinates) { Vector3 characterForward = Vector3.forward; if (skeletonController) { characterForward = skeletonController.transform.localRotation * Vector3.forward; } switch (characterPivotType) { case CharacterPivotType.KinectHead: if ((bodyTrackingDeviceID == RUISSkeletonManager.kinect2SensorID && !inputManager.enableKinect2) || (bodyTrackingDeviceID == RUISSkeletonManager.kinect1SensorID && !inputManager.enableKinect)) { break; } if (skeletonManager != null && skeletonManager.skeletons[bodyTrackingDeviceID, kinectPlayerId] != null) { characterForward = skeletonManager.skeletons[bodyTrackingDeviceID, kinectPlayerId].head.rotation * Vector3.forward; } else { characterForward = Vector3.forward; } break; case CharacterPivotType.KinectTorso: if ((bodyTrackingDeviceID == RUISSkeletonManager.kinect2SensorID && !inputManager.enableKinect2) || (bodyTrackingDeviceID == RUISSkeletonManager.kinect1SensorID && !inputManager.enableKinect)) { break; } if (skeletonManager != null && skeletonManager.skeletons[bodyTrackingDeviceID, kinectPlayerId] != null) { characterForward = skeletonManager.skeletons[bodyTrackingDeviceID, kinectPlayerId].torso.rotation * Vector3.forward; } else { characterForward = Vector3.forward; } break; case CharacterPivotType.MoveController: { if (!inputManager.enablePSMove || !headPointsWalkingDirection) { break; } RUISPSMoveWand psmove = inputManager.GetMoveWand(moveControllerId); if (psmove != null) { characterForward = psmove.localRotation * Vector3.forward; } } break; } if (skeletonManager != null && (skeletonController.followOculusController || skeletonController.followMoveController) && headPointsWalkingDirection) { characterForward = skeletonController.trackedDeviceYawRotation * Vector3.forward; } if (ignorePitchAndRoll) { characterForward.y = 0; characterForward.Normalize(); } characterForward = transform.TransformDirection(characterForward); return(Quaternion.LookRotation(characterForward, transform.up) * directionInCharacterCoordinates); }
private void doYawFiltering(float deltaT) { switch (driftingSensor) { case DriftingRotation.OculusRift: if (OVRDevice.IsSensorPresent(oculusID)) { OVRDevice.GetOrientation(oculusID, ref driftingRot); if (oculusCamController) { // In the future OVR SDK oculusCamController will have oculusID? oculusCamController.SetYRotation(-finalYawDifference.eulerAngles.y); } } break; case DriftingRotation.RazerHydra: // TODO //driftingRot = hydraRotation; break; case DriftingRotation.InputTransform: if (driftingTransform) { driftingRot = driftingTransform.rotation; } break; } if (driftingDirectionVisualizer != null) { driftingDirectionVisualizer.transform.rotation = driftingRot; } driftingEuler = driftingRot.eulerAngles; switch (compass) { case CompassSource.Kinect: if (!skeletonManager || !skeletonManager.skeletons[kinectPlayerID].isTracking) { break; } else { compassData = skeletonManager.GetJointData(compassJoint, kinectPlayerID); // First check for high confidence value if (compassData != null && compassData.rotationConfidence >= 1.0f) { updateDifferenceKalman(compassData.rotation.eulerAngles, driftingEuler, deltaT); } } break; case CompassSource.PSMove: if (inputManager) { compassMove = inputManager.GetMoveWand(PSMoveID); if (compassMove) { updateDifferenceKalman(compassMove.localRotation.eulerAngles, driftingEuler, deltaT); } } break; case CompassSource.InputTransform: if (compassTransform != null) { updateDifferenceKalman(compassTransform.rotation.eulerAngles, driftingEuler, deltaT); } break; } float normalizedT = Mathf.Clamp01(deltaT * driftCorrectionRate); if (normalizedT != 0) { finalYawDifference = Quaternion.Lerp(finalYawDifference, filteredYawDifference, normalizedT); } if (correctedDirectionVisualizer != null) { correctedDirectionVisualizer.transform.rotation = Quaternion.Euler( new Vector3(driftingEuler.x, (360 + driftingEuler.y - finalYawDifference.eulerAngles.y) % 360, driftingEuler.z)); } //driftingRotation*Quaternion.Inverse(finalDifference); if (correctedDirectionVisualizer != null && driftVisualizerPosition != null) { correctedDirectionVisualizer.transform.position = driftVisualizerPosition.position; } }
void LateUpdate() { if (skeletonManager != null && skeletonManager.skeletons[playerId] != null && skeletonManager.skeletons[playerId].isTracking) { UpdateSkeletonPosition(); UpdateTransform(ref head, skeletonManager.skeletons[playerId].head); UpdateTransform(ref torso, skeletonManager.skeletons[playerId].torso); UpdateTransform(ref leftShoulder, skeletonManager.skeletons[playerId].leftShoulder); UpdateTransform(ref leftElbow, skeletonManager.skeletons[playerId].leftElbow); UpdateTransform(ref leftHand, skeletonManager.skeletons[playerId].leftHand); UpdateTransform(ref rightShoulder, skeletonManager.skeletons[playerId].rightShoulder); UpdateTransform(ref rightElbow, skeletonManager.skeletons[playerId].rightElbow); UpdateTransform(ref rightHand, skeletonManager.skeletons[playerId].rightHand); UpdateTransform(ref leftHip, skeletonManager.skeletons[playerId].leftHip); UpdateTransform(ref leftKnee, skeletonManager.skeletons[playerId].leftKnee); UpdateTransform(ref leftFoot, skeletonManager.skeletons[playerId].leftFoot); UpdateTransform(ref rightHip, skeletonManager.skeletons[playerId].rightHip); UpdateTransform(ref rightKnee, skeletonManager.skeletons[playerId].rightKnee); UpdateTransform(ref rightFoot, skeletonManager.skeletons[playerId].rightFoot); if (!useHierarchicalModel) { if (leftHand != null) { leftHand.localRotation = leftElbow.localRotation; } if (rightHand != null) { rightHand.localRotation = rightElbow.localRotation; } } else { if (scaleHierarchicalModelBones) { UpdateBoneScalings(); Vector3 torsoDirection = skeletonManager.skeletons[playerId].torso.rotation * Vector3.down; torso.position = transform.TransformPoint(skeletonManager.skeletons[playerId].torso.position - skeletonPosition - torsoDirection * torsoOffset * torsoScale); ForceUpdatePosition(ref rightShoulder, skeletonManager.skeletons[playerId].rightShoulder); ForceUpdatePosition(ref leftShoulder, skeletonManager.skeletons[playerId].leftShoulder); ForceUpdatePosition(ref rightHip, skeletonManager.skeletons[playerId].rightHip); ForceUpdatePosition(ref leftHip, skeletonManager.skeletons[playerId].leftHip); } } if (updateRootPosition) { Vector3 newRootPosition = skeletonManager.skeletons[playerId].root.position; measuredPos[0] = newRootPosition.x; measuredPos[1] = newRootPosition.y; measuredPos[2] = newRootPosition.z; positionKalman.setR(Time.deltaTime * positionNoiseCovariance); positionKalman.predict(); positionKalman.update(measuredPos); pos = positionKalman.getState(); transform.localPosition = new Vector3((float)pos[0], (float)pos[1], (float)pos[2]); //newRootPosition; } } else // TUUKKA if (followMoveController && characterController && inputManager) { psmove = inputManager.GetMoveWand(followMoveID); if (psmove) { Quaternion moveYaw = Quaternion.Euler(0, psmove.localRotation.eulerAngles.y, 0); skeletonPosition = psmove.localPosition - moveYaw * characterController.psmoveOffset; skeletonPosition.y = 0; if (updateRootPosition) { transform.localPosition = skeletonPosition; } UpdateTransformWithPSMove(ref head, moveYaw); UpdateTransformWithPSMove(ref torso, moveYaw); UpdateTransformWithPSMove(ref leftShoulder, moveYaw); UpdateTransformWithPSMove(ref leftElbow, moveYaw); UpdateTransformWithPSMove(ref leftHand, moveYaw); UpdateTransformWithPSMove(ref rightShoulder, moveYaw); UpdateTransformWithPSMove(ref rightElbow, moveYaw); UpdateTransformWithPSMove(ref rightHand, moveYaw); UpdateTransformWithPSMove(ref leftHip, moveYaw); UpdateTransformWithPSMove(ref leftKnee, moveYaw); UpdateTransformWithPSMove(ref leftFoot, moveYaw); UpdateTransformWithPSMove(ref rightHip, moveYaw); UpdateTransformWithPSMove(ref rightKnee, moveYaw); UpdateTransformWithPSMove(ref rightFoot, moveYaw); } } TweakNeckHeight(); }