相关疑难解决方法(0)

如何在Three.js立方体中使用多种材质?

我试图使用Three.js渲染一个在面上有6个不同图像的立方体.

THREE.CubeGeometry的构造函数如下所示:

THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides )
Run Code Online (Sandbox Code Playgroud)

我可以从代码中看到,"材料"应该是一种材料,或者是一种由6种不同材料组成的阵列,但这里传递的材料在渲染时似乎永远不会被使用.

相反,给予Mesh构造函数的单个材质用于所有6个面.

var face_materials = ... <load 6 textures here>...
var cube_g = new THREE.CubeGeometry(400,400,400,1,1,1, face_materials); // <= ignored?
var cube = new THREE.Mesh(cube_g, some_material); // <= this is used instead
Run Code Online (Sandbox Code Playgroud)

即使我将null或undefined作为"some_material"传递,它似乎会覆盖face_materials并且不呈现任何内容.

有没有办法使用CubeGeometry来完成这项工作?或者我是否必须单独创建6个面并将它们添加到场景中?

three.js

11
推荐指数
1
解决办法
2万
查看次数

通过OBJMTLLoader加载对象的三个.js多个材质

我有一个模型的".obj"和".mtl"文件,我正在加载它OBJMTLLoader.".mtl"指定要应用于模型的纹理,并且three.js加载模型并使用应用的纹理渲染它就好了.

但这就是事情.

一旦加载了一个对象,我想在其上应用另一个纹理.这是因为第一纹理表示对象的表面材质.第二个纹理是一个绘图,我想定位在模型上的特定位置.

我的问题是:如何将第二个纹理应用到已加载(和纹理化)的对象上

我看到three.js创建了一个实例THREE.Object3D,并且该实例具有带有一个实例的"children"数组THREE.Mesh.

当我尝试将纹理应用于该网格(mesh.material.map = texture)时,我失去了初始纹理.

我查看了关于应用多个纹理和JSONLoader但没有找到答案的问题.

我也尝试过使用new THREE.MeshFaceMaterial( materials )(如本答案所示),但没有成功.

更新:

我试过@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 …
Run Code Online (Sandbox Code Playgroud)

javascript textures mesh three.js

8
推荐指数
1
解决办法
2万
查看次数

Three.js tile使用平面几何体具有多个纹理

所以我正在尝试建立一个由瓷砖组成的基于3D的世界.

我已经成功地使用平面几何和高度值等设法做到了这一点.但是现在我已经到了可能需要改变一切的地步.

问题是我想要一个瓷砖有多个纹理(使用着色器因为我想要混合它们).我能够全局地做到这一点(因此每个图块将具有相同的纹理+使用一些uv映射).

但是我无法理解我将如何指定哪个图块具有哪些纹理(并且我有大约100个纹理),因为平面几何图形只有1个着色器材质.而且我也不确定通过着色器发送100个纹理是否是一个好主意?

所以我的问题基本归结为:

有没有一种体面/高效的方式将平铺/顶点链接到纹理,所以我可以保持平面几何.

- 如果是的话:怎么样?

- 如果不是:我应该单独创建每个图块(因此是1x1的平面)并将它们合并在一起(性能/顶点混合?)因此它充当单个平面(在这种情况下,合并平面由许多1x1平面组成)和每块瓷砖使用着色器(1x1平面)?

这些事情一般如何完成?

编辑:

一些额外的信息,因为似乎我的问题不是很清楚:

我想要的是一个瓷砖(2个面)有多个"materialIndexes"来表示.目前我需要有1个图块才能有3个纹理,所以我可以使用特定算法将它们混合在着色器中.

例如,我想要一个心形(红色的心/黑色背景)作为纹理,而不是基于我想要混合/更改其他2个纹理的颜色,所以我可以得到例如木心和蓝色背景.或者例如,我应该能够在正方形上均匀地混合4个纹理,每个纹理占正方形的1/4.但这里的重点不是纹理必须做什么,而是我如何为我的面孔/瓷砖指定这样的3,4或更多纹理.

javascript textures tile three.js

4
推荐指数
1
解决办法
5987
查看次数

标签 统计

three.js ×3

javascript ×2

textures ×2

mesh ×1

tile ×1