首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >THREE.JS加载STL网格数组

THREE.JS加载STL网格数组
EN

Stack Overflow用户
提问于 2014-07-01 02:06:02
回答 1查看 2.1K关注 0票数 0

因此,我有一个数据库,其中包含一个文件引用列和对它所需的任何子STL文件的引用。我可以将一个或两个模型加载到THREE.js查看器中,这样所有这些都可以正常工作,但是当我加载一个由四个左右的数组组成的数组时,事情开始变得混乱,分配的网格ID开始变得有点奇怪,多个网格的ID也是相同的。我想知道是否需要调整我的loader.load方法以等待网格加载和配置。否则我就不知道我的问题出在哪里。这里的第一部分调用我的createMesh函数并请求一个网格作为返回。正如我所说的,这似乎一次只适用于1到2个网格。

代码语言:javascript
运行
复制
'if (indSTLCol.length>1 ){ for (item in indSTLCol){
                    getTheName="3dfiles\\"+fRSplit[parseInt(this.id)];
                    getTheName = getTheName.substring(0,getTheName.length-7);
                    getTheName=getTheName+indSTLCol[item]+".stl";
                    meshArr[item]=createMesh(getTheName);
                }

        }
        else{
            getTheName="3dfiles\\"+fRSplit[parseInt(this.id)];
            console.log("in ind collection"+ getTheName);
            console.log ("Added to Array"+meshArr[0].id);
            meshArr[0]=createMesh(getTheName);
         }

        console.log("BREAK");
        divId=this.id;

        fSizeX=700;
        fSizeY=500;
    }'
This part creates the mesh:
'function createMesh(getTheName){
            loader = new THREE.STLLoader();
            loader.addEventListener( 'load', function ( event ) {

                 geometry = event.content;
                 mesh = new THREE.Mesh( geometry, material );
                mesh.position.set( 0, 0, 0 );
                mesh.rotation.set( - Math.PI / 2, 0, 0 );
                mesh.scale.set( 2, 2, 2 );

                mesh.castShadow = true;
                mesh.receiveShadow = true; 
                mesh.id=getTheName;
                scene.add(mesh);
                /*  for (a in scene.children){
                    console.log("Child Name "+ scene.children[a].id+" " + a);
                } */ 
                //console.log("Mesh ID# " + mesh.id+" Mesh info: " + mesh);
                return mesh;
            } );

            mesh=loader.load( getTheName ); 
            return mesh;
        }'

我不擅长解释我的问题,所以如果你需要更多的信息,请直接问我,我可以试着解释得更好。此外,我迭代通过scene.children来检查Id,它适用于两个或更低的网格。我开始相信,在创建几何体之前,需要正在发生的事情和分配的ID。

代码语言:javascript
运行
复制
function createMeshArr(){
            for (var a in scene.children){
                if (scene.children[a] instanceof THREE.Mesh){
                    smeshArr[a]=scene.children[a];
                }   
            }
            return smeshArr;

好的,这似乎是有效的,但不确定原因:

代码语言:javascript
运行
复制
function createMesh(getTheNames){

                loader = new THREE.STLLoader();
                mesh=loader.load( getTheNames);
                loader.addEventListener( 'load', function ( event ) {
                    var material =  new THREE.MeshLambertMaterial({color: 'blue' });
                    var geometry = event.content;
                    var mesh = new THREE.Mesh( geometry, material );
                    mesh.position.set( 0, 0, 0 );
                    mesh.rotation.set( - Math.PI / 2, 0, 0 );
                    mesh.scale.set( 2, 2, 2 );

                    mesh.castShadow = true;
                    mesh.receiveShadow = true; 
                    mesh.id=getTheNames;
                    scene.add(mesh);
                    return mesh;
                } ); 

                return mesh;
            }
EN

回答 1

Stack Overflow用户

发布于 2014-12-05 04:28:30

下面是一个简单的示例,它使用回调来强制加载程序等待,直到上一次加载完成。

代码语言:javascript
运行
复制
var callback = function ( geometry ) { 
    var myMesh = new THREE.Mesh( geometry, basicMat );
    meshArray.push(myMesh);
    myScene.add( myMesh );
    i++;
    if (i < numberOfMeshesToLoad)  // put the next load in the callback
        myLoader.load( filename[i], callback ) ;
};

i = 0;

myLoader.load( filename[i], callback ); //initial loader call
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24496250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档