java 3d libgdx culling

java - Libgdx ModelBuilder.createRect solo visible desde un lado



3d culling (2)

Tal vez no directamente relacionado, pero aún es importante tener en cuenta: no use createRect o createBox para nada más que la depuración / prueba. En su lugar, combine formas múltiples en un único modelo / nodo / pieza. O incluso mejor, use una aplicación de modelado cuando sea posible.

No especificó cómo deshabilitó la eliminación de referencias en la cara posterior. Pero tenga en cuenta que no debe cambiar el estado opengl fuera del shader / rendercontext (esto provocará un comportamiento imprevisto). Para deshabilitar la eliminación de referencias, puede especificarlo utilizando el atributo de material IntAttribute.CullFace (consulte: https://github.com/libgdx/libgdx/wiki/Material-and-environment#wiki-intattribute ), DefaultShader (o ModelBatch predeterminado) ) Configurar el miembro defaultCullFace (ver http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.Config.html#defaultCullFace ) o el (obsoleto) DefaultShader#defaultCullFace estático DefaultShader#defaultCullFace Miembro de DefaultShader#defaultCullFace (ver http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.html#defaultCullFace ).

Si una cara está delante o detrás se basa en el bobinado del vértice. O en otras palabras: el orden en el que se proporcionan las esquinas del rectángulo se usa para decidir qué lado está adelante y qué lado está atrás. Si usa uno de los métodos rect, notará que los argumentos tienen el sufijo 00 , 01 , 10 u 11 . Aquí, al mirar la cara, 00 es inferior izquierda, 01 superior izquierda, 11 superior derecha y 10 inferior derecha.

Para un rectángulo, es normal que la perpendicular esté hacia fuera del rectángulo. Por ejemplo, si tiene un rectángulo en el plano XZ con su cara frontal en la parte superior, entonces su normalidad es X = 0, Y = 1, Z = 0. Si su cara frontal está mirando hacia abajo, entonces su normalidad es X = 0, Y = -1, Z = 0. Del mismo modo, si tiene un rectángulo en el plano XY, su normalidad es X = 0, Y = 0, Z = 1 o X = 0, Y = 0, Z = -1. Tenga en cuenta que la opción normal no se utiliza para la eliminación de rostros, sino que se utiliza con mayor frecuencia para iluminar, etc. Especificar una normal incorrecta / opuesta no hará que se elimine la cara (aunque también podría provocar una iluminación incorrecta / negra).

En mi primer juego libgdx 3D ahora createBox de createBox a createRect , para crear solo las caras visibles (si una pared está en el lado izquierdo de otra pared, su cara derecha no está visible ...). Estoy creando 4 modelos:

  1. frontFace
  2. backFace
  3. rightFace
  4. leftFace

Casi están dibujados cómo deberían realmente. Pero hay un gran problema: las caras laterales solo son visibles si miro en z-Direction positiva. Si miro hacia el otro lado ( z-Direction negativa), no dibujan. Las caras frontal y posterior solo dibujan, si las miro en x-Direction negativa. ¿Tiene algo que ver con las normales? Los he establecido para:

normal.x = 0; normal.y = 1; normal.z = 0;

¿Ese es el error? ¿Cómo debo configurar las normales? ¿Qué significan? Tengo una idea básica sobre el mapeo normal para iluminación, ¿es lo mismo?

Nota importante: he desactivado la eliminación de caras ocultas, pero no hizo ninguna diferencia. Ver el descarte de frustum está activado. Si necesita más información, publique un comentario y los agregaré lo antes posible. Gracias


Para su propósito, le recomendaría que use la clase Decal . Las calcomanías son sprites de mapa de bits que existen en una escena 3D. Este artículo es sobre el uso de calcomanías en LibGDX. Espero que sea lo que querías.