【问题标题】:Threejs: uploading scene from .obj and object manipulationThreejs:从 .obj 上传场景和对象操作
【发布时间】:2013-10-19 21:10:53
【问题描述】:

我有一个场景。 https://dl.dropboxusercontent.com/u/8913924/test2/index.html

大多数对象都是从单个 .obj 文件加载的。 加上 2 个手工制作的立方体。

点击对象 - 它应该改变它的颜色。

立方体没问题。 来自 obj 文件的对象一次更改其颜色(但它们不应该,这是我当前的问题)。 (对象上的所有点击都被正确检测到。检查 debug concole。)

需要您的帮助和建议。

添加 2 个手工制作的红色方块:

var geometry = new THREE.CubeGeometry(10,10,10);
            var material = new THREE.MeshBasicMaterial({color: 0xff0000});

            mesh = new THREE.Mesh(geometry, material);

            mesh.position.z = 125;
            mesh.name = 'cube1';

            scene.add(mesh);

            geometry = new THREE.CubeGeometry(10,10,10);
            material = new THREE.MeshBasicMaterial({color: 0xff0000});

            mesh = new THREE.Mesh(geometry, material);

            mesh.position.z = 175;
            mesh.name = 'cube2';

            scene.add(mesh);

从 .obj 加载对象:

    var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
    var object = event.content;

    // cubes are already here   
    scene.add(object);
}); loader.load( 'qwerty.obj', 'qwerty.mtl' );

更改适当对象的颜色:

var intersects = raycaster.intersectObjects( scene.__objects );
if (intersects.length > 0) {
    // got the correct object with proper id
intersects[0].object.material.color.setHex(Math.random() * 0xffffff);
}

【问题讨论】:

  • 您必须为几何的顶点/多边形定义不同的颜色
  • 我是新手,我没抓住重点。什么网格的几何形状? (我真的不明白为什么立方体和其他对象之间的不同行为——对我来说,它们都是不相关的网格。例子、文章或其他东西都可以。
  • “大多数对象都是从单个 obj 文件加载的”,即网格信息。网格只是收集的多边形。您正在谈论的每个“对象”都是它自己的多边形集合。如果您想要更具体的答案,您将不得不发布代码并专门讨论您想要实现的目标以及不适合您的内容。我不是谷歌。想要教程,google一下。如果您能提供具体问题,我会帮助您解决具体问题。
  • 据我所知,您已经为整个几何体分配了相同的材质,而不仅仅是带有 ID 的“对象”。

标签: 3d three.js webgl


【解决方案1】:

看起来您正在将整个 .obj 场景添加为一个对象 (scene.add(object))。那么,当您与场景对象相交时,intersects[0].object 就是您的整个 .obj,因为这是您添加到场景中的内容。

我不熟悉 OBJMTLLoader,但您的第一个回调中的 event.content 似乎有一个 children 属性。尝试这样做:

var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;

// cubes are already here
for(var i = 0; i < object.children.length; i++)   
    scene.add(object.children[i]);
}); loader.load( 'qwerty.obj', 'qwerty.mtl' );

编辑:

使用它并通过克隆材料使其工作。基本上,加载网格时,它们都共享相同的材质定义(这很好,因为它可以节省资源)。但是,如果要独立更改材料属性,则需要替换:

intersects[0].object.material.color.setHex(Math.random() * 0xffffff);

通过这个:

if(!intersects[0].object.ownMaterial) intersects[0].object.material = intersects[0].object.material.clone();
intersects[0].object.ownMaterial = true;
intersects[0].object.material.color.setHex(Math.random() * 0xffffff);

【讨论】:

  • 这就是装载机为我工作的方式。它看起来像一个对象,但实际上所有对象都具有正确的名称和 ID。真的,我有 10 多个对象。不是 3 个。 (查看演示dl.dropboxusercontent.com/u/8913924/test2/index.html
  • 我看到了,是的。显然它们都共享相同的材质对象(scene.__objects[7].material == scene.__objects[8].material),因此您可能希望在获取相交对象后创建一个新材质。
  • 谢谢!有效。诀窍在于共享材料。你很有帮助。
猜你喜欢
  • 2013-08-23
  • 2015-06-07
  • 1970-01-01
  • 2022-01-10
  • 2015-08-23
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多