Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

170
Vistas
El objeto se convierte en número después de la llamada a la función - Javascript

Estoy usando Three.js para crear una animación, pero mi función animate() no funciona correctamente. Código simplificado a continuación:

 let obj; let camera = new THREE.PerspectiveCamera(fov, asp, near, far); let scene = new THREE.Scene(); const loader = new THREE.GLTFLoader(); async function init() { obj = await loader.loadAsync("./public/modelo/scene.gltf"); scene.add(obj.scene); animate(obj.scene.children[0]); renderer.render(scene, camera); function animate(objeto){ console.log(objeto); requestAnimationFrame(animate); objeto.rotation.z += 0.005; renderer.render(scene, camera); } } init();

La función funciona para la primera llamada, pero después de eso puedo ver que las cosas van mal a través de mi instrucción console.log() . En la primera ejecución de animate() , la línea imprime el objeto, como se esperaba. Pero, en todas las llamadas subsiguientes, la instrucción solo devuelve un número de coma flotante que aumenta considerablemente con cada llamada sucesiva. Revisé y me aseguré de que el objeto estuviera intacto al final de la primera llamada a la función, así que no estoy seguro de qué está pasando aquí. ¿Alguna sugerencia?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El problema está en esta línea en su código:

 requestAnimationFrame(animate);

De la documentación de MDN para requestAnimationFrame , la devolución de llamada que pasa, aquí animate , es:

La función para llamar cuando sea el momento de actualizar su animación para el próximo repintado. A la función de devolución de llamada se le pasa un solo argumento, un DOMHighResTimeStamp similar al devuelto por performance.now(), que indica el momento en el que requestAnimationFrame() comienza a ejecutar funciones de devolución de llamada.

En otras palabras, se llama a su animate con una marca de tiempo, que de alguna manera me imagino que se comporta como un número (no estoy personalmente familiarizado con lo que es DOMHighResTimeStamp ) y explica lo que está viendo. Ciertamente no lo llamarán con su "objeto" como argumento.

Para asegurarse de eso, simplemente pase como devolución de llamada una función llamará a animate con el argumento correcto. Reemplace la llamada anterior con

 requestAnimationFrame(() => { animate(objeto); });

EDITAR: o como sugiere @Bergi, podemos evitar la necesidad de un argumento simplemente definiendo objeto fuera de animate , en la función de init . Dado que siempre llamas a animate con este mismo argumento, no hay necesidad de pasarlo específicamente, por lo que tu código puede ser simplemente:

 async function init() { obj = await loader.loadAsync("./public/modelo/scene.gltf"); const objeto = obj.scene.children[0]; scene.add(obj.scene); animate(); renderer.render(scene, camera); function animate(){ console.log(objeto); requestAnimationFrame(animate); objeto.rotation.z += 0.005; renderer.render(scene, camera); } }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda