Пример #1
0
    private void HapticFeedback(HapticAttributes hapticAttributes, Collision collision)
    {
        Module module = moduleByType[ActuatorType.Haptic];

        if (module == null)
        {
            Debug.Log("ERROR: module not found");
            return;
        }

        float velocity = collision.relativeVelocity.magnitude;
        float impulse  = 2 * hapticAttributes.Mass * velocity;

        int[]     values         = moduleValues[module];
        Vector3[] actuatorPoints = module.getPositionOfActuators();

        for (int actuator = 0; actuator < module.count(); actuator++)
        {
            Vector3 closestPointOnColliderInDirectionActuator = collision.collider.ClosestPoint(actuatorPoints[actuator]);

            float distance = Vector3.Distance(actuatorPoints[actuator], closestPointOnColliderInDirectionActuator);
            // F = dI/dt with t = 1s: abs(F) = abs(I)
            float f = attenuation(distance) * impulse;
            //Debug.Log("Setting element (" + actuatorPoint.x + ", " + actuatorPoint.y + ") to value: " + f);

            values[actuator] = (int)f;

            QueueValues(module.ID, values);
        }
    }
Пример #2
0
    private void OnCollisionEnter(Collision collision)
    {
        GameObject projectile = collision.collider.gameObject;
        Boolean    destroy    = false;

        HapticAttributes      hapticAttributes      = projectile.GetComponent <HapticAttributes>();
        TemperatureAttributes temperatureAttributes = projectile.GetComponent <TemperatureAttributes>();
        EMSAttributes         emsAttributes         = projectile.GetComponent <EMSAttributes>();

        if (hapticAttributes != null)
        {
            HapticFeedback(hapticAttributes, collision);
            destroy = true;
        }

        if (temperatureAttributes != null)
        {
            TemperatureFeedback(temperatureAttributes, collision);
            destroy = true;
        }

        if (emsAttributes != null)
        {
            EMSFeedback(emsAttributes, collision);
            destroy = true;
        }


        if (destroy == true)
        {
            Destroy(projectile);
        }
    }
Пример #3
0
    private void ActuateHaptic(GameObject trackedObject, int moduleId)
    {
        /*
         * RaycastHit hit;
         * Vector3 direction = trackedObject.transform.position;
         * if (Physics.Raycast(Vector3.zero, direction, out hit) && hit.collider.gameObject == trackedObject) {
         */
        HapticAttributes hapticAttributes = trackedObject.GetComponent <HapticAttributes>();

        //calculate force for each element, then send values
        float mass_head          = this.GetComponent <HapticAttributes>().Mass;
        float mass_trackedObject = hapticAttributes.Mass;

        Module module = modulesById[moduleId];

        Vector3[] actuatorPositions = module.getPositionOfActuators();
        int[]     values            = new int[module.count()];

        for (int actuator = 0; actuator < module.count(); actuator++)
        {
            float distance = Vector3.Magnitude(trackedObject.transform.position - actuatorPositions[actuator]);

            values[actuator] = (int)((mass_head * mass_trackedObject) / (distance * distance));
        }

        communication.QueueValues(moduleId, values);

        /*
         * }
         */
    }