三.js:将多个材质分配给导入的 OBJ 文件
Three.js: Assign multiple materials to an imported OBJ-file
我用搅拌机制作了一个OBJ文件。此文件分配了两种材料。该文件正在很好地导入。
但是:如何在三个.js中为面分配不同的材质?我知道,材料必须在数组内部(不知道,如果我做对了)。现在,我想将材料分配给面部。
这是我代码中有趣的部分:
....
loader.load( './beardedbox3.obj', addBananaInScene);
};
var addBananaInScene = function(object){
banana = object;
//Move the banana in the scene
banana.rotation.x = Math.PI/2;
banana.position.x = 0;
banana.position.y = 0;
banana.position.z = 0;
banana.scale.x = 200;
banana.scale.y = 200;
banana.scale.z = 200;
var weiss = new THREE.MeshPhongMaterial( { color: 0xffffff,
specular: 0xffffff,
shininess: 30,
shading: THREE.FlatShading } );
var rot = new THREE.MeshPhongMaterial( { color: 0xff0000,
specular: 0xFF9900,
shininess: 30,
shading: THREE.FlatShading } );
object.traverse( function ( child ) {
if(child instanceof THREE.Mesh){
child.materials = [weiss, rot];
child.geometry.computeVertexNormals();
}
});
//Add the 3D object in the scene
scene.add(banana);
OBJ 文件如下所示:
.... Some vertex-coordinates
usemtl weiss
s 1
f 1//1 2//1 3//1
f 4//2 5//2 6//2
... some more faces
f 130//23 34//23 141//23
usemtl rot
f 41//51 42//51 43//51
f 45//52 46//52 47//52
f 42//53 11//53
... even more faces
在我看来,这好像我可以使用一个简单的循环,将材料分配给面部。但我不知道,该怎么做。还是有更简单的方法?
问候基督教
编辑:
感谢您的回答,对我来说听起来合乎逻辑,但不幸的是我没有让它工作。我似乎缺少一些基础知识。
我的代码的重要部分现在如下所示:
var weiss = new THREE.MeshPhongMaterial({
color: 0xffffff,
specular: 0xffffff,
shininess: 30,
shading: THREE.FlatShading
});
var rot = new THREE.MeshPhongMaterial({
color: 0xff0000,
specular: 0xFF9900,
shininess: 30,
shading: THREE.FlatShading
});
object.traverse(function (child) {
if (child instanceof THREE.Mesh) {
child.materials = [weiss, rot];
child.geometry.computeVertexNormals();
child.geometry.elementsNeedUpdate = true;
for (var i = 0; i < child.geometry.faces.length; i++) {
if (i < child.geometry.faces.length / 2) {
child.geometry.faces[i].materialIndex = 0;
} else {
child.geometry.faces[i].materialIndex = 1;
}
}
}
});
我收到错误消息:
TypeError: child.geometry.faces is undefined
addBananaInScene/<() box.js:78
THREE.Object3D.prototype.traverse() three.min.js:179
THREE.Object3D.prototype.traverse() three.min.js:179
addBananaInScene() box.js:69
THREE.OBJLoader.prototype.load/<() OBJLoader.js:25
THREE.XHRLoader.prototype.load/<() three.min.js:377
我想,我做了一件非常愚蠢的事情;)
提前感谢您的感谢帮助。
基督教
是的。使用多材质。
http://threejs.org/docs/#Reference/Materials/MultiMaterial
然后,例如,每个面都有一个材质,并且在加载 obj 后可以访问几何体,您可以让前半部分面使用一种材质,其余面使用另一种材质:
for ( var i = 0; i < geometry.faces.length; i ++ ) {
if(i<geometry.faces.length/2){
geometry.faces[i].materialIndex = 0;
}else{
geometry.faces[i].materialIndex = 1;
}
}
您可以在单个对象中加载多个材质。使用以下代码
var loader = new THREE.OBJLoader( manager );
loader.load( 'obj_model/Jersey_1.obj', function ( event ) {
var object = event;
var geometry = object.children[ 0 ].geometry;
var materials = [];
materials.push(new THREE.MeshLambertMaterial( { map : THREE.ImageUtils.loadTexture( 'obj_model/Jrsy_1_Color_1.png'),transparent: true, opacity: 1,color: 0xFF4C33 } ) );
materials.push(new THREE.MeshLambertMaterial( { map : THREE.ImageUtils.loadTexture( 'obj_model/Jrsy_1_Color_2.png'),transparent: true, opacity: 1,color: 0xFFF933 } ) );
materials.push(new THREE.MeshLambertMaterial( { map : THREE.ImageUtils.loadTexture( 'obj_model/Jrsy_1_Tag.png'),transparent: true, opacity: 1,color: 0xFF0000 } ) );
materials.push(new THREE.MeshLambertMaterial( { map : THREE.ImageUtils.loadTexture( 'obj_model/Jrsy_Ptrn.png'),transparent: true, opacity: 1,color: 0xFF33E0 } ) );
mesh = THREE.SceneUtils.createMultiMaterialObject(geometry, materials);
mesh.scale = new THREE.Vector3( 8,8,8 );
scene.add(mesh);
});
相关文章:
- 如何使用url加载程序在webpack中导入多个图像
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 在循环中分配json值时,值被覆盖
- 动态分配GA增强型电子商务跟踪器
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 如何将JSON数据导入我的ejs模板
- 如何将不可变的js导入angular 2(alpha)
- 将数据从javascript文件导入VB.Net页面
- 如何在jQuery中将函数的输出分配给变量
- 为集合分配大量的模型弹药
- onclick函数需要双击,因为类分配延迟
- Javascript 将变量分配给警报
- 导入jQuery脚本获胜'我不处理html文件
- 将节点数据分配给另一个变量jstree
- javascript导入的最佳实践是什么
- 将CSV文件从URL导入Node.js
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- Javascript变量分配-按类别
- Typescript导入导出的类会发出require(..),从而导致浏览器错误
- 三.js:将多个材质分配给导入的 OBJ 文件