Estoy creando una aplicación de visualización de datos de realidad virtual en Unity y tengo un padre con muchos hijos (solo algunos cubos primitivos) que puedo lanzar alrededor de la escena simplemente configurando el cuerpo rígido del padre a la misma velocidad que mi controlador de realidad virtual rastreado.
Rigidbody rb = GetComponent<Rigidbody>(); Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity(); // how I ref the controller velocity in SteamVR rb.velocity = controllerVelocity * 2f; // the 2f is just to speed up the velocityEl código anterior funciona bien, pero el problema es que creo que la escala de los objetos secundarios, que el jugador puede ajustar, está afectando la velocidad a la que se mueve el elemento principal. ¿O tal vez solo cuando los niños son muy grandes... la velocidad del controlador es comparativamente demasiado lenta? Básicamente necesito que este no sea el caso; Quiero que el cuerpo rígido de los padres se mueva aproximadamente a la misma velocidad sin importar las escalas/masas de los niños.
Entonces, para lograr eso, pensé en usar Rigidbody.AddForce, pero no parece estar haciendo ninguna diferencia, es decir, los niños más grandes todavía se mueven más lento. Esto es lo que tengo hasta ahora:
Rigidbody rb = GetComponent<Rigidbody>(); Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity(); rb.AddForce(controllerVelocity * 2f, ForceMode.VelocityChange);También probé ForceMode.Acceleration pero luego no se movió nada. ¿Estoy usando AddForce incorrectamente? ¿O solo necesito un multiplicador de escala basado en el tamaño de los niños? Cualquier ayuda es bienvenida.
No te respondo con la respuesta segura sino con una propuesta. Al cambiar la escala, presumiblemente no está cambiando la masa del objeto global, pero podría estar cambiando su centro de masa que afecta las inercias.
De los documentos "Si no establece el centro de masa de un script, se calculará automáticamente a partir de todos los colisionadores adjuntos al cuerpo rígido"
Lo que intentaría es obtener el valor del centro de masa y restablecer el mismo centro de masa después de la modificación de la escala para verificar si podría ser que el movimiento descrito por la fuerza aplicada sea el mismo que antes.
No es ideal, pero pude imitar el resultado deseado al hacer lo siguiente:
float parentMagnitude = transform.lossyScale.magnitude; float thrustAdjuster = parentMagnitude * 5f; Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity(); rb.velocity = controllerVelocity * thrustAdjuster;