我正试图将我的threejs项目分解为较小的模块,但现在很艰难。以这个功能为例:
var updateCamera = (function() {
var euler = new THREE.Euler( 0, 0, 0, 'YXZ' );
return function() {
euler.x = motion.rotation.x;
euler.y = motion.rotation.y;
camera.quaternion.setFromEuler( euler );
camera.position.copy( motion.position );
camera.position.y += 10.0;
};
})();
可以说我想将此updateCamera函数分解为自己的文件并导入。因为它是自动执行的,所以我对如何使用感到困惑。有人可以帮我吗?
最佳答案
而不是分配给(global?)updateCamera
变量,而是使用(默认)导出。您可以删除整个IIFE,因为每个模块都有自己的作用域。因此,即使在模块顶层,euler
也将不可访问且是静态的。
您可能还想显式声明对Three.js的依赖关系,而不是依赖全局变量。
// updateCamera.js
import { Euler } from 'three';
var euler = new THREE.Euler( 0, 0, 0, 'YXZ' );
export default function updateCamera(camera, motion) {
euler.x = motion.rotation.x;
euler.y = motion.rotation.y;
camera.quaternion.setFromEuler( euler );
camera.position.copy( motion.position );
camera.position.y += 10.0;
}
然后,您可以在其他模块中使用它
// main.js
import updateCamera from './updateCamera';
…
updateCamer(camera, motion);
注意,
camera
和motion
应该在此处作为参数传递。再说一次,不要依赖全局变量。如果您不想将它们传递到任何地方,也可以创建一个导出它们的模块,并从中进行操作import {camera, motion} from './globals';