Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 三个js:简化网格以优化性能_Performance_Three.js_Mesh - Fatal编程技术网

Performance 三个js:简化网格以优化性能

Performance 三个js:简化网格以优化性能,performance,three.js,mesh,Performance,Three.js,Mesh,我有一个网格(图1)和一个平行六面体,我在场景中添加这两个对象的相交结果,然后我沿着网格移动平行六面体,重复相同的过程“剪切”我的网格,并获得网格的分解视图(图2) 问题是处理时间超过2分钟。。。我曾尝试使用MeshMixer减少网格,但这还不够。。。有人有别的想法吗 函数FirstCut(){ var场景、摄影机、渲染器、控件; //stl加载程序来自https://threejs.org/examples/webgl_loader_stl.html //cf示例https://stemk

我有一个网格(图1)和一个平行六面体,我在场景中添加这两个对象的相交结果,然后我沿着网格移动平行六面体,重复相同的过程“剪切”我的网格,并获得网格的分解视图(图2)

问题是处理时间超过2分钟。。。我曾尝试使用MeshMixer减少网格,但这还不够。。。有人有别的想法吗

函数FirstCut(){
var场景、摄影机、渲染器、控件;
//stl加载程序来自https://threejs.org/examples/webgl_loader_stl.html
//cf示例https://stemkoski.github.io/Three.js/CSG.html
//带obj
init();
制作动画();
函数init(){
场景=新的三个。场景();
scene.background=新的三种颜色(0xeeee);
摄像机=新的三个透视摄像机(75800/50012000);
//摄像机位置设置(50500,0);
摄像机位置x=50;
摄像机位置y=500;
摄像机位置z=0;
//var axeX=新的三个向量3(1,0,0);
//摄像机。旋转轴(axeX,-1);
摄像机。注视(新的3。矢量3(0500,0));
控制装置=新的三个控制装置(摄像机);
//最小距离和最大距离的选择是在le fait tourner上选择不同的菲力牛排
controls.minDistance=0;
controls.maxDistance=1000;
//场面
//var环境光=新的三个环境光(0x101030);
//场景。添加(环境光);
//添加(新的三个.GridHelper(1000,20));
//var directionalLight=新的三个方向灯(0xffffff,1);
//方向灯位置设置(0,1,0);
//场景。添加(方向光);
var widthH=parseInt(document.getElementById(“wdthH”).value)| | 0;//H表示头部
var widthtt=parseInt(document.getElementById(“wdthT”).value)| | 0;//T表示尾部
var height=parseInt(document.getElementById(“hght”).value)| | 0;//侧翼
//巴维酒店
var EmportePieceH=新的三箱几何结构(300,60,宽度H);
var EmportePieceT=新的三箱几何体(300,60,widthT);
var EmportePieceB=新的三箱几何结构(高度60520);
var paveMaterial=new THREE.MeshBasicMaterial({线框:true});
//网格和材料的création
var EmportePieceMeshH=新的三点网格(EmportePieceH,铺装材料);
var emportepoitemesht=新的三个网格(emportepoitet,铺装材料);
var paveMeshB=新的三个网格(EmportePieceB,paveMaterial);
var zH=247——宽度h/2;
var zT=-247+宽度t/2;
位置集(0,30,zH);
位置设置(0,30,zT);
铺装网位置设置(-95+高度/2,30,0);
var EmportePieceBSPH=新的三个BSP(emportePieceMesh);
var emportepiebspt=新的三个bsp(emportepiemesht);
var paveBSPB=新的三个BSP(paveMeshB);
//场景。添加(emportePieceMesh);
//场景。添加(EmportePieceMeshT);
//场景.添加(paveMeshB);
//质地
var-manager=new-THREE.LoadingManager();
manager.onProgress=功能(项目、已加载、总计){
控制台日志(项目、已加载、总计);
};
var texture=new THREE.texture();
var onProgress=函数(xhr){
if(xhr.长度可计算){
var percentComplete=xhr.loaded/xhr.total*100;
log(Math.round(完成百分比,2)+'%download');
}
};
var onError=函数(xhr){
};
var loader=new THREE.ImageLoader(管理器);
loader.load('/Scan/filet_1kg500-resposition-reduit_material_0.jpg',函数(图){
纹理.图像=图像;
texture.needsUpdate=true;
});
var width=parseInt(document.getElementById(“wdth”).value)| 0;
//巴维酒店
var paveGeom=新的三箱几何结构(250、250、宽度);
var paveMaterial=new THREE.MeshBasicMaterial({线框:true});
//阿维克材料网格化
var paveMesh=新的三个网格(paveGeom、paveMaterial);
var z0=-247+宽度H;
铺装网位置设置(0,0,z0);
var paveBSP=新的三个BSP(paveMesh);
//场景。添加(铺装网格);
//卷表
var tabVolumes=新数组();
//模型
var装入器=新的三个。对象装入器(管理器);
loader.load('/Scan/filet_1kg500-resposition-reduit.obj',函数(对象){
遍历(函数(子对象){
if(三个.Mesh的子实例){
child.material.map=纹理;
var geo=new THREE.Geometry().fromBufferGeometry(child.Geometry);
var filetMaterial=new THREE.MeshBasicMaterial({color:0xff0000,线框:true});
var filetMesh=new THREE.Mesh(geo,filetmatary);
//添加(filetMesh);
变量newBSPH、newBSPT、newBSPB、newBSP2、newBSP1、filletBSP
var filetBSP=新的三个BSP(filetMesh);
newBSPH=filetBSP.intersect(emportepiebsph);
newBSPT=filetBSP.intersect(EmportePieceBSPT);
newBSPB=filetBSP.intersect(paveBSPB);
newBSP2=filetBSP.subtract(EmportePieceBSPH);
newBSP1=newBSP2.减法(paveBSPB);
filletBSP=newbs1.subtract(EmportePieceBSPT);
////////////////////减去//////////////////////////////
var newFilet=new THREE.Geometry();
newFilet=filletBSP.toGeometry();
var newFilletMesh=new THREE.Mesh(newFilet,new THREE.MeshBasicMaterial({map:texture}));
newFilletMesh.position.set(0,0,0);
/////////
function FirstCut() {

    var scene, camera, renderer, controls;

    //stl loader from https://threejs.org/examples/webgl_loader_stl.html
    // cf example https://stemkoski.github.io/Three.js/CSG.html

    //with obj

    init();
    animate();

    function init() {

        scene = new THREE.Scene();
        scene.background = new THREE.Color(0xeeeeee);

        camera = new THREE.PerspectiveCamera(75, 800 / 500, 1, 2000);

        //camera.position.set(50, 500, 0);
        camera.position.x = 50;
        camera.position.y = 500;
        camera.position.z = 0;

        //var axeX = new THREE.Vector3(1, 0, 0);
        //camera.rotateOnAxis(axeX, -1);
        camera.lookAt(new THREE.Vector3(0, 500, 0));

        controls = new THREE.OrbitControls(camera);
        //les valeurs de min and max distance sont choisies pour que le filet ne disparaisse pas quand on le fait tourner
        controls.minDistance = 0;
        controls.maxDistance = 1000;
        //scene
        //var ambient = new THREE.AmbientLight(0x101030);
        //scene.add(ambient);
        //scene.add(new THREE.GridHelper(1000, 20));
        //var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
        //directionalLight.position.set(0, 1, 0);
        //scene.add(directionalLight);

        var widthH = parseInt(document.getElementById("wdthH").value) || 0; // H for Head
        var widthT = parseInt(document.getElementById("wdthT").value) || 0; // T for tail
        var height = parseInt(document.getElementById("hght").value) || 0;  // flank

        //création du pavé
        var EmportePieceH = new THREE.BoxGeometry(300, 60, widthH);
        var EmportePieceT = new THREE.BoxGeometry(300, 60, widthT);
        var EmportePieceB = new THREE.BoxGeometry(height, 60, 520);

        var paveMaterial = new THREE.MeshBasicMaterial({ wireframe: true });

        // création du meshage et material
        var EmportePieceMeshH = new THREE.Mesh(EmportePieceH, paveMaterial);
        var EmportePieceMeshT = new THREE.Mesh(EmportePieceT, paveMaterial);
        var paveMeshB = new THREE.Mesh(EmportePieceB, paveMaterial);

        var zH = 247 - widthH / 2;
        var zT = -247 + widthT / 2;
        EmportePieceMeshH.position.set(0, 30, zH);
        EmportePieceMeshT.position.set(0, 30, zT);
        paveMeshB.position.set(-95 + height / 2, 30, 0);
        var EmportePieceBSPH = new ThreeBSP(EmportePieceMeshH);
        var EmportePieceBSPT = new ThreeBSP(EmportePieceMeshT);
        var paveBSPB = new ThreeBSP(paveMeshB);

        //scene.add(EmportePieceMeshH);
        //scene.add(EmportePieceMeshT);
        //scene.add(paveMeshB);


        // texture
        var manager = new THREE.LoadingManager();
        manager.onProgress = function (item, loaded, total) {
            console.log(item, loaded, total);
        };
        var texture = new THREE.Texture();
        var onProgress = function (xhr) {
            if (xhr.lengthComputable) {
                var percentComplete = xhr.loaded / xhr.total * 100;
                console.log(Math.round(percentComplete, 2) + '% downloaded');
            }
        };
        var onError = function (xhr) {
        };

        var loader = new THREE.ImageLoader(manager);
        loader.load('/Scan/filet_1kg500-reposition-reduit_material_0.jpg', function (image) {
            texture.image = image;
            texture.needsUpdate = true;
        });

        var width = parseInt(document.getElementById("wdth").value) || 0;

        //création du pavé
        var paveGeom = new THREE.BoxGeometry(250, 250, width);
        var paveMaterial = new THREE.MeshBasicMaterial({ wireframe: true });

        // création du meshage parallélépipède avec material
        var paveMesh = new THREE.Mesh(paveGeom, paveMaterial);

        var z0 = -247 + widthH;
        paveMesh.position.set(0, 0, z0);

        var paveBSP = new ThreeBSP(paveMesh);
        //scene.add(paveMesh);

        //tableau des volumes
        var tabVolumes = new Array();

        // model
        var loader = new THREE.OBJLoader(manager);
        loader.load('/Scan/filet_1kg500-reposition-reduit.obj', function (object) {
            object.traverse(function (child) {
                if (child instanceof THREE.Mesh) {
                    child.material.map = texture;

                    var geo = new THREE.Geometry().fromBufferGeometry(child.geometry);
                    var filetMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true });
                    var filetMesh = new THREE.Mesh(geo, filetMaterial);
                    //scene.add(filetMesh);
                    var newBSPH, newBSPT, newBSPB, newBSP2, newBSP1, filletBSP
                    var filetBSP = new ThreeBSP(filetMesh);

                    newBSPH = filetBSP.intersect(EmportePieceBSPH);
                    newBSPT = filetBSP.intersect(EmportePieceBSPT);
                    newBSPB = filetBSP.intersect(paveBSPB);
                    newBSP2 = filetBSP.subtract(EmportePieceBSPH);
                    newBSP1 = newBSP2.subtract(paveBSPB);
                    filletBSP = newBSP1.subtract(EmportePieceBSPT);

                    ////////////////////subtract//////////////////////////////

                    var newFilet = new THREE.Geometry();
                    newFilet = filletBSP.toGeometry();
                    var newFilletMesh = new THREE.Mesh(newFilet, new THREE.MeshBasicMaterial({ map: texture }));
                    newFilletMesh.position.set(0, 0, 0);

                    ///////////////////////////////////création morceaux découpés///////////////////////////////////////////

                    var HeadFillet = new THREE.Geometry();
                    var TailFillet = new THREE.Geometry();
                    var degraissageFillet = new THREE.Geometry();
                    HeadFillet = newBSPH.toGeometry();
                    TailFillet = newBSPT.toGeometry();
                    degraissageFillet = newBSPB.toGeometry();


                    /////////////////////////////////calcul des volumes des 1ers morceaux/////////////////////////////////////////

                    if (widthH != 0) {
                        tabVolumes[0] = calculateVolume2(HeadFillet);
                    } else { tabVolumes[0] = 0;}

                    if (widthT != 0) {
                        //alert(tabVolumes[0]);
                        tabVolumes[1] = calculateVolume2(TailFillet);
                    } else { tabVolumes[1] = 0; }

                    if (height != 0) {
                        tabVolumes[2] = calculateVolume2(degraissageFillet);
                    } else { tabVolumes[2] = 0; }

                    var ind = 3;

                    var HeadFilletMesh = new THREE.Mesh(HeadFillet, new THREE.MeshBasicMaterial({ map: texture }));
                    var TailFilletMesh = new THREE.Mesh(TailFillet, new THREE.MeshBasicMaterial({ map: texture }));
                    var degraissageFilletMesh = new THREE.Mesh(degraissageFillet, new THREE.MeshBasicMaterial({ map: texture }));

                    HeadFilletMesh.position.set(0, 0, 20);
                    degraissageFilletMesh.position.set(-20, 0, 0);
                    TailFilletMesh.position.set(0, 0, -20);
                    scene.add(HeadFilletMesh);
                    scene.add(TailFilletMesh);
                    scene.add(degraissageFilletMesh);

                    //scene.add(newFilletMesh);
                    var cloneHeadFilletMesh = HeadFilletMesh.clone();
                    var cloneTailFilletMesh = TailFilletMesh.clone();
                    var clonedegraissageFilletMesh = degraissageFilletMesh.clone();

                    var mesh_decoupe = new THREE.Object3D;
                    mesh_decoupe.add(cloneHeadFilletMesh);
                    mesh_decoupe.add(cloneTailFilletMesh);
                    mesh_decoupe.add(clonedegraissageFilletMesh);

                    if (width != 0) {
                        var paveGeom = new THREE.BoxGeometry(300, 300, width);
                        var paveMaterial = new THREE.MeshBasicMaterial({ wireframe: true });


                        var fillet2BSP = new ThreeBSP(newFilletMesh);

                        var intersectionPave = new THREE.Geometry();
                        intersectionPave = fillet2BSP.intersect(paveBSP);

                        var geometryPave = new THREE.Geometry();
                        geometryPave = intersectionPave.toGeometry();
                        var newMesh = new THREE.Mesh(geometryPave, new THREE.MeshBasicMaterial({ map: texture }));


                        //alert(geometryPave.faces.length);

                        while (geometryPave.faces.length != 0) {


                            var z = paveMesh.position.z + width + 5;

                            paveMesh.position.set(0, 0, z);
                            paveBSP = new ThreeBSP(paveMesh);
                            //scene.add(paveMesh);

                            fillet2BSP = new ThreeBSP(newFilletMesh);

                            intersectionPave = filletBSP.intersect(paveBSP);
                            geometryPave = intersectionPave.toGeometry();

                            tabVolumes[ind] = calculateVolume2(geometryPave);
                            ind = ind + 1;

                            var newMesh = new THREE.Mesh(geometryPave, new THREE.MeshBasicMaterial({ map: texture }));
                            newMesh.position.set(0, 0, newMesh.position.z);
                            scene.add(newMesh);

                            var meshSave = newMesh.clone();
                            mesh_decoupe.add(meshSave);
                        }

                        document.body.style.cursor = '';

                    } else {
                        scene.add(newFilletMesh);
                        document.body.style.cursor = '';


                        tabVolumes[3] = 0;
                        tabVolumes[4] = calculateVolume2(newFilet);
                    }



                    //    }
                    //}
                    //else {
                    //    scene.add(newFilletMesh);

                    //    tabVolumes[ind] = calculateVolume2(newFilet);
                    //}


                    //alert(calculateVolume2(newBSP.toGeometry()));

                    //afficher les volumes dans la textarea


                    var txtVolume = document.getElementById("txtVolume");
                    txtVolume.value = tabVolumes.join("\n");

                    //var exporter = new THREE.OBJExporter();
                    //var result = exporter.parse(mesh_decoupe);
                    //var blob = new Blob([result], { type: 'text/plain' });
                    //saveAs(blob, 'dechets.obj');

                }
            });
            //scene.add(object);

        }, onProgress, onError);

        renderer = new THREE.WebGLRenderer();
        renderer.setSize(800, 500, false);

        document.getElementById('canvas3D').innerHTML = "";
        document.getElementById('canvas3D').appendChild(renderer.domElement);
    }
        function animate() {

            requestAnimationFrame(animate);
            camin();
            renderer.render(scene, camera);


        }

        function camin() {
            camera.position.y -= .1;
        }


            function volumeOfT(p1, p2, p3) {
            var v321 = p3.x * p2.y * p1.z;
            var v231 = p2.x * p3.y * p1.z;
            var v312 = p3.x * p1.y * p2.z;
            var v132 = p1.x * p3.y * p2.z;
            var v213 = p2.x * p1.y * p3.z;
            var v123 = p1.x * p2.y * p3.z;
            return (-v321 + v231 + v312 - v132 - v213 + v123) / 6.0;
        }

        function calculateVolume2(object) {
            var volumes = 0.0;

            for (var i = 0; i < object.faces.length; i++) {
                var Pi = object.faces[i].a;
                var Qi = object.faces[i].b;
                var Ri = object.faces[i].c;
                //alert (Pi);

                var P = new THREE.Vector3(object.vertices[Pi].x, object.vertices[Pi].y, object.vertices[Pi].z);
                //alert(object.vertices[Pi].x);
                var Q = new THREE.Vector3(object.vertices[Qi].x, object.vertices[Qi].y, object.vertices[Qi].z);
                var R = new THREE.Vector3(object.vertices[Ri].x, object.vertices[Ri].y, object.vertices[Ri].z);
                volumes += volumeOfT(P, Q, R);
            }

            return Math.abs(volumes);

      }
}



function FirstCut() {

    var scene, camera, renderer, controls;

    //stl loader from https://threejs.org/examples/webgl_loader_stl.html
    // cf example https://stemkoski.github.io/Three.js/CSG.html

    //with obj

    init();
    animate();

    function init() {

        scene = new THREE.Scene();
        scene.background = new THREE.Color(0xeeeeee);

        camera = new THREE.PerspectiveCamera(75, 800 / 500, 1, 2000);

        //camera.position.set(50, 500, 0);
        camera.position.x = 50;
        camera.position.y = 500;
        camera.position.z = 0;

        //var axeX = new THREE.Vector3(1, 0, 0);
        //camera.rotateOnAxis(axeX, -1);
        camera.lookAt(new THREE.Vector3(0, 500, 0));

        controls = new THREE.OrbitControls(camera);
        //les valeurs de min and max distance sont choisies pour que le filet ne disparaisse pas quand on le fait tourner
        controls.minDistance = 0;
        controls.maxDistance = 1000;
        //scene
        //var ambient = new THREE.AmbientLight(0x101030);
        //scene.add(ambient);
        //scene.add(new THREE.GridHelper(1000, 20));
        //var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
        //directionalLight.position.set(0, 1, 0);
        //scene.add(directionalLight);

        var widthH = parseInt(document.getElementById("wdthH").value) || 0; // H for Head
        var widthT = parseInt(document.getElementById("wdthT").value) || 0; // T for tail
        var height = parseInt(document.getElementById("hght").value) || 0;  // flank

        //création du pavé
        var EmportePieceH = new THREE.BoxGeometry(300, 60, widthH);
        var EmportePieceT = new THREE.BoxGeometry(300, 60, widthT);
        var EmportePieceB = new THREE.BoxGeometry(height, 60, 520);

        var paveMaterial = new THREE.MeshBasicMaterial({ wireframe: true });

        // création du meshage et material
        var EmportePieceMeshH = new THREE.Mesh(EmportePieceH, paveMaterial);
        var EmportePieceMeshT = new THREE.Mesh(EmportePieceT, paveMaterial);
        var paveMeshB = new THREE.Mesh(EmportePieceB, paveMaterial);

        var zH = 247 - widthH / 2;
        var zT = -247 + widthT / 2;
        EmportePieceMeshH.position.set(0, 30, zH);
        EmportePieceMeshT.position.set(0, 30, zT);
        paveMeshB.position.set(-95 + height / 2, 30, 0);
        var EmportePieceBSPH = new ThreeBSP(EmportePieceMeshH);
        var EmportePieceBSPT = new ThreeBSP(EmportePieceMeshT);
        var paveBSPB = new ThreeBSP(paveMeshB);

        //scene.add(EmportePieceMeshH);
        //scene.add(EmportePieceMeshT);
        //scene.add(paveMeshB);


        // texture
        var manager = new THREE.LoadingManager();
        manager.onProgress = function (item, loaded, total) {
            console.log(item, loaded, total);
        };
        var texture = new THREE.Texture();
        var onProgress = function (xhr) {
            if (xhr.lengthComputable) {
                var percentComplete = xhr.loaded / xhr.total * 100;
                console.log(Math.round(percentComplete, 2) + '% downloaded');
            }
        };
        var onError = function (xhr) {
        };

        var loader = new THREE.ImageLoader(manager);
        loader.load('/Scan/filet_1kg500-reposition-reduit_material_0.jpg', function (image) {
            texture.image = image;
            texture.needsUpdate = true;
        });

        var width = parseInt(document.getElementById("wdth").value) || 0;

        //création du pavé
        var paveGeom = new THREE.BoxGeometry(250, 250, width);
        var paveMaterial = new THREE.MeshBasicMaterial({ wireframe: true });

        // création du meshage parallélépipède avec material
        var paveMesh = new THREE.Mesh(paveGeom, paveMaterial);

        var z0 = -247 + widthH;
        paveMesh.position.set(0, 0, z0);

        var paveBSP = new ThreeBSP(paveMesh);
        //scene.add(paveMesh);

        //tableau des volumes
        var tabVolumes = new Array();

        // model
        var loader = new THREE.OBJLoader(manager);
        loader.load('/Scan/filet_1kg500-reposition-reduit.obj', function (object) {
            object.traverse(function (child) {
                if (child instanceof THREE.Mesh) {
                    child.material.map = texture;

                    var geo = new THREE.Geometry().fromBufferGeometry(child.geometry);
                    var filetMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true });
                    var filetMesh = new THREE.Mesh(geo, filetMaterial);
                    //scene.add(filetMesh);
                    var newBSPH, newBSPT, newBSPB, newBSP2, newBSP1, filletBSP
                    var filetBSP = new ThreeBSP(filetMesh);

                    newBSPH = filetBSP.intersect(EmportePieceBSPH);
                    newBSPT = filetBSP.intersect(EmportePieceBSPT);
                    newBSPB = filetBSP.intersect(paveBSPB);
                    newBSP2 = filetBSP.subtract(EmportePieceBSPH);
                    newBSP1 = newBSP2.subtract(paveBSPB);
                    filletBSP = newBSP1.subtract(EmportePieceBSPT);

                    ////////////////////subtract//////////////////////////////

                    var newFilet = new THREE.Geometry();
                    newFilet = filletBSP.toGeometry();
                    var newFilletMesh = new THREE.Mesh(newFilet, new THREE.MeshBasicMaterial({ map: texture }));
                    newFilletMesh.position.set(0, 0, 0);

                    ///////////////////////////////////création morceaux découpés///////////////////////////////////////////

                    var HeadFillet = new THREE.Geometry();
                    var TailFillet = new THREE.Geometry();
                    var degraissageFillet = new THREE.Geometry();
                    HeadFillet = newBSPH.toGeometry();
                    TailFillet = newBSPT.toGeometry();
                    degraissageFillet = newBSPB.toGeometry();


                    /////////////////////////////////calcul des volumes des 1ers morceaux/////////////////////////////////////////

                    if (widthH != 0) {
                        tabVolumes[0] = calculateVolume2(HeadFillet);
                    } else { tabVolumes[0] = 0;}

                    if (widthT != 0) {
                        //alert(tabVolumes[0]);
                        tabVolumes[1] = calculateVolume2(TailFillet);
                    } else { tabVolumes[1] = 0; }

                    if (height != 0) {
                        tabVolumes[2] = calculateVolume2(degraissageFillet);
                    } else { tabVolumes[2] = 0; }

                    var ind = 3;

                    var HeadFilletMesh = new THREE.Mesh(HeadFillet, new THREE.MeshBasicMaterial({ map: texture }));
                    var TailFilletMesh = new THREE.Mesh(TailFillet, new THREE.MeshBasicMaterial({ map: texture }));
                    var degraissageFilletMesh = new THREE.Mesh(degraissageFillet, new THREE.MeshBasicMaterial({ map: texture }));

                    HeadFilletMesh.position.set(0, 0, 20);
                    degraissageFilletMesh.position.set(-20, 0, 0);
                    TailFilletMesh.position.set(0, 0, -20);
                    scene.add(HeadFilletMesh);
                    scene.add(TailFilletMesh);
                    scene.add(degraissageFilletMesh);

                    //scene.add(newFilletMesh);
                    var cloneHeadFilletMesh = HeadFilletMesh.clone();
                    var cloneTailFilletMesh = TailFilletMesh.clone();
                    var clonedegraissageFilletMesh = degraissageFilletMesh.clone();

                    var mesh_decoupe = new THREE.Object3D;
                    mesh_decoupe.add(cloneHeadFilletMesh);
                    mesh_decoupe.add(cloneTailFilletMesh);
                    mesh_decoupe.add(clonedegraissageFilletMesh);

                    if (width != 0) {
                        var paveGeom = new THREE.BoxGeometry(300, 300, width);
                        var paveMaterial = new THREE.MeshBasicMaterial({ wireframe: true });


                        var fillet2BSP = new ThreeBSP(newFilletMesh);

                        var intersectionPave = new THREE.Geometry();
                        intersectionPave = fillet2BSP.intersect(paveBSP);

                        var geometryPave = new THREE.Geometry();
                        geometryPave = intersectionPave.toGeometry();
                        var newMesh = new THREE.Mesh(geometryPave, new THREE.MeshBasicMaterial({ map: texture }));


                        //alert(geometryPave.faces.length);

                        while (geometryPave.faces.length != 0) {


                            var z = paveMesh.position.z + width + 5;

                            paveMesh.position.set(0, 0, z);
                            paveBSP = new ThreeBSP(paveMesh);
                            //scene.add(paveMesh);

                            fillet2BSP = new ThreeBSP(newFilletMesh);

                            intersectionPave = filletBSP.intersect(paveBSP);
                            geometryPave = intersectionPave.toGeometry();

                            tabVolumes[ind] = calculateVolume2(geometryPave);
                            ind = ind + 1;

                            var newMesh = new THREE.Mesh(geometryPave, new THREE.MeshBasicMaterial({ map: texture }));
                            newMesh.position.set(0, 0, newMesh.position.z);
                            scene.add(newMesh);

                            var meshSave = newMesh.clone();
                            mesh_decoupe.add(meshSave);
                        }

                        document.body.style.cursor = '';

                    } else {
                        scene.add(newFilletMesh);
                        document.body.style.cursor = '';


                        tabVolumes[3] = 0;
                        tabVolumes[4] = calculateVolume2(newFilet);
                    }



                    //    }
                    //}
                    //else {
                    //    scene.add(newFilletMesh);

                    //    tabVolumes[ind] = calculateVolume2(newFilet);
                    //}


                    //alert(calculateVolume2(newBSP.toGeometry()));

                    //afficher les volumes dans la textarea


                    var txtVolume = document.getElementById("txtVolume");
                    txtVolume.value = tabVolumes.join("\n");

                    //var exporter = new THREE.OBJExporter();
                    //var result = exporter.parse(mesh_decoupe);
                    //var blob = new Blob([result], { type: 'text/plain' });
                    //saveAs(blob, 'dechets.obj');

                }
            });
            //scene.add(object);

        }, onProgress, onError);

        renderer = new THREE.WebGLRenderer();
        renderer.setSize(800, 500, false);

        document.getElementById('canvas3D').innerHTML = "";
        document.getElementById('canvas3D').appendChild(renderer.domElement);
    }
        function animate() {

            requestAnimationFrame(animate);
            camin();
            renderer.render(scene, camera);


        }

        function camin() {
            camera.position.y -= .1;
        }


            function volumeOfT(p1, p2, p3) {
            var v321 = p3.x * p2.y * p1.z;
            var v231 = p2.x * p3.y * p1.z;
            var v312 = p3.x * p1.y * p2.z;
            var v132 = p1.x * p3.y * p2.z;
            var v213 = p2.x * p1.y * p3.z;
            var v123 = p1.x * p2.y * p3.z;
            return (-v321 + v231 + v312 - v132 - v213 + v123) / 6.0;
        }

        function calculateVolume2(object) {
            var volumes = 0.0;

            for (var i = 0; i < object.faces.length; i++) {
                var Pi = object.faces[i].a;
                var Qi = object.faces[i].b;
                var Ri = object.faces[i].c;
                //alert (Pi);

                var P = new THREE.Vector3(object.vertices[Pi].x, object.vertices[Pi].y, object.vertices[Pi].z);
                //alert(object.vertices[Pi].x);
                var Q = new THREE.Vector3(object.vertices[Qi].x, object.vertices[Qi].y, object.vertices[Qi].z);
                var R = new THREE.Vector3(object.vertices[Ri].x, object.vertices[Ri].y, object.vertices[Ri].z);
                volumes += volumeOfT(P, Q, R);
            }

            return Math.abs(volumes);

      }
}