android camera android-canvas translate

android - Diferencia entre Camera.translate y Matrix.preTranslate o Matrix.postTranslate?



android-canvas (2)

El resultado sería visualmente igual si, por ejemplo, no tocas el lienzo, pero gira la cámara 90 g o mantén la cámara quieta pero gira el lienzo que mira por -90 g.

Usamos la cámara para hacer transformaciones 3D en lienzo. Por lo general, rotamos la cámara y tomamos su matriz y luego la traducimos. Pero la cámara también tiene un método de traducción. Los resultados del uso de métodos son diferentes.

Mi pregunta es: ¿Cuál es la diferencia entre Camera.translate y Matrix.preTranslate o Matrix.postTranslate?


La razón de que existan ambas es que la multiplicación de matrices debe hacerse en un cierto orden para lograr el resultado adecuado (como ya sabrá).

La secuencia de traducciones / rotaciones / escalas se realiza en orden inverso a medida que las escribe.

Entonces, si haces algo como esto:

Camera.rotate(15, 0, 0); Camera.scale(.5f, .5f, .5f); Camera.translate(70, 70, 70);

Primero está traduciendo 70,70,70 y escalando un 50% en todas las direcciones, y luego gira 15 grados alrededor del eje X.

Entonces Matrix tiene una traducción previa y posterior (bueno, pre y post todo), porque tal vez quieras rotarla primero en 15 grados y luego traducirla, y finalmente escalarla.

Entonces eso responde a la traducción previa y posterior. Ahora la razón por la cual la cámara tiene una rotación directa y la traducción es para personas que ya saben cómo funciona (¡como yo!), Así que nunca uso Matrix o Camera para ese asunto, porque puedo simplemente hacer mis rotaciones y traducciones directamente en el lienzo. También puede hacerlo siempre que sepa que las traducciones, escalas y rotaciones se realizan en orden inverso.

Además, si sabes lo que te dije, te da más poder. Puede hacer una secuencia de 10 matrices sin rodearlas en múltiples objetos Matrix para cada una (por ejemplo, desea hacer un movimiento de balanceo que se balancee hacia afuera Y gire sobre el centro para simular la fuerza centrífuga). Esto tendría que hacerse con múltiples rotaciones y traducciones (rodeadas por múltiples objetos Matrix que se pasan entre sí), pero si sabe cómo funciona cada traducción, simplemente puede hacer una serie de .translate (), .rotate (), y .scale ().

Esta información es especialmente útil si alguna vez haces gráficos en 3D, porque es cuando estas matrices dan dolores de cabeza a las personas.

¡Espero que esto ayude!