【问题标题】:How to use multiple materials in a Three.js cube?如何在 Three.js 立方体中使用多种材质?
【发布时间】:2012-02-07 21:17:02
【问题描述】:

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

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

THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides )

我可以从代码中看到,“materials”应该是一种材质,或者是 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

即使我将 null 或 undefined 作为“some_material”传递,它似乎也会覆盖 face_materials 并且什么也不渲染。

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

【问题讨论】:

    标签: three.js


    【解决方案1】:

    MeshFaceMaterial 现在已弃用,因此您应该传入一个 MeshBasicMaterials 数组,而不是使用它。

    但是...如果您像我一样只想在每个面上渲染不同的颜色,那么还有另一种方法,在 WestLangley 的 answer here 中进行了描述。基本思想是在geometry 对象的面中设置颜色,而不是作为材料数组。

    var geo = new THREE.BoxGeometry( 5, 2, 5 );
    
    var mat = new THREE.MeshBasicMaterial( { color:0xff0ff0, vertexColors: THREE.FaceColors } );
    
    var mesh = new THREE.Mesh( geo, mat );
    
    mesh.geometry.faces[ 5 ].color.setHex( 0x00ffff ); 
    

    这是一种非常有效的做事方式。

    【讨论】:

      【解决方案2】:

      有关在立方体中使用多种材质的示例,对于最近版本的 three.js 版本 56(2013 年 3 月),请查看示例的源代码 http://stemkoski.github.com/Three.js/Textures.html -- 最近最大的变化是 @ 987654322@ 需要传递一个要在CubeGeometry 中使用的材料数组。

      【讨论】:

        【解决方案3】:

        您需要对网格使用 THREE.MeshFaceMaterial。下面是示例代码:

        var materials = [];
        for (var i=0; i<6; i++) {
          var img = new Image();
          img.src = i + '.png';
          var tex = new THREE.Texture(img);
          img.tex = tex;
          img.onload = function() {
            this.tex.needsUpdate = true;
          };
          var mat = new THREE.MeshBasicMaterial({color: 0xffffff, map: tex});
          materials.push(mat);
        }
        var cubeGeo = new THREE.CubeGeometry(400,400,400,1,1,1, materials);
        var cube = new THREE.Mesh(cubeGeo, new THREE.MeshFaceMaterial());
        

        【讨论】:

        • 哇,好用!谢谢你。 MeshFaceMaterial 是缺少的成分 - 相当不直观,因为它的定义是: THREE.MeshFaceMaterial() = function(){};也许有一天我会弄清楚为什么会这样......
        • 查看stackoverflow.com/questions/13795354/… 了解有关在最近的three.js 版本中执行此操作的信息。
        猜你喜欢
        • 2015-01-16
        • 1970-01-01
        • 2013-06-15
        • 2023-03-26
        • 2021-03-23
        • 2015-01-28
        • 2023-03-23
        • 1970-01-01
        • 2012-09-08
        相关资源
        最近更新 更多