我有一个模型的“.obj”和“.mtl”文件,我正在通过OBJMTLLoader
. “.mtl”指定要应用于模型的纹理,并且three.js 加载模型并使用应用的纹理渲染它就好了。
但事情就是这样。
加载对象后,我想在其上应用另一个纹理。这是因为第一纹理代表物体的表面材料。第二个纹理是一张图纸,我想将其放置在模型上的特定位置。
我的问题是:如何将第二个纹理应用到已加载(和纹理化)的对象上?
我看到 three.js 创建了一个 的实例THREE.Object3D
,并且该实例具有“子”数组和一个THREE.Mesh
.
当我尝试将纹理应用到该网格 ( mesh.material.map = texture
) 时,我会丢失初始纹理。
我调查了这个关于应用多个纹理和 JSONLoader的问题,但没有找到答案。
我也尝试过使用new THREE.MeshFaceMaterial( materials )
(如this answer中所建议)但没有成功。
更新:
我尝试了@WestLangley 的使用多材质对象的建议,但仍然无法在另一种材质之上渲染一种材质。
我做了这个简单的演示,改编自three.js OBJLoader — http://dl.dropboxusercontent.com/u/822184/webgl_multiple_texture/index.html
我THREE.SceneUtils.createMultiMaterialObject
按照建议使用,传递从.obj加载的主网格的克隆几何。我还给它 2 个纹理——一个用于整个表面,另一个用于模型的前表面。
但这不起作用。我添加了 2 个复选框来切换相应材料的“可见”属性。您可以看到存在材料,但我无法从第二个下方看到第一个。
加载/渲染的关键如下:
var texture = THREE.ImageUtils.loadTexture('fabric.jpg');
var texture2 = THREE.ImageUtils.loadTexture('table.jpg');
texture2.offset.set(-0.65, -2.5);
texture2.repeat.set(4, 4);
var loader = new THREE.OBJLoader();
loader.addEventListener( 'load', function ( event ) {
var mainMesh = event.content.children[0].children[0];
multiMaterialObject = THREE.SceneUtils.createMultiMaterialObject(
mainMesh.geometry.clone(), [
new THREE.MeshLambertMaterial({ map: texture2 }),
new THREE.MeshLambertMaterial({ map: texture })
]);
multiMaterialObject.position.y = -80;
scene.add(multiMaterialObject);
});
loader.load( 'male02.obj' );
更新#2
在这一点上,我认为最好的办法是THREE.ShaderMaterial
将一个纹理应用到另一个纹理上。我看到了一些使用一种纹理的示例,但仍然不确定如何以重叠状态显示两者。我也不确定如何将纹理放置在网格上的特定位置。