software cinema graphics 3d uv-mapping

graphics - cinema - Generación automática de algoritmos de coordenadas UV



uv mapping software (3)

Estoy escribiendo mi propio editor uv para una herramienta mía, y estoy tratando de incorporar tantos algoritmos como pueda para las proyecciones. Necesito tomar una malla arbitraria y hacer coordenadas uv para cada vértice.

Hasta ahora, tengo Planar y Mapa Conformal de Mínimos Cuadrados.

Me gustaría incorporar más, como tri-planar, cylinder, esférica, pero estoy teniendo un momento muy difícil para localizar la información para realizar los algoritmos. Los tri-planar parecen generar un color, pero necesito obtener todo en coordenadas UV.

¡¡La ayuda seria muy apreciada!!



Tri-planar

Olvídate de eso: no es un algoritmo de proyección (un algoritmo que te da coordenadas UV), y no hay manera de que puedas obtener coordenadas UV de él. Es un algoritmo de renderizado que le proporciona un color obtenido mezclando el color que obtendría utilizando cada proyecciones planas XYZ por separado.

Cylindrincal, esférico

Al igual que el plano, esos son algoritmos de proyección muy simples que le dan un valor UV directamente desde un valor XYZ, sin tener en cuenta la conectividad con otros vértices.

  • Para cilíndrico: convertir (x, y, z) en Coordenadas cilíndricas (ρ, φ, z) y usar como coordenadas UV u = φ yv = z
  • Para esférico : convertir (x, y, z) en coordenadas esféricas (r, θ, φ), y usar como coordenadas UV u = θ y v = φ

Por supuesto, puede cambiar los roles de X, Y y Z para proyectar usando un eje diferente, o realizar alguna traducción / rotación / escala para tener más control (de la misma manera que puede controlar el tamaño y la orientación del plano que usa) para la proyección plana).

Cúbico

En primer lugar, debe determinar a qué "cara de proyección" asigna cada cara de su malla. Yo nombro las caras de proyección X, -X, Y, -Y, Z y -Z como en la figura siguiente (donde supongo que los ejes X, Y y Z tienen, respectivamente, los colores Rojo, Verde y Azul):

Para esto, simplemente busca qué coordenada de la normal (nx, ny, nz) tiene el mayor valor absoluto y asígnala a la cara correspondiente a este eje y signo. Por ejemplo:

  • si n = (0.8, 0.5, 0.3), entonces la cara correspondiente es X (| nx | es la más grande y nx es positiva)
  • si n = (0.3, 0.8, 0.5), entonces la cara correspondiente es Y (| ny | es la más grande y ny es positiva)
  • si n = (0.3, -0.8, 0.5), entonces la cara correspondiente es -Y (| ny | es la más grande y ny es negativa)

Luego, una vez que sepa a qué cara de proyección asigna cada cara de su malla, puede aplicar la proyección plana correspondiente a los vértices alrededor de esta cara para obtener un valor temporal (u_temp, v_temp) ∈ [0,1] x [0, 1].

El siguiente paso es transformar este valor uv_temp ∈ [0,1] x [0,1] en un valor uv incluido en el cuadrado más pequeño como se representa en la imagen A de arriba. Por ejemplo, si aplica la proyección "X", entonces quiere uv ∈ [2/3, 3/3] x [2/4, 3/4], entonces lo haría:

u = 2./3. + u_temp/3.; v = 2./4. + v_temp/4.;

Finalmente, el último paso es no olvidar duplicar los vértices UV que pertenecen a dos caras con diferente proyección plana (los bordes entre los diferentes colores en la imagen). De hecho, algunos vértices de la malla pueden (y deberían en la mayoría de los casos) dividirse en varias posiciones en el mapa UV para obtener resultados decentes.


Mapa cúbico

El método estándar para hacer esto, basado en un vector (rx, ry, rz) es buscar primero algunos valores en una tabla. Estos valores se usan para las coordenadas de textura (s, t) (o (u, v)) por vértice.

Primero encuentre el vector reflejado R = 2 (N punto V) N - V, donde V = Vértice, N = Normal, R Vector reflejado (rx, ry, rz)

major axis direction sc tc ma --------- --- --- -- +rx -rz -ry rx -rx +rz -ry rx +ry +rx +rz ry -ry +rx -rz ry +rz +rx -ry rz -rz -rx -ry rz

Una vez que se le han asignado valores a sc, tc y ma, las coordenadas (s, t) para esa cara se pueden calcular con las siguientes fórmulas.

if((rx >= ry) && (rx >= rz)) { sc = -rz; tc = -ry; ma = fabs(rx); //absolute value s = ((sc/ma) + 1) / 2; t = ((tc/ma) + 1) / 2; cout << "+rx (" << s << "," << t << ")" << endl; } if((rx <= ry) && (rx <= rz)) { sc = +rz; tc = -ry; ma = fabs(rx); s = ((sc/ma) + 1) / 2; t = ((tc/ma) + 1) / 2; cout << "-rx (" << s << "," << t << ")" << endl; } if((ry >= rz) && (ry >= rx)) { sc = +rx; tc = +rz; ma = fabs(ry); s = ((sc/ma) + 1) / 2; t = ((tc/ma) + 1) / 2; cout << "+ry (" << s << "," << t << ")" << endl; } if((ry <= rz) && (ry <= rx)) { sc = +rx; tc = -rz; ma = fabs(ry); s = ((sc/ma) + 1) / 2; t = ((tc/ma) + 1) / 2; cout << "-ry (" << s << "," << t << ")" << endl; } if((rz >= ry) && (rz >= rx)) { sc = +rx; tc = -ry; ma = fabs(rz); s = ((sc/ma) + 1) / 2; t = ((tc/ma) + 1) / 2; cout << "+rz (" << s << "," << t << ")" << endl; } if((rz <= ry) && (rz <= rx)) { sc = -rx; tc = -ry; ma = fabs(rz); s = ((sc/ma) + 1) / 2; t = ((tc/ma) + 1) / 2; cout << "-rz (" << s << "," << t << ")" << endl; }

Referencia http://www.unc.edu/~zimmons/cs238/maps/cubeind.html

Asignaciones de entorno esférico, cúbico y parabólico http://www.unc.edu/~zimmons/cs238/maps/environment.html

OP, ¿podría compartir su algoritmo de Mapeo Conformal de Mínimos Cuadrados para generar coordenadas UV? Gracias.