Hola a todos!!!
Tengo el siguiente problema. Necesito poder rotar un objeto(independientemente del forward al que apunte), respecto a la orientacion de otro objeto... pufff mejor lo dejo en video porque no encuentro una manera clara para poderlo explicar escribiendo. Creo que en el video se entiende bien el problema en cuestión y lo que necesito conseguir. Necesito poder conseguirlo mediante script evidentemente.... pero no he podido encontrar el modo de hacerlo
He estado mirando en la documentacion, google, etc varios días pero no he podido encontrar la manera de hacer lo que necesito.
Ruego por favor me orienteis un poco de como podría hacer esto. Un saludo y gracias por adelantado.
https://youtu.be/NkDVEdzi10w (//%5Byoutube%5Dhttps://youtu.be/NkDVEdzi10w%5B/youtube%5D)
Tenes que trabajar con rotaciones globales, estas mezclando rotaciones locales y globales.
Estás suponiendo que ambos vectores de rotación (o ejes de rotación) son idénticos, es decir Y (como mencionas en el vid) y lo que pasa es que ambos Y locales (hablando de "up") son distintos, pero ambos Y globales (Space.Word) son iguales, obviamente, entonces necesitas hacer un Rotate pero especificando un Space.World
Fijate que en la documentación, si usas Rotate:
public void Rotate(Vector3 (https://docs.unity3d.com/ScriptReference/Vector3.html) eulerAngles, Space (https://docs.unity3d.com/ScriptReference/Space.html) relativeTo = Space.Self); Space viene inicializado en "self" es decir que cada vez que uses Ej
eltransform.Rotate( Vector3.up * 5 );
... estás rotando localmente 5 grados en Y, pero si usas:
eltransform.Rotate( Vector3.up * 5 , Space.World);
estás rotando globalmente 5 grados en Y global.
PD: No se que estás usando ya que no está el código por ningún lado
Gracias a ambos por responder...
Respecto a lo que mencionó francoe1 he de decir que no he podido conseguir que funcione con rotaciones "globales". Cada vez que he intentado algun calculo para gestionarlo de este modo, he obtenido resultados bastante erroneos en las rotaciones resultantes. Así que me he visto obligado a mezclar rotacionLocal con rotacionGlobal para poder tener resultados mas idoneos. Cualquier ejemplo de como hacerlo de esta manera sería bienvenido.
Respecto a lo que comentaba lightbug decir que es lo que más se ha acercado a conseguir solucionar el problema, pero aun falla en ciertas ocasiones. Lo muestro en el siguiente video.
https://youtu.be/vH-4pBvPCcY (//%5Byoutube%5Dhttps://youtu.be/vH-4pBvPCcY%5B/youtube%5D)
Incluso cuando roto el padre de los cubos parece que todo funciona bien... salvo por el problema al rotar en X 90º que mencioné en el video anterior, ver en este video:
https://youtu.be/Eeq7_2xPVjw (//%5Byoutube%5Dhttps://youtu.be/Eeq7_2xPVjw%5B/youtube%5D)
Sin embargo cuando lo pruebo en un escenario "real" para poder influir en los huesos de la jerarquia de mi personaje, funciona peor que en el ejemplo de los cubitos. Por ejemplo con un hueso de la Espina del personaje.
Aunque con lo que dijo lightbug, en los cubos funciona casi bien salvo por el problema de cuando se rota en X, pero con mi personaje, los resultados empeoran y parece que no funciona de la misma forma que con los cubos. Dejo video para mostrarlo.
https://youtu.be/mMpV4fvc9yE (//%5Byoutube%5Dhttps://youtu.be/mMpV4fvc9yE%5B/youtube%5D)
¿Como debo hacer los calculos para que todo rote correctamente? Necesito alguna ayuda para poder programarlo correctamente...
Hola @ftejada, mirá me parece que lo del 90° de los cubos se puede llegar a dar por el paso de Euler a quaternion, no se si se dará mal esto pero una cosa que aprendí a la fuerza, que trabajar con eulers casi siempre terminó en cagada, en especial cuando te pasas de los 90,
no digo que sea así siempre, es solo mi experiencia con ellos, ya les tomé desconfianza.
En tu código estás determinando con un vector creado el valor del angulo("EulerAngles") que está bien, pero cuando rotás el cubo (con rotate) estás pasando el ".eulerAngles", no se si será eso pero bueno, lo menciono.
Lo que yo te planteaba originalmente es algo así (no se si se aplicará a tu personaje, solamente que quedé con lo del cubo):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cubosRot : MonoBehaviour {
public Transform[] m_targets;
public Vector3 targetRotation;
Vector3 oldTargetRotation;
void Update () {
if(targetRotation != oldTargetRotation)
{
for(int i = 0 ; i< m_targets.Length ; i++)
{
Vector3 currenttargetRotation = targetRotation - oldTargetRotation;
m_targets.Rotate( currenttargetRotation ,Space.World);
}
oldTargetRotation = targetRotation;
}
}
}
Hay quizás formas más lindas de hacerlo pero se entiende. Target rotation y oldtargetRotation son contenedores donde llevás cuenta de la rotación actual (quizás haya algún error),
pero con Unity solamente hablas en "idioma Quaternion" (con el rotate). Este script lo que hace es que vos le pasas los targets que quieras y cuando reconoce un cambio o delta de rotación recorre cada uno de los objetos y los rota globalmente, sin importar cada local (fijate los gizmos) bien simple.
Y el resultado:
(https://s33.postimg.cc/7aj1d9w6n/Cubos.gif)
Y con lo del personaje, ya no se que puede ser, cuanto más grande es el entorno donde trabajás más difícil es de encontrar la razón de la falla. ¿qué tan seguro estás de que ese "IkLogic" está rotando localmente y no globalmente? porque parecería que cuando cambiás la rotación ignora el resto (cuando caminas y girás en Y por ej) y en los cubos funciona (bueno hasta ahí nomás) pero claro no tenés este IKLogic... desconozco de IKs, solver y demás por eso pregunto.
saludos
Buenas!!Otra forma con quaternions.
Calculas el offset que hay entre las dos rotaciones
Luego a la rotacion del que manda le aplicas el offset.
https://docs.unity3d.com/ScriptReference/Quaternion-operator_multiply.html (https://docs.unity3d.com/ScriptReference/Quaternion-operator_multiply.html)
Mind Blow!!!
public Transform boss;
public Transform constrained;
private Quaternion offset;
public void OnEnable()
{
offset = Quaternion.Inverse(boss.rotation) * constrained.rotation;
}
public void Update()
{
constrained.rotation = boss.rotation * offset;
}
:)
Cita de: lightbug date=1528235825En tu código estás determinando con un vector creado el valor del angulo("EulerAngles") que está bien, pero cuando rotás el cubo (con rotate) estás pasando el ".eulerAngles", no se si será eso pero bueno, lo menciono.
Hola
@lightbug, lo hago así porque:
Este "transform" de la primera linea del siguiente codigo es el cubo que se ve en el video a la dch, (digamos que hace las veces de un solver para posteriormente aplicarle una rotacion a un hueso...). Y ese hueso digamos que sería el "cubeRotate" que hay más abajo en el codigo y que es el cubo de la Izq que sale en los videos.
Y en la tercera linea del siguiente codigo es donde le aplico al supuesto "hueso", (en este ejemplo era un cubo), solo la cantidad de rotación local que hayamos rotado previamente al solver(transform de la primera linea y cubo de la dch en los videos).
transform.localRotation = Quaternion.Euler(EulerAngles);
cubeRotate.rotation = originalRotation;
cubeRotate.Rotate(transform.eulerAngles, Space.World);
Aparte si le aplico directamente la variable "EulerAngles" de la primera linea de codigo al cubeRotate.Rotate(EulerAngles, Space.World); Sigue ocurriendo el mismo problema al rotar la X a 90º. Aunque probando este problema, me he dado cuenta que no es de mi codigo ni de como lo estaba haciendo, sino que pasa con cualquier transform aunque no sea hijo de ningun otro transform si lo pruebas desde el inspector... dejo video:
Video (//%5Byoutube%5Dhttps://youtu.be/7rncYd11bdc%5B/youtube%5D)
Por otro lado el enfoque que me has puesto en el codigo está bastante bien y "parece" que lo arregla todo, pero surgen unos errores de calculo que no se a qué se deben cuando intento en algún momento volver a dejar la rotación que le doy a traves del EulerAngles con todo a cero. Dejo video:
Video (//%5Byoutube%5Dhttps://youtu.be/OYQAZlrwtss%5B/youtube%5D)
EDITO: he estado probando el enfoque que indicaba hammer y va perfecto todo ya, salvo por lo del problema de que al rotar 90º en el ejeX, las posteriores rotaciones que se le den en el ejeZ del EulerAngles las hace en el mismo eje que las de el ejeY... y se pierde la posibilidad de rotar en el ejeZ
Cita de: hammer date=1528254126Calculas el offset que hay entre las dos rotaciones
Luego a la rotacion del que manda le aplicas el offset.
Hola @hammer !!! muchas gracias por responder. He probado la solucion que aportas y parece que es la más adecuada para lo que busco y es el enfoque que creo voy a utilizar... Ya ni me acordaba que los Quaternions podian "restarse" .
Aparte ahora con esto, funciona perfectamente en el escenario real con los solvers y los huesos de mi character
Aunque por este lado ya quedaría todo bien, sigue habiendo un problema que no se como sulucionar... el de que cuando se rota un transform en el ejeX 90º, las demas rotaciones en Z parece que desaparecen para convertirse en rotaciones en Y como dejo en el Video de abajo... Alguna idea de como solventar este problema?
Video (//%5Byoutube%5Dhttps://youtu.be/7rncYd11bdc%5B/youtube%5D)
Saludos
Gimbal Lock, hasta el apolo 13 tuvo problemas con el.
Basicamente las rotaciones por eule se aplican una a una en ciierto orden y por separado, en este caso es xyz(unity no deja cambiarlo),entonces.......como no se me ocurre como explicarlo te dejo un video(no he encontrado en español,aunque me extraña que no haya) y un ejemplo para que puedas reproducirlo en Unity para poder verlo bien y se entiende a la primera.
Puedes hacer la prueba, crea 3 planos uno para cada eje(ponle su color correspondiente son solo para que se vea la idea), pon cada plano con su normal apuntando en su eje, un plano para x donde su normal apunte en la misma direcion que el eje X,otra para y ,otro para z.Luego crea 3 gameobjects vacios y emparentalos uno detras de otro y dentro de cada uno emparentas el plano que le corresponda(no se pueden utilizar los planos ya que al posicionarlos ya no partiriamos de r:0,0,0 que queden asi:(los planos son solo para ayuda visual
-x(vacio rotacion 0 , 0 ,0)
--planoX
--y(vacio rotacion 0 , 0 ,0)
--planoX
---z(vacio rotacion 0 , 0 ,0)
--planoX
Ahora prueba a rotar el objecto, y ,en el eje y(el gameobject vacio) en el inspector y veras como se reproduce el problema.
Esto no tiene solucion,es asi,no hay mas.Cada año miles de riggers y animadores se suicidan por culpa del gimbal lock.Y es la razon por la que se utilizan Quaternions para representar rotaciones en el espacio.
Como lo has implementado?? porque se supone que haciendolo con quaternions no deberias encontrarte este problema.Tambien es posible que segun que jerarquia padres/hijos tengas y como la estes rotando estes reproduciendo el error como hemos hecho con el ejemplo.
eature=oembed" width="459">
(https://i.giphy.com/3oz8xXJ5NB2owg5V16.gif)
:)
edit el ejemplo estaba mal, no recordaba que unity no deja resetear rotations,estaba pensando en maya :)
Cita de: ftejada date=1528289482Por otro lado el enfoque que me has puesto en el codigo está bastante bien y "parece" que lo arregla todo, pero surgen unos errores de calculo que no se a qué se deben cuando intento en algún momento volver a dejar la rotación que le doy a traves del EulerAngles con todo a cero. Dejo video:
Claro exactamente por eso puse que se podía hacer de forma más linda, a mi también me daba algunos errores, y además fijate que estoy calculando un delta entre vectores, digo que la rot haga ese delta, y luego impongo que la nueva rot del registro sea dicho valor (ponele X grados) cuando en realidad podría ser otro (X + 0.01f grados, que se yo, por inventar un valor), la cosa es que mientras más acciones realices más error se podría llegar a dar, por eso cuando puse "quizás haya algún error".
Jaja en 6 o 7 post hay como 6 videos , tenés que ser youtuber ... eso sí acordate para la proxima de subir el código que usás de entrada, fijate que acá recién en el sexto o septimo post está (sacando al vid que lo tieneque no me acuerdo cual es)
Saludos
primero... muy buena la explicacion con videos... facilita la explicacion del problema que te atañe....
muchas veces queda poco claro el problema que se plantea en los posts... este no es el caso... esta claro que una imagen vale mas que mil palabras... anímo a todos a ser mas "visuales" en las explicaciones en los posts...
bueno, ...esto de las rotaciones a veces es un verdadero quebradero de cabezas.....
otro posible truco para hacer esto seria emparentar/desemparentar todo el rato el objeto quer quieres rotar...
es decir, tienes un empty gameobject,
1-lo orientas como la camara,
2-lo colocas en la posicion donde esta el objeto que quieres rotar,
3-haces que el objeto que quieres rotar sea hijo del objeto vacio
4-rotas el objeto vacio y deshaces el emparentamiento...
y vuelta a empezar... cada frame... cada objeto que quieras rotar...
ah, cuidado con los eulerAngles... que como dice @lightbug yo tambien he tenido malas experiencias con ellos...
Gracias de nuevo a todos por las respuestas....
@lightbug es cierto y llevas razón... debo poner antes el codigo para que lo veais...
@Igor hola!! Gracias por los comentarios. Prefiero hecer muchas veces un video, pq se me hace muy dificil de explicar ciertas cosas escribiendolo para que se me entienda... aunque tampoco es que me explique muy bien en video, pero pienso que es algo mejor jeje
Bueno... La idea que planteas ( emparentar/desemparentar ) es de las primeras que tantee, pero no se si es muy buena idea hacer eso en una jerarquia de huesos de un character o si fallaría algo por el tema de ls animaciones o yo que se...entiendo que no pero si no puedo conseguirlo haciendo los calculos puros mediante quaternions, tendré que tantear esa idea a fondo. Aparte creo que me viene muy bien aprender a gestionar los Quaternions para dominar todo este lio de las rotaciones.
@hammer Pensaba que al introducir los valores de rotacion que queramos, mediante el inspector para la rotación de cuanquier Transform, Unity se encargaba internamente de gestionarlo adecuadamente mediante Quaternions para que no se produjese el bloque de Gimbal... al igual que creando una rotación mediante Quaternion.Euler(Vector3 EulerAngles);... Pensé que creando rotaciones con está función no se creaba dichos bloqueos.
Cita de: hammer date=1528310241Como lo has implementado?? porque se supone que haciendolo con quaternions no deberias encontrarte este problema.Tambien es posible que segun que jerarquia padres/hijos tengas y como la estes rotando estes reproduciendo el error como hemos hecho con el ejemplo.
En este video expongo un poco la jerarquia de huesos y sus rotaciones locales en mi character de Unity.... el codigo que viene no te guies por el pq ya está modificado y adecuado a la solucion que aporte (hammer) con la que funciona todo bastante bien. Es solo para que veas la jerarquia de hueso si te interesa
https://youtu.be/mMpV4fvc9yE (//%5Byoutube%5Dhttps://youtu.be/mMpV4fvc9yE%5B/youtube%5D)
Referente a como lo he implementado, no entiendo bien tu pregunta ya que en los videos, (no en todos), se mostré el codigo que utilizo... pero por si no los has visto, mea culpa...
En el ejemplo de los cubos y siguiendo tus consejos con lo del offset, el codigo sería este...
cubeSolver.localRotation = Quaternion.Euler(EulerAngles); //EulerAngles es una variable publica para modificarla por el inspector
cubeBone.rotation = cubeSolver.rotation * offsetRot; //offsetRot es la diferencia inicial entre la rotacion de cubeSolver y cubeBone
//Basicamente es lo que comentó hammer
En el codigo de la escena de mi character, es más lioso poner el codigo por que intervienen varios script por otros motivo, pero en realidad es exactamente lo mismo que en el codigo que he puesto aquí arriba.
Por lo que he estado probando en este dia y medio, tu solución funciona bastante bien en mi character y su jerarquia de huesos. Pero en estos dias quiero subir un video mostrando un problema que no estoy sabiendo calcular mediante Quaternions referente a este asunto utilizando la solucion que dijiste hammer. Voy a intentar solucionarlo yo unos dias más y si no puedo prepararé el video para exponer el problema en cuestion, que es algo lioso.
Saludos
Eii buenas,esta vez si que me he mirado los videos :).Mhhh esta dificil....,preguntas y consideraciones.
En el anterior video que rotas el cubo a traves del inspector y te sale el gimbal lock, fijate que si pones x 90,luego rotas desde la scene con el handler de rotacion en local el eje y,veras como unity automaticamente te corrige los ejes yz
Es decir x90y0z0 gimballlock yz ,pero x90y-90z-90 es exactamente la misma orientacion pero sin el problema del gimball.Cuando rotas desde la scena unity corrige el gimball,desde el inspector no se corrige.
Lo mismo te pasara si lo haces desde la variable eulerAngles que tienes en el scriptable.
La verdad que esta complicado de saber,pueden ser muchas cosas o varias a la vez,por ejemplo si algun padre del spine que no es padre del solver tiene rotacion durante la ejecucion,animacion o script,problema,ya que entonces el offset ya no seria el mismo que el inicial, y al estar asignando una rotacion(mejor dicho orientacion) global,el spine va a quedar bloqueado en esta orientacion global sin importarle que el padre rote, el siempre apuntara con esa orientacion mientras no cambie el offset
Se me ocurren algunas cosas, pero sin saber como funciona lo mas probable es que me equivoque y acabe liandote
Mira lo de los padres del spine que no roten, y haz una prueba quitando lo del vector3 euler del scriptable y haz la rotacion directamente en el solver en la ventana scene.Haber si asi funciona.
Lo de los euler lo miramos despues,primero asegurarse que esta primera parte funciona y luego le buscamos otra manera a aplicar los euler.Quiza sacando los quaternions por separado y luego sumandolos a los otros,....... * offset * qx * qy * qz,pero eso luego,primero asegurarse que funciona la relacion solver/spine sin la variable euler del scriptable conduciendo al solver.
Un saludo.
Cita de: hammer date=1528453373Mira lo de los padres del spine que no roten, y haz una prueba quitando lo del vector3 euler del scriptable y haz la rotacion directamente en el solver en la ventana scene.Haber si asi funciona.
Lo de los euler lo miramos despues,primero asegurarse que esta primera parte funciona y luego le buscamos otra manera a aplicar los euler.Quiza sacando los quaternions por separado y luego sumandolos a los otros,....... * offset * qx * qy * qz,pero eso luego,primero asegurarse que funciona la relacion solver/spine sin la variable euler del scriptable conduciendo al solver.
Hola @hammer!!! de nuevo gracias por la ayuda... No he podido contestar antes.
He estado probando varias cosas...a ver...
No se a qué te referias con esto de lo de que los padres de spine no roten.... De todos modos te comento, aunque ya lo hemos visto en alguno de los videos. La jerarquia de padres/hijos del character seria algo así:
EthanCharacter(rot(0,0,0))->EthanSkeleton(rot(0,0,0))->EthanHips(rot(0,90,-90))->EthanSpine(rot(0,0,4.95))->EthanSpine1(rot(0,0,0))... Este ultimo de "EthanSpine1" es el que queremos mani***r... Aparte este "EthanSpine1" cambia en cada frame su rotacionLocal por los clip de animacion que estén ejecutandose. Dicha variaciones pequeñas en la rotacion local cada frame por el clip de animacion, también tenemos que tenerla en cuenta para los resultados finales que apliquemos en el LateUpdate.
Dicho esto, ya lo tengo programado para que haga todo esto, y va perfecto. Lo unico que falla y debo solucionar es el bloqueo de Guimbal en ciertos angulos/circustancia. Este sería el codigo que tengo hasta ahora:
//Se ejecuta en cada frame en el LateUpdate
void UpdateRotSpine()
{
advIK.solverSpine.localRotation = Quaternion.identity; //Reset to 0 localRotation
Quaternion newOffset = Quaternion.Inverse(solverSpine.rotation) * spineBone.rotation; //Creamos el nuevo offset en cada frame para que contenga los cambios de la animacion
solverSpine.localRotation = Quaternion.Euler(EulerAngles); //Aplicamos rotacion adicional
spineBone.rotation = solverSpine.rotation * newOffset; //lo aplicamos todo al hueso spine
}
La prueba rotando el solver directamente desde la pantalla scene, soluciona el problema del bloqueo de guimbal, ya que de este modo Unity si te corrige internamente la rotacion para que no haya guimbal lock.
Buenas,pues esa es la parte dificil,no se como lo hara unity internamente la verdad, lo veo dificil, en el momento que intentas controlar las rotacion con 3 variables encontraras gimbal,aunque lo hagas en quaternions,el orden en que se aplican las rotaciones siempre importa,,prueba a rotar desde el rotator handler en la scena 90z,90x ,luego partiendo otra vez del reposo hazlo al reves,90x,90z, el resultado es completamente diferente.Aparte el gimbal del editor engaña mucho crees que estas rotando en x,pero si miras inspector lo estas haciendo en z en verdad,Asi que creo que tampoco puedes guiarte mucho por el gimbal del editor.Un follon vamos, me dan caspa los quaternions vs eulers, cuando son 3 angulos a rotar. XD
Quizas algun modo de control picth(x),yaw(y),roll(z) te pueda servir o algun 6dof
Prueba asi haber si te sirve(ni 6dof ni nada), plantealo como si con x controlas la inclinacion hacia delante,con y el twist, con el z el bend,lo dijo porque si miras los vectores te puede chocar al ver que no coincide a cuando lo mueves con el handler,peor creo que alomejor te puede servir al ser un personaje.Basicamente hay un parent para el cubo donde controlaremos zx, en el cubo controlaremos y.
boss.parent.localRotation = Quaternion.identity;
boss.localRotation = Quaternion.identity;
constrained.localRotation = Quaternion.identity;
boss.parent.localRotation = Quaternion.Euler(uler.x, 0f, uler.z);
boss.Rotate(Vector3.up,uler.y,Space.Self) ;
Quaternion newOffset = Quaternion.Inverse(boss.rotation) * constrained.rotation;
constrained.rotation = boss.rotation * offset;
a ver si hay suerte!!!
:)
creo recordar para rotar estilo pitch yaw roll hay que rotar primero el Z, luego el Y, y por ultimo el X... o algo asi lo tenia en un proyecto de "naves" que tenia por ahi...
pero sigo sin entender muy bien lo que quieres hacer...
Contesto a @Igor que creo que es mas rapido. Lo que quiero hacer es un sistema IK sin utilizar el de Unity ya que este no maneja algunos huesos de los characters como por ejemplo la spine. Ni tampoco tiene en cuenta que a la pelvis y/o spine sean influenciados por los movimientos de las manos... Por poner un ejemplo.
En este post ya estuvimos hablando de a lo que me refiero francoe, tú y yo:
Post UnitySpain (//<___base_url___>/topic/38988-necesito-ayuda-para-conseguir-influencia-sobre-otros-huesos-mediante-ik/)
Respecto a lo de @hammer voy por partes para no liarme:
1/ Que es un " 6dof "? no lo habia escuchado nunca.
2/ Con el codigo de ejemplo se arregla el bloqueo de Gimbal entre los ejes Y y Z cuando ponemos X en 90. Pero sigue produciendose el bloqueo entre X e Y cuando ponemos X en 90/-90 y Z en 90/-90. Y poniendo otro padre más y que cada padre lleve solo la rotacion de un eje concreto, empeora la situación.
Saludos
6dof = 6 degres of fredoom...
seis grados de livertad....
se refiere a poder moverse en cualquier direccion (adelante, atras, izquierda, derecha, arriba y abajo) pero pudiendo rotar en rodos los ejes al estilo pitch yaw roll....
si envez de poder girar en esos ejes solo puede girar (el personaje) en el eje "y" ...o como mucho tambien el el "x"... como habitialmente pasa en todos los juegos que no son de "naves"... eso seria un 3dof...
ahora ya me entero mas de que va el tema... es un poco lio rotar los huesos manualmente ya que cada hueso tiene el "pivot" orientado de una manera... pero se puede... aunque no sin quebraderos de cabeza
por ejemplo se me ocurre comprobar que mano esta mas lejos de la cadera... y girar la cadera y spines en consecuencia... si la mano mas lejana es la derecha pues gira cada espine un poco (en proporcion a la distancia a la que este la mano...) ...la distancia a la cadera pero sin tener en cuenta el eje "y" claro.... no queremos que al levantar la mano gire el cuerpo... o bueno igual si... puedes hacer que levante o baje el hombro dependiendo de la altura... y incluso si es muy baja pies doblarle la espalda y las piernas... (para que se agache)...
too tendria que ser con "Rotate" y hacerlo en "LateUpdate"
Buenas.Eso, 6 grados de libertad, osea poder rotar en todos los ejes,como dice Igor, normalmente los juegos rotan en 1 angulo,una camara en 3persona o un avion son 2, 3 es muy raro de ver, kerbal space ,el antiguo Descent,elite dangerous me vienen a la cabeza.No se como lo haran,aunque nunca se rota los 3 a la vez,asy que pueden adaptarse y cambiar el orden de rotacion de los ejes.Si fuera posible los animadores no tendrian dolores de cabeza con el gimbal,seguirian con sus xyz tan felices.
Si estas implementando tu propio ik, lo que buscas se llama ful lbody ik, no tiene mucho que ver con lo de rotar,eso tendria que calcularlo el solver del sistema segun lo configures en el momento.
Te lo habia puesto pensando que solo querias controlar un poco la rotacion para ajustarla,como el personaje tampoco va a tener rotaciones tan exageradas en esos hueos,por ejemplo, en X hacia adelante a un puede llegar a 90 para atras mucho menos,en y la parte de los hombros si que puede llegar a los 80º la parte inferior muchisimo menos,en z lo que se puede rotar es minimo, no llegara a 45º la parte de arriba.Y estos limites siendo la suma de todos los huesos hasta el ultimo, no solo de uno.Por eso pense que alomejor te servia. Pero lo que quieres no tiene nada que ver.
He encontrado un par de links con codigo fuente de sistemas fbik,ue4 y unity
https://github.com/hacoo/rtik (https://github.com/hacoo/rtik)
https://github.com/Stereoarts/SAFullBodyIK (https://github.com/Stereoarts/SAFullBodyIK)
Aunque no tiene nada que ver con lo que buscas,alomejor a alguien le sirve.
constrained.rotation = Quaternion.Euler( bendZ * constrained.forward ) * Quaternion.LookRotation(boss.position - boss.parent.position);
el boss,el cubo, tiene que estar en la misma posicion que su padre y adelantado en z 1 unidad. osea 0,0,1
Si movemos verticalmente el cubo rotara en x, si lo movemos horizontalmente rotara en y, z se rota con una variable independiente(podemos ponerle la z euler local del cubo).No hay que mover en z el cubo.
Da un poco de juego a la hora de controlar la animacion del personaje pero no tiene nada que ver con un sistema fullbodyik
Cita de: Igor date=1528898099por ejemplo se me ocurre comprobar que mano esta mas lejos de la cadera... y girar la cadera y spines en consecuencia... si la mano mas lejana es la derecha pues gira cada espine un poco (en proporcion a la distancia a la que este la mano...) ...la distancia a la cadera pero sin tener en cuenta el eje "y" claro.... no queremos que al levantar la mano gire el cuerpo... o bueno igual si... puedes hacer que levante o baje el hombro dependiendo de la altura... y incluso si es muy baja pies doblarle la espalda y las piernas... (para que se agache)...
too tendria que ser con "Rotate" y hacerlo en "LateUpdate"
Gracias por la respuesta @Igor. Si, esto es más o menos lo que quiero hacer teniendo en cuenta un minimo impacto sobre la animación que se está ejecutando en ese momento.
La verdad es que se me está haciendo muy cuesta arriba esto y no veo una manera clara de poder hacerlo dada mi total ignorancia en como programar un sistema IK desde cero... Supongo que irá con trigonometria fundamentalmente, aunque hay cosas como las que has dicho, de si bajamos mucho las manos que la pelvis baje y las piernas se doblen, que no se si se harán del mismo modo.
He estado buscando por internet tutoriales que expliquen como hacer un sistema IK desde cero sin utilizar el OnAnimatorIK de Unity pero encuentro muy poco material. He encontrado alguno, pero tienen muchas lagunas y parece que dan muchas cosas por sentadas sin que las hayan explicado... y termino por perderme... como por ejemplo este: Tutorial_IK (https://www.alanzucconi.com/2017/04/17/procedural-animations/)
Gracias @hammer por el aporte. He estado mirando el codigo de uno de ellos, nunca he sido bueno para comprender codigo ajeno y puffff... es inmenso con muchos scripts y no soy capaz de encontrar la información, de como se calcula todo los "calculos" del IK, que necesito y aprender como se hace. Soy torpe para muchas cosas y esta es una de ellas.
Voy a seguir intentandolo a ver si puedo sacar algo en claro pero desde luego cualquier ejemplo de codigo, tutorial o explicación sería muy agradecido. Porque ahora mismo no se por donde tirar.
Saludos y muchas gracias de nuevo por la ayuda