function createWindAura() { const group = new THREE.Group(); const windGeo = new THREE.CapsuleGeometry(0.05, 1, 4, 4); for(let i = 0; i < 40; i++) { const windMat = new THREE.MeshBasicMaterial({ color: 0xeeeeee, transparent: true, opacity: 0.5 }); const w = new THREE.Mesh(windGeo, windMat); // Slant the wind w.rotation.z = Math.PI / 4; w.position.set( (Math.random() - 0.5) * 10, Math.random() * 8, (Math.random() - 0.5) * 5 ); // Custom logic for movement in the animate loop w.userData = { resetX: w.position.x + 5, resetY: w.position.y + 5 }; group.add(w); } return group; } How to implement the "Fade & Move" Logic In your main animate() loop, you need to tell these particles how to move. Use this logic to handle the wind fading and the fire rising: JavaScript function animateAuras() { activeAuraGroup.children.forEach(aura => { aura.children.forEach(p => { // Logic for Wind if (equippedAuraName === "Windy") { p.position.x -= 0.2; // Move left p.position.y -= 0.2; // Move down (slanted) // Fade out as it moves p.material.opacity = (p.position.x + 5) / 10; if (p.position.x < -5) { p.position.x = 5; p.position.y = 8; } } // Logic for Inferno if (equippedAuraName === "Inferno") { p.position.y += 0.05; // Rise like smoke p.rotation.y += 0.1; if (p.position.y > 5) p.position.y = 0; } }); }); }