Javascript 如何将THREE.js脚本封装到类中?
我有一个相当复杂的Three.JS脚本,它显示了一个人的3d身体,你可以在那里选择片段Javascript 如何将THREE.js脚本封装到类中?,javascript,three.js,Javascript,Three.js,我有一个相当复杂的Three.JS脚本,它显示了一个人的3d身体,你可以在那里选择片段 var container; var camera; var scene; var renderer; var mouse; var raycaster; var controls; var hemiLight; function init(containerID) { // Will setup all needed variables container = document.getEl
var container;
var camera;
var scene;
var renderer;
var mouse;
var raycaster;
var controls;
var hemiLight;
function init(containerID) {
// Will setup all needed variables
container = document.getElementById(containerID);
camera = new THREE.PerspectiveCamera(1, window.innerWidth / window.innerHeight, 1, 2000);
camera.position.z = 400;
// Scene
scene = new THREE.Scene();
hemiLight = new THREE.HemisphereLight(0xCC9966, 0xCC9966, 1);
hemiLight.position.set(0, 500, 0);
scene.add(hemiLight);
// Camera behaviour
controls = new THREE.TrackballControls(camera);
controls.rotateSpeed = 5.0;
controls.zoomSpeed = 5;
controls.panSpeed = 2;
controls.noZoom = false;
controls.noPan = false;
controls.staticMoving = true;
controls.dynamicDampingFactor = 0.3;
controls.enabled = false;
// Model
var onProgress = function ( xhr ) {
// Only necessary if the obj-file-size is very large
};
var onError = function ( xhr ) {
// Something went wrong during loading obj-file
console.log("Error, please report to the devs");
};
THREE.Loader.Handlers.add(/\.dds$/i, new THREE.DDSLoader());
var loader = new THREE.OBJMTLLoader();
// Load the 3D Files
loader.load( 'objects/head.obj', 'images/head.mtl', function ( object ) {
prepareObj( object, "head" );
}, onProgress, onError );
loader.load( 'objects/torso.obj', 'images/torso.mtl', function ( object ) {
prepareObj( object, "torso" );
}, onProgress, onError );
loader.load( 'objects/arm_left.obj', 'images/arm_left.mtl', function ( object ) {
prepareObj( object, "arm_left" );
}, onProgress, onError );
loader.load( 'objects/arm_right.obj', 'images/arm_right.mtl', function ( object ) {
prepareObj( object, "arm_right" );
}, onProgress, onError );
loader.load( 'objects/leg_right.obj', 'images/leg_right.mtl', function ( object ) {
prepareObj( object, "leg_right" );
}, onProgress, onError );
loader.load( 'objects/leg_left.obj', 'images/leg_left.mtl', function ( object ) {
prepareObj( object, "leg_left" );
}, onProgress, onError );
renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(500, 500);
renderer.setClearColor(0xffffff, 1);
container.appendChild(renderer.domElement);
document.addEventListener("mouseover", function(e) {
checkBodyActive(e);
}, false);
document.addEventListener("click", onClick, false);
window.addEventListener("resize", onWindowResize, false);
raycaster = new THREE.Raycaster();
mouse = new THREE.Vector2();
camera.aspect = 1;
camera.updateProjectionMatrix();
renderer.render(scene, camera);
animate();
}
function checkBodyActive(event) {
// Checks, if the current body is active
if(document.elementFromPoint(event.clientX, event.clientY) == renderer.domElement) {
animate();
controls.enabled = true;
}
else {
controls.enabled = false;
}
}
function changeTexture(part) {
// Will change the texture of the selected body part
scene.children[part].traverse( function ( child ) {
if (child instanceof THREE.Mesh) {
// Texture must be changed
if(scene.children[part].children[0].children[0].material.map.sourceFile=="images/texture2.jpg") {
// Texture2 is already equipped, unequip it
child.material.map = THREE.ImageUtils.loadTexture("images/texture.jpg");
} else {
// Equip texture2
child.material.map = THREE.ImageUtils.loadTexture("images/texture2.jpg");
}
child.material.needsUpdate = true;
}
});
}
function onWindowResize() {
// This function will make sure that all proportions are correct after resizing the window
camera.aspect = 1;
camera.updateProjectionMatrix();
}
function onClick(event) {
// Mouse-Click-Event, used to check if intersects where hit
//event.preventDefault();
mouse.x = (getOffset(event).x / renderer.domElement.width) * 2 - 1;
mouse.y = - (getOffset(event).y / renderer.domElement.height) * 2 + 1;
// Create intersect raycasting
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children, true);
if(intersects.length) {
var name = intersects[0].object.parent.parent.name;
for(var j = 0; j < scene.children.length; j++ ) {
if(scene.children[j].name == name) {
// Found same model as the intersects, change texture
changeTexture(j);
}
}
}
}
function getOffset(event) {
// Calcs layerX / layerY for the clicked element
var el = event.target,
x = 0,
y = 0;
while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
x += el.offsetLeft - el.scrollLeft;
y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
x = event.clientX - x;
y = event.clientY - y;
return { x: x, y: y };
}
function prepareObj(object, name){
// General configuration of the .obj files while loading
object.position.y = -3;
object.traverse(function(child) {
if(child instanceof THREE.Mesh) {
child.material.map = THREE.ImageUtils.loadTexture("images/texture.jpg");
child.material.needsUpdate = true;
}
});
object.name = name;
scene.add(object);
}
function animate() {
// On every frame we need to calculate the new camera position
// and have it look exactly at the center of our scene.
requestAnimationFrame(animate);
controls.update();
camera.lookAt(scene.position);
renderer.render(scene, camera);
}
var容器;
var摄像机;
var场景;
var渲染器;
var小鼠;
var raycaster;
风险值控制;
变异半光;
函数init(containerID){
//将设置所有需要的变量
container=document.getElementById(containerID);
摄像头=新的三个透视摄像头(1,window.innerWidth/window.innerHeight,12000);
摄像机位置z=400;
//场面
场景=新的三个。场景();
半球光=新的三个半球光(0xCC9966,0xCC9966,1);
半光位置设置(0500,0);
场景。添加(半光);
//摄像机行为
控件=新的三个轨迹球控件(摄像头);
controls.rotateSpeed=5.0;
controls.zoomSpeed=5;
控制。速度=2;
controls.noZoom=false;
controls.noPan=false;
controls.staticMoving=true;
controls.dynamicDampingFactor=0.3;
controls.enabled=false;
//模型
var onProgress=函数(xhr){
//仅当obj文件大小非常大时才需要
};
var onError=函数(xhr){
//加载obj文件时出错
log(“错误,请向开发人员报告”);
};
添加(/\.dds$/i,新的三个.DDSLoader());
var loader=new THREE.OBJMTLLoader();
//加载三维文件
loader.load('objects/head.obj','images/head.mtl',函数(object){
prepareObj(对象,“头部”);
},onProgress,onError);
装载机。装载('对象/躯干.obj','图像/躯干.mtl',功能(对象){
准备BJ(物体,“躯干”);
},onProgress,onError);
loader.load('objects/arm\u left.obj','images/arm\u left.mtl',函数(object){
prepareObj(对象,“左手臂”);
},onProgress,onError);
loader.load('objects/arm\u right.obj','images/arm\u right.mtl',函数(object){
prepareObj(对象,“右臂”);
},onProgress,onError);
loader.load('objects/leg\u right.obj','images/leg\u right.mtl',函数(object){
prepareObj(对象,“右腿”);
},onProgress,onError);
loader.load('objects/leg_left.obj','images/leg_left.mtl',函数(object){
prepareObj(对象,“左腿”);
},onProgress,onError);
renderer=new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
设置大小(500500);
setClearColor(0xffffff,1);
container.appendChild(renderer.domeElement);
文件.添加的列表器(“鼠标悬停”,函数(e){
checkBodyActive(e);
},假);
document.addEventListener(“单击”,onClick,false);
addEventListener(“resize”,onWindowResize,false);
raycaster=new-THREE.raycaster();
鼠标=新的3.Vector2();
camera.aspect=1;
camera.updateProjectMatrix();
渲染器。渲染(场景、摄影机);
制作动画();
}
功能检查激活(事件){
//检查当前主体是否处于活动状态
if(document.elementFromPoint(event.clientX,event.clientY)==renderer.domeElement){
制作动画();
controls.enabled=true;
}
否则{
controls.enabled=false;
}
}
函数变换纹理(部分){
//将更改选定身体部位的纹理
scene.children[part].transverse(函数(child)){
if(三个.Mesh的子实例){
//纹理必须改变
if(scene.children[part].children[0].children[0].material.map.sourceFile==“images/texture2.jpg”){
//Texture2已装备,请取消装备
child.material.map=THREE.ImageUtils.loadTexture(“images/texture.jpg”);
}否则{
//装备纹理2
child.material.map=THREE.ImageUtils.loadTexture(“images/texture2.jpg”);
}
child.material.needsUpdate=true;
}
});
}
函数onWindowResize(){
//此功能将确保调整窗口大小后所有比例都正确
camera.aspect=1;
camera.updateProjectMatrix();
}
函数onClick(事件){
//鼠标单击事件,用于检查命中位置是否相交
//event.preventDefault();
mouse.x=(getOffset(event.x/renderer.domElement.width)*2-1;
mouse.y=-(getOffset(event.y/renderer.domElement.height)*2+1;
//创建相交光线投射
raycaster.setFromCamera(鼠标、相机);
var intersects=raycaster.intersectObjects(scene.children,true);
if(与长度相交){
变量名称=相交[0]。object.parent.parent.name;
对于(var j=0;j
<