0

我们目前能够使用下面的代码加载多个 collada 文件,我们想知道如何以不同的方式命名 collada 文件。

以下是我们使用的一些函数:

function loadFiles(){
    urls.push('./model/e1.dae');
    urls.push('./model/e2.dae');
    urls.push('./model/e3.dae');
    urls.push('./model/e4.dae');
    urls.push('./model/e5.dae');
    for(var i =0; i<urls.length; i+=1) {
        var loader = new THREE.ColladaLoader();
        loader.options.convertUpAxis = true;
        loader.load(urls[i], function(collada) {

            var object = collada.scene;
            object.updateMatrix();
            object.position.x = Math.random()*500-200;
            object.position.y = Math.random()*200-100;
            object.scale.x = object.scale.y = object.scale.z = 2;
            object.rotation.y -= (90)*(Math.PI/180);
            object.rotation.x = (90)*(Math.PI/180);
            object.position.z = 10;
            scene.add(object);
            renderer.render(scene, camera);
        });
    }
}


function onDocumentMouseDown( event ){
    event.preventDefault();
    toIntersect = [];
    scene.traverse(function (child) {
        if (child instanceof THREE.Mesh) {
            toIntersect.push(child);
        }
    });
    raycaster = projector.pickingRay( mouse2D.clone(), camera );
    var intersects = raycaster.intersectObjects( toIntersect );

    alert(intersects[0].object.name);
}

在 loadfile 函数中,我们将每个 collada 文件的地址放入一个数组中,并使用循环加载它。文件的渲染工作。但是如果对象被点击,我们无法让它提醒对象的名称和/或 ID。

单击时,所有对象都呈现警报“SketchUp”,而不是释放不同的名称。

使用 "object.name = "name"" 重命名也不起作用。我们希望您能回答这个问题。

4

2 回答 2

1

我做了类似的事情,它在选择一个 collada 模型并使用 raycaster 获取它的名称和 ID 时非常适合我。(在一个场景中有多个 collada 模型渲染)。

这是对我有用的代码片段和步骤:

  • 创建新的方向向量对象作为全局变量。

var directionVector = new THREE.Vector3();

  • 创建新的鼠标、光线投射器和投影仪对象作为全局变量。
var mouse = new THREE.Vector2();

var raycaster = new THREE.Raycaster();

var projector = new THREE.Projector();
  • 在加载 collada 模型后,创建 onDocumentMouseMove 事件函数并将其附加到 collada 模型容器(放置renderer.domElement的 DOM)中。

    function onDocumentMouseMove( event ) {
              event.preventDefault();
              mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
              mouse.y = -( event.clientY / window.innerHeight ) * 2 + 1;
    

    }

your_collada_model_container.mousemove( onDocumentMouseMove );

  • 点击事件附加到您的 collada 模型容器(放置renderer.domElement的 DOM )中。

  • 当你的容器被点击时,调用这个函数:

    功能选择ColladaModel(){

     directionVector.set(mouse.x, mouse.y, 1);
              projector.unprojectVector(directionVector, camera);
              directionVector.sub(camera.position);
              directionVector.normalize();
              raycaster.set(camera.position, directionVector);
              var intersects = raycaster.intersectObjects(scene.children, true);
              if (intersects.length) {
                  var target = intersects[0].object;
                  if(target){
                      console.log(target.name+"    "+target.id);
                  }
              } 
    

    }

于 2013-12-11T11:56:35.957 回答
0

就在var object = collada.scene;你可以说之后object.name = urls[i];。您可能有范围问题,但您明白了。或者,您可以在 Sketchup 中进行命名,使其正确。

于 2013-05-14T10:45:34.677 回答