una rotar para objeto movimientos linea imagen grados figura como algoritmo java c# unity3d google-cardboard

java - para - rotar objeto en processing



¿Cómo se puede girar continuamente el cuerpo del personaje cuando su cabeza ya está girada 60 ° `? (2)

Finalmente encontré una solución para esto:

private float bodyRot = 0F; private float FOV = 70f; void LateUpdate() { if ( neckBone != null ) { Quaternion camRotQ = CameraFacing.transform.rotation * Quaternion.Euler( 0,0,-90); neckBone.transform.rotation = camRotQ; float camRot = camRotQ.eulerAngles.y; float delta = camRot- bodyRot; if ( delta > 180 ) { delta -= 360; } if ( delta < -180 ) { delta += 360; } if ( Math.Abs(delta) > FOV ) { if ((delta > FOV || delta < -180) && delta < 180) { bodyRot = camRot - FOV; } delta = camRot- bodyRot; if ((delta < FOV || delta > 180 ) ) { bodyRot = camRot + FOV; } } playerObj.transform.rotation = Quaternion.Euler(0, bodyRot, 0); CameraFacing.transform.position = cameraMount.transform.position; } }

Después de un poco de experimentación puse un vacío (HeadCam) en el cuello del personaje. Este fragmento de código permite la rotación de la cabeza de forma síncrona a CardboardHead / Camera.

void LateUpdate() { neckBone.transform.rotation = Camera.transform.rotation * Quaternion.Euler( 0,0,-90); Camera.transform.position = HeadCam.transform.position; }

Los brazos del personaje no deberían moverse cuando solo la cabeza rota durante el rango de -60 ° a 60 °, luego me gustaría mover todo el personaje con los brazos aún visibles. El siguiente método funciona siempre que el personaje no se gire más de 180 °, luego de eso, los caracteres se voltean 180 °. ¿Cómo puedo lograr una rotación constante?

void LateUpdate() { Quaternion camRot = Camera.transform.rotation * Quaternion.Euler( 0,0,-90); neckBone.transform.rotation = camRot; float yrot = camRot.eulerAngles.y; float ydelta = 0; if ( yrot < 300f && yrot > 180 ) { ydelta = yrot - 300f; } if ( yrot > 60f && yrot < 180 ) { ydelta = yrot - 60; } playerObj.transform.rotation = Quaternion.Euler(0, ydelta, 0); Camera.transform.position = HeadCam.transform.position; }

Un applet de java para probar el algoritmo independiente: https://github.com/3dbug/blender/blob/master/HeadCamRot.java


Una posible solución sería:

// Transform of the full body of the character. Transform body; // Transform of the head (child of |body| component). Transform head; // Maximum delta angle in degrees. float maxAngle = 60.0f; void RotateCharacter(Quaternion target) { // Rotate head as much as possible without exceeding the joint angle. head.rotation = Quaternion.RotateTowards (body.rotation, target, maxAngle); // Complete the remainder of the rotation by body. body.rotation = target * Quaternion.Inverse (head.localRotation); }

Tenga en cuenta que es posible que deba limitar las rotaciones no horizontales de antemano, es decir, asumí que dados los ángulos x y z de la rotación pasada no excederán maxAngle Además, aún así, debería ser bastante sencillo agregar esa limitación también dentro de la función anterior si es necesario.

Espero eso ayude.