Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo obtengo una matriz en la que traducir, luego rotar, luego traducir y luego rotar una segunda vez?

En una aplicación de Android quiero dibujar una pierna en ejecución. Para dar salida a la parte superior de la pierna hago algo como:

// legCX,legCY is the location on screen about which the leg rotates. Matrix m = new Matrix(); m.postTranslate(-legCX,-legCY); m.postRotate(legRot); m.postTranslate(legCX,legCY); 

Luego pongo la matriz en el lienzo y dibujo la pierna.

¿Cómo dibujo la segunda parte de la pierna por debajo de la rodilla? Se gira a una velocidad diferente que la pierna por encima de ella y tiene un punto central que se mueve con la pierna por encima de ella. He intentado lo siguiente, pero resulta que el resultado final es la rotación alrededor de un solo punto que no sigue la pierna de arriba.

 Matrix m = new Matrix(); m.postTranslate(-legCX,-legCY); m.postRotate(legRot); m.postTranslate(0,-legLength); m.postRotate(footRot); m.postTranslate(0,legLength); m.postTranslate(legCX,legCY); 

Sospecho que es probablemente necesario hacer las dos rotaciones en dos objetos diferentes de la matriz y después combinarlos de alguna manera, pero no puedo imaginar cómo exactamente hacer eso.

EDIT: Este tipo de matriz parece ser llamado una "matriz de transformación". La combinación de múltiples operaciones se denomina composición de transformaciones. Sin embargo, ninguna de las páginas sobre este tema menciona cómo hacer una serie de traducciones y rotaciones.

Seguramente, si se puede utilizar una matriz para hacer la rotación alrededor de un punto, debe ser posible hacer varias operaciones de matriz de alguna manera para permitir la rotación de un punto y luego una rotación adicional alrededor de un punto diferente.

He intentado mirar las páginas sobre la animación esquelética, pero no puedo hacer cabeza ni cola de lo que están hablando.

  • Multiplicación básica de matriz en OpenCV para Android
  • ¿Cómo animar una matriz para "recortar" una imagen?
  • Obtener nueva posición de coordenadas después de la rotación con Matrix
  • Android Matrix multiplyMM en detalle
  • Necesidad de calcular el vector de rotación a partir de los datos de Sensor.TYPE_ORIENTATION
  • ¿Textura al revés? | OpenGL-ES 2.0 (Android)
  • Hacer una matriz para un efecto smuge / wobble (ver imágenes) en Android
  • ¿Cómo aprender y usar OpenGL ES 2.0? Simplemente no lo entiendo - Qn serio.
  • 2 Solutions collect form web for “¿Cómo obtengo una matriz en la que traducir, luego rotar, luego traducir y luego rotar una segunda vez?”

    Si entiendo su problema correctamente, usted tiene un caso de rotación relativa. Puede intentar buscar un péndulo doble, ver fig.

    Péndulo doble

    Utilizando la matriz de rotación se pueden encontrar las nuevas coordenadas del punto p1 girado alrededor del punto p0

    Las nuevas coordenadas del punto p2 girado alrededor del punto p1 serán

    Finalmente, las nuevas coordenadas del punto p2 girado alrededor del punto p0 serán

    El orden de la multiplicación de matrices importa también el signo de los ángulos.

    Me temo que esto va a ser lenguaje agnóstico – Estoy haciendo algo similar en el momento en Android, pero estoy tanto aprendizaje de matemáticas android y la matriz! Usted parece saber cómo utilizar matrices en Android por lo que estoy suponiendo que esto no será un problema.

    Por lo tanto, digamos que tenemos dos mallas (donde una malla es la cosa que se puede dibujar independientemente a la pantalla): UpperLeg y LowerLeg .

    • Para UpperLeg vas a tener el punto donde gira la malla ( RotationPoint ) (en el mundo real supongo que esta sería la cadera) y vas a tener el punto donde el LowerLeg atribuye ( AttachmentPoint ) (en El mundo real, supongo que esto sería la rodilla).
    • Para LowerLeg vas a tener el punto donde gira la malla ( RotationPoint ) (en el mundo real supongo que esta sería la rodilla).

    UpperLeg.AttachmentPoint = LowerLeg.RotationPoint (de esa manera su pierna no se caerá).

    Ahora imaginemos que usted tiene dos cantidades de rotación (una para UpperLeg y otra para LowerLeg ): UpperLeg.Rotation y LowerLeg.Rotation .

    (Uno de ellos el tema de la rotación – si usted no ha oído hablar de Quaternions , debe mirar – me sorprende que algún tipo de 1846 se les ocurrió – que básicamente encapsular el concepto de rotación, se puede convertir en matrices de rotación, puede ser Combinado (por multiplicación) y no sufren de Gimbal-bloqueo).

    En primer lugar usted gira UpperLeg por:

    1. Mover la malla UpperLeg para que UpperLeg.RotationPoint sea ​​el origen
    2. Rotación por UpperLeg.Rotation
    3. Mover la malla UpperLeg para que sea donde debe estar en el mundo real. Veo que estás haciendo esto.

    Así que para el LowerLeg sería:

    1. Mover la malla LowerLeg para que LowerLeg.RotationPoint sea ​​el origen
    2. Rotación por ( UpperLeg.Rotation combinado con LowerLeg.Rotation )
    3. Mover la malla LowerLeg por la misma cantidad que la malla UpperLeg se movió en el paso 3
    4. Mover la malla LowerLeg por el Vector que es (el Vector de UpperLeg.RotationPoint a UpperLeg.AttachmentPoint ) girado por UpperLeg.Rotation .

    Los pasos anteriores se pueden combinar y optimizar.

    Esencialmente estoy diciendo:
    Rotate LowerLeg ya que necesita ser girado, luego empujarlo donde necesita ir – donde se necesita ir se determinará por donde UpperLeg fue, más cómo llegar a donde LowerLeg está conectado a UpperLeg .

    Este es mi primer post aquí, así que, si he roto las reglas cardinales, por favor, hágamelo saber lo que son.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.