detector - THREE.JS: renderiza objetos grandes y distantes con las z-indicies correctas y sigue acercándote a objetos pequeños
webgl three js documentation (2)
Tengo una escena en la que dibujo (para escalar) la tierra, la luna y algunas naves espaciales. Cuando la luna está ocluida por la tierra, en lugar de desaparecer, aún es visible (a través de la tierra).
De mi investigación encontré que parte del problema es que las configuraciones cercanas para mi cámara eran demasiado pequeñas, como se detalla en el artículo vinculado, pequeños valores de redondeo de causa cercana en ordenamiento z para confundir objetos muy distantes.
La complejidad aquí es que necesito tener índices z de grano fino para cuando la cámara se acerca, para mirar una nave espacial (un objeto con un radio de 61 metros como máximo, en comparación con la tierra, pesando a r =~ 6.5e+06 meters
). Para hacer que los objetos en la escala de la luna y la tierra se rendericen en el orden correcto, el cercano debe tener al menos 100.000 m, en cuyo punto no puedo mirar los objetos cercanos.
Una solución sería reducir la escala para usar kilómetros, pero no puedo permitirme perder esa precisión, y prefiero usar medidores.
¿Alguna idea sobre cómo hacer objetos muy grandes y distantes se representa con los Índices z correctos, conservando al mismo tiempo la escala y la capacidad de acercarse a objetos pequeños?
Mis ideas (que no sé cómo implementar):
- ¿Cambiar z-buffer para incluir más valores y mayor resolución?
- Agregue objetos distantes a un "farScene" que se representa utilizando una "farCamera" que está controlada por los mismos controles que se utilizan en una cámara de primeros planos.
Probablemente, el problema es z-test y no z-precision. esto significa: la prueba z no se aplica (tal vez porque se renderiza un objeto transparente con mezcla alfa) o la prueba z se aplica con una prueba no predeterminada (por ejemplo, sobrescribir lejos en lugar de cerca).
Intenta renderizar toda la escena con un sombreador simple sin transparencia para asegurarte de que la transparencia no sea la fuente del error. para resolver el orden z sin prueba z, debe ordenar el objeto usted mismo cada cuadro para determinar el orden de la representación (desde lejos hasta cerca).
Según la respuesta de @WestLangley, la solución es simplemente agregar la opción logarithmicDepthBuffer: true
Profundidad logarithmicDepthBuffer: true
al representador:
this.renderer = new THREE.WebGLRenderer({antialias: true, logarithmicDepthBuffer: true});