Exemple #1
0
        public void MoveAgent(
            float ahead           = 0,
            float right           = 0,
            float speed           = 1,
            float?fixedDeltaTime  = null,
            bool returnToStart    = true,
            bool disableRendering = true
            )
        {
            if (ahead == 0 && right == 0)
            {
                throw new ArgumentException("Must specify ahead or right!");
            }
            Vector3 direction           = new Vector3(x: right, y: 0, z: ahead);
            float   fixedDeltaTimeFloat = fixedDeltaTime.GetValueOrDefault(Time.fixedDeltaTime);

            CollisionListener collisionListener = this.GetComponentInParent <CollisionListener>();

            Vector3 directionWorld = transform.TransformDirection(direction);
            Vector3 targetPosition = transform.position + directionWorld;

            collisionListener.Reset();

            IEnumerator move = ContinuousMovement.move(
                controller: this,
                collisionListener: collisionListener,
                moveTransform: this.transform,
                targetPosition: targetPosition,
                fixedDeltaTime: fixedDeltaTimeFloat,
                unitsPerSecond: speed,
                returnToStartPropIfFailed: returnToStart,
                localPosition: false
                );

            if (disableRendering)
            {
                unrollSimulatePhysics(
                    enumerator: move,
                    fixedDeltaTime: fixedDeltaTimeFloat
                    );
            }
            else
            {
                StartCoroutine(move);
            }
        }
Exemple #2
0
        public void RotateAgent(
            float degrees,
            float speed             = 1.0f,
            bool waitForFixedUpdate = false,
            bool returnToStart      = true,
            bool disableRendering   = true,
            float fixedDeltaTime    = 0.02f
            )
        {
            CollisionListener collisionListener = this.GetComponentInParent <CollisionListener>();

            collisionListener.Reset();

            // this.transform.Rotate()
            IEnumerator rotate = ContinuousMovement.rotate(
                controller: this,
                collisionListener: this.GetComponentInParent <CollisionListener>(),
                moveTransform: this.transform,
                targetRotation: this.transform.rotation * Quaternion.Euler(0.0f, degrees, 0.0f),
                fixedDeltaTime: disableRendering ? fixedDeltaTime : Time.fixedDeltaTime,
                radiansPerSecond: speed,
                returnToStartPropIfFailed: returnToStart
                );

            if (disableRendering)
            {
                unrollSimulatePhysics(
                    enumerator: rotate,
                    fixedDeltaTime: fixedDeltaTime
                    );
            }
            else
            {
                StartCoroutine(rotate);
            }
        }
Exemple #3
0
    public void moveArmTarget(
        PhysicsRemoteFPSAgentController controller,
        Vector3 target,
        float unitsPerSecond,
        float fixedDeltaTime        = 0.02f,
        bool returnToStart          = false,
        string coordinateSpace      = "arm",
        bool restrictTargetPosition = false,
        bool disableRendering       = false
        )
    {
        // clearing out colliders here since OnTriggerExit is not consistently called in Editor
        collisionListener.Reset();

        IK_Robot_Arm_Controller arm = this;

        // Move arm based on hand space or arm origin space
        // Vector3 targetWorldPos = handCameraSpace ? handCameraTransform.TransformPoint(target) : arm.transform.TransformPoint(target);
        Vector3 targetWorldPos = Vector3.zero;

        switch (coordinateSpace)
        {
        case "world":
            // world space, can be used to move directly toward positions
            // returned by sim objects
            targetWorldPos = target;
            break;

        case "wrist":
            // space relative to base of the wrist, where the camera is
            targetWorldPos = handCameraTransform.TransformPoint(target);
            break;

        case "armBase":
            // space relative to the root of the arm, joint 1
            targetWorldPos = arm.transform.TransformPoint(target);
            break;

        default:
            throw new ArgumentException("Invalid coordinateSpace: " + coordinateSpace);
        }

        // TODO Remove this after restrict movement is finalized
        Vector3 targetShoulderSpace = (this.transform.InverseTransformPoint(targetWorldPos) - new Vector3(0, 0, originToShoulderLength));

#if UNITY_EDITOR
        Debug.Log(
            $"pos target {target} world {targetWorldPos} remaining {targetShoulderSpace.z}\n" +
            $"magnitude {targetShoulderSpace.magnitude} extendedArmLength {extendedArmLength}"
            );
#endif

        if (restrictTargetPosition && !validArmTargetPosition(targetWorldPos))
        {
            targetShoulderSpace = (
                this.transform.InverseTransformPoint(targetWorldPos)
                - new Vector3(0, 0, originToShoulderLength)
                );
            throw new InvalidOperationException(
                      $"Invalid target: Position '{target}' in space '{coordinateSpace}' is behind shoulder."
                      );
        }

        Vector3 originalPos          = armTarget.position;
        Vector3 targetDirectionWorld = (targetWorldPos - originalPos).normalized;

        IEnumerator moveCall = ContinuousMovement.move(
            controller,
            collisionListener,
            armTarget,
            targetWorldPos,
            disableRendering ? fixedDeltaTime : Time.fixedDeltaTime,
            unitsPerSecond,
            returnToStart,
            false
            );

        if (disableRendering)
        {
            controller.unrollSimulatePhysics(
                moveCall,
                fixedDeltaTime
                );
        }
        else
        {
            StartCoroutine(
                moveCall
                );
        }
    }