コード例 #1
0
    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);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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;
        }
    }
コード例 #4
0
    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();
    }