Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将THREE.js脚本封装到类中?_Javascript_Three.js - Fatal编程技术网

Javascript 如何将THREE.js脚本封装到类中?

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

我有一个相当复杂的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.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
<