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); } }
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); } }
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); /* * } */ }