Three.js中的合并几何形状

问题描述 投票:3回答:1

我有一个包含多个网格的场景,每个网格的形状和大小都不同。

我已经遍历每个网格并使用geometry.merge(),我已经能够根据场景中的几何形状创建一个新的网格。

我想用一个AlphaMask遮罩整个网格,但是,每个几何都有单独应用的材质。

可以在这里看到一个例子-https://codepen.io/danlong/pen/KXOObr

    function addObjects(scene) {

    // merged geomoetry & material
    var mergedGeometry = new THREE.Geometry();
    var mergedMaterial = new THREE.MeshStandardMaterial({ color: "#444", transparent: true, side: THREE.DoubleSide, alphaTest: 0.5, opacity: 1, roughness: 1 });


    // multiple meshes
    var geometry = new THREE.IcosahedronGeometry(30, 5);
    var material = new THREE.MeshStandardMaterial({ color: "#444" });

    var geo1 = new THREE.IcosahedronGeometry(30, 5);
    var mesh1 = new THREE.Mesh( geo1, material );
    mesh1.position.x = 10;
    mesh1.position.y = 10;
    mesh1.position.z = 0;

    var geo2 = new THREE.IcosahedronGeometry(30, 5);
    var mesh2 = new THREE.Mesh( geo2, material );
    mesh2.position.x = 20;
    mesh2.position.y = 20;
    mesh2.position.z = 0;

    var geo3 = new THREE.IcosahedronGeometry(30, 5);
    var mesh3 = new THREE.Mesh( geo3, material );
    mesh3.position.x = 30;
    mesh3.position.y = 30;
    mesh3.position.z = 0;

    // scene.add(mesh1, mesh2, mesh3);
    mesh1.updateMatrix();
    mergedGeometry.merge(mesh1.geometry, mesh1.matrix);

    mesh2.updateMatrix();
    mergedGeometry.merge(mesh2.geometry, mesh2.matrix);

    mesh3.updateMatrix();
    mergedGeometry.merge(mesh3.geometry, mesh3.matrix);

    // alpha texture 
    var image = document.createElement('img');
    var alphaMap = new THREE.Texture(image);
    image.onload = function()  {
        alphaMap.needsUpdate = true;
    };
    image.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGUlEQVQoU2NkYGD4z4AHMP7//x+/gmFhAgCXphP14bko/wAAAABJRU5ErkJggg==';
    mergedMaterial.alphaMap = alphaMap;
    mergedMaterial.alphaMap.magFilter = THREE.NearestFilter;
    mergedMaterial.alphaMap.wrapT = THREE.RepeatWrapping;
    mergedMaterial.alphaMap.repeat.y = 1;

    // merged geometry with alpha mask
    merge1 = new THREE.Mesh(mergedGeometry, mergedMaterial);
        merge1.rotation.z = -Math.PI/4;

    // merge geometry without alpha mask
    var merge2 = new THREE.Mesh(mergedGeometry, material);
    merge2.position.x = -100;
        merge2.rotation.z = -Math.PI/4;

    scene.add(merge1, merge2);
    return mesh;
}

左侧的网格是我要对其应用alphaMask的合并几何。右边的网格是此操作的结果,而不是将贴图整体应用于网格,每个几何都应用了贴图。

有没有一种方法可以掩盖整个网格而不是每个几何?

-three.js r86

编辑:我试图将剪切平面应用于我的网格,但这并不是我想要的效果。我希望能够在整个网格上应用alphaMask并显示出来,但是我制作了蒙版图像。像这种效果-https://codepen.io/supah/pen/zwJxdb

这与从原始几何图形中保留紫外线有关吗?我需要以某种方式更改它们吗?

javascript merge three.js geometry
1个回答
0
投票

我认为您真正想要的是覆盖的面具。这可以通过在场景渲染之上渲染一个应用了Alpha贴图的平面来实现。使用正交摄影机并控制某些渲染器设置,例如禁用自动清除颜色。

© www.soinside.com 2019 - 2024. All rights reserved.