La mejor solución que he encontrado hasta ahora en un foro perdido en el mar de foros es descomponer tu problema así :
![enter image description here]()
Aquí, U y V representan coordenadas dentro del cuadrilátero (escaladas entre 0 y 1).
Desde $P0$ , $P1$ , $P2$ & $P3$ podemos calcular fácilmente los vectores normales normalizados $N0$ , $N1$ , $N2$ & $N3$ . Entonces, es fácil ver que : $$u = \frac{dU0}{dU0 + dU1} = \frac{(P-P0) \cdot N0}{(P-P0).N0 + (P-P2) \cdot N2} \\ v = \frac{dV0}{dV0 + dV1} = \frac{(P-P0) \cdot N1}{(P-P0).N1 + (P-P3) \cdot N3}.$$
Esta parametrización funciona a las mil maravillas y es realmente fácil de calcular dentro de un shader, por ejemplo. Lo que es difícil es lo contrario: encontrar $P(x,y)$ de $(u,v)$ así que aquí está el resultado:
$$x = \frac{vKH \cdot uFC - vLI \cdot uEB}{vJG \cdot uEB - vKH \cdot uDA}, \\ y = \frac{vLI \cdot uDA - uFC \cdot vJG}{vJG \cdot uEB - vKH \cdot uDA},$$
donde: $$uDA = u \cdot (D-A), \quad uEB = u \cdot (E-B), \quad uFC = u \cdot (F-C), \\ vJG = v \cdot (J-G), \quad vKH = v \cdot (K-H), \quad vJG = v \cdot (J-G),$$
y finalmente: $$A = N0_x, \qquad \qquad B = N0_y, \quad C = -P0 \cdot N0, \qquad \\ D = N0_x + N2_x, \quad E = N0_y + N2_y, \quad F = -P0 \cdot N0 - P2 \cdot N2, \\ G = N1_x, \qquad \qquad H = N1_y, \quad I = -P0 \cdot N1, \qquad \\ J = N1_x + N3_x, \quad K = N1_y + N3_y, \quad L = -P0 \cdot N1 - P2 \cdot N3.$$
He estado usando esto con éxito para el mapeo de sombras de un frustum de cámara deformado mapeado en una textura cuadrada regular y puedo asegurar que funciona muy bien! :D
0 votos
Estás pidiendo un afín ¿transformación?
0 votos
Sí, eso se acerca bastante a lo que busco. Estoy buscando mapear una forma de 4 lados con esquinas ABCD a A'B'C'D'. ¿Hay una manera de hacer esto en general, o tengo que averiguar la transformación individual, rotar, cortar, etc diferencias entre las dos formas?
0 votos
Me cuesta entender lo que me pide. Parece que tienes un cuadrilátero arbitrario y quieres mapearlo a un rectángulo? La forma más directa sería promediar los lados opuestos y tomarlos como anchos y altos. ¿Hay algo que quieras que se conserve con esta transformación, por ejemplo, el área?
0 votos
No todos los rectángulos se pueden conseguir apuntando una cámara a un rectángulo. Así que ignora uno de los puntos de las esquinas y luego haz una transformación lineal (junto con una traslación para hacer coincidir el origen) para hacer coincidir el triángulo restante. El cuarto punto acabará mágicamente donde debe estar. Me gustaría hacer esto una respuesta, pero no puedo ser molestado a trabajar en realidad lo que la matriz que necesito.
1 votos
Una transformación afín 2D->2D no funcionará, ya que mapean paralelogramos a paralelogramos. Puedes hacer 3D->2D aprovechando la profundidad para tener en cuenta el no paralelismo (los dos lados serán paralelos en 3 espacios). Si conoces la profundidad, puedes seguir el artículo de Wikipedia y resolver los elementos de la matriz de la transformación.
0 votos
He buscado por todas partes una respuesta a esto. La respuesta de Patapom es un poco confusa para mí. Finalmente encontré este artículo de Codeproject y tiene una explicación detallada ¡con ejemplo de trabajo! codeproject.com/Articles/674433/