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.