Esto me ha vencido desde hace un tiempo. Estoy creando un juego y el mapa principal es un modelo que usa el formato obj. Lo cargo así:
var objLoader = new THREE.OBJLoader(); objLoader.setPath('Assets/'); objLoader.load('prison.obj', function(prison){ prison.rotation.x = Math.PI / 2; prison.position.z += 0.1; prison.scale.set(15, 15, 15) scene.add(prison); });
Entonces cuando estaba cargando el mismo modelo, pero más pequeño, funcionó normalmente. Pero, ahora he añadido más al modelo, y es mucho más grande. WebGL comienza a darme esta advertencia: [.WebGL-0x7fb8de02fe00]GL ERROR: GL_INVALID_OPERATION: glDrawArrays: intento de acceder a vértices fuera de rango en el atributo 1. Esta advertencia ocurre 256 veces antes de que WebGL diga WebGL: demasiados errores, no habrá más errores informado a la consola para este contexto.
Y con esta advertencia, mi modelo no se carga por completo. En Vista previa, veo el modelo así, como se esperaba :
Pero en Three.js, veo algo diferente:
Bueno, no estoy exactamente seguro de qué está mal aquí:
Cualquier ayuda es apreciada, gracias. Avísame si necesitas más detalles.
Este error le indica que el recuento de atributos de su geometría no coincide. Por ejemplo, su geometría podría tener:
... O algo por el estilo. Al buscar información sobre ese vértice número 100, dice "attempt to access out-of-range vertices"
Lo ideal sería volver a exportar el activo OBJ para no tener que encontrar manualmente la geometría que está causando el problema. Sin embargo, en caso de que no pueda obtener un nuevo OBJ, puede:
mesh.visibility = false
// We assume you already found the mesh with the problem. const problemGeometry = mesh.geometry; // Now we dig through the console to see each attribute. // Look up each attribute.count property to see which one is short. console.log(problemGeometry.attributes); // Then you'll have to set the draw range to the lowest of these counts // Here I assume the lowest is 99 problemGeometry.setDrawRange(0, 99);
No olvide mirar también el atributo geometry.index
, si su geometría lo tiene. Eso debería arreglar su geometría para renderizar con el menor número común de atributos. Consulte aquí para obtener información sobre setDrawRange