Estoy codificando una simulación/animación de three.js y me cuesta entender por qué funciona la codificación de un índice de matriz para una instanciación de clase personalizada ("physicsObjects[4]"), pero uso la variable i en un bucle for ("physicsObjects[ i]") no lo hace.
Cuando tiene éxito, updateTail() ajusta el atributo de posición de línea de three.js, y luego debo configurar needsUpdate = true como se muestra en la documentación de Three.js para volver a dibujar. En el primer ejemplo, funciona correctamente (aunque solo para UNO de los objetos, 4).
physicsObjects[i] tiene una propiedad .tail que es TRES.LineSegments(geometry,material)
for (let i = 0; i < physicsObjects.length; i++) { physicsObjects[4].updateTail() physicsObjects[4].tail.geometry.attributes.position.needsUpdate = true }También funciona para 2 de mis objetos físicos si hago esto.
for (let i = 0; i < physicsObjects.length; i++) { physicsObjects[4].updateTail() physicsObjects[4].tail.geometry.attributes.position.needsUpdate = true physicsObjects[7].updateTail() physicsObjects[7].tail.geometry.attributes.position.needsUpdate = true }Pero si quiero iterar, NO funciona. ¿La única diferencia es que estoy indexando con 'i' en lugar de un índice codificado?
for (let i = 0; i < physicsObjects.length; i++) { physicsObjects[i].updateTail() physicsObjects[i].tail.geometry.attributes.position.needsUpdate = true }Este es el error que recibo.
Uncaught TypeError: Cannot read properties of undefined (reading 'geometry') at animate (app.js:159:32)Aquí está mi bucle de dibujo animate () completo como referencia:
function animate() { //Frame Start up requestAnimationFrame(animate); //Force Application if (frameIndex % 1 == 0) { for (let i = 0; i < physicsObjects.length; i++) { for (let j = 0; j < physicsObjects.length; j++) { if (i !== j) { let f = physicsObjects[i].attract(physicsObjects[j]) physicsObjects[i].applyForce(f) physicsObjects[i].updatePhysics() physicsObjects[i].updateGeometry() } } } } //Testing adding a tail to the objects for (let i = 0; i < physicsObjects.length; i++) { physicsObjects[4].updateTail() physicsObjects[4].tail.geometry.attributes.position.needsUpdate = true } const time = performance.now(); controls.update(time, prevTime) renderer.render(scene, camera); stats.update() //Frame Shut Down prevTime = time; }¿Por qué no puedo iterar con un bucle?