【发布时间】:2013-05-22 18:37:14
【问题描述】:
我有一个模型的“.obj”和“.mtl”文件,我正在通过OBJMTLLoader 加载它。 ".mtl" 指定要应用于模型的纹理,three.js 加载模型并使用应用的纹理进行渲染。
但事情就是这样。
加载一个对象后,我想在其上应用另一个纹理。这是因为第一纹理代表物体的表面材料。第二个纹理是一张图纸,我想将其放置在模型上的特定位置。
我的问题是:如何将第二个纹理应用到已加载(和纹理化)的对象上?
我看到three.js 创建了一个THREE.Object3D 的实例,并且该实例有一个带有THREE.Mesh 实例的“子”数组。
当我尝试将纹理应用到该网格 (mesh.material.map = texture) 时,我失去了初始纹理。
我查看了这个question about applying multiple textures and 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 将一个纹理应用到另一个上。我看到了一些examples of using one texture,但仍然不确定如何以重叠状态显示两者。我也不确定如何在网格上的特定位置定位纹理。
【问题讨论】:
-
类似问题(遗憾的是目前没有任何可靠的解决方案)-stackoverflow.com/questions/12494781/…
-
您是否找到了将第二个纹理定位在网格上特定位置的解决方案?我遇到了同样的问题,我可以使用 ShaderMaterial 将纹理渲染到另一个纹理上,但我很难理解定位的工作原理。
标签: javascript three.js textures mesh