【问题标题】:Two material in the same place in three.js两个材料在三个.js 中的同一个地方
【发布时间】:2020-11-04 15:16:10
【问题描述】:

我试图将两种材料放在一个平面上,一种放在另一种上。我的意思是,我有一个砖块背景,我需要在它上面添加另一种材质。

【问题讨论】:

    标签: javascript ecmascript-6 three.js 3d textures


    【解决方案1】:

    使用以下方法将多个单一材质应用于网格。我们的想法是定义BufferGeometry.groups,使得整个几何体(不仅仅是它的一部分)用不同的材质渲染。

    var renderer, scene, camera;
    
    init();
    render();
    
    function init() {
    
        renderer = new THREE.WebGLRenderer( { antialias: true } );
        renderer.setPixelRatio( window.devicePixelRatio );
        renderer.setClearColor( 0x000000, 0.0 );
        renderer.setSize( window.innerWidth, window.innerHeight );
        document.body.appendChild( renderer.domElement );
    
        scene = new THREE.Scene();
        
        camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 1000 );
        camera.position.set( 15, 20, 30 );
        scene.add( camera );
    
        var controls = new THREE.OrbitControls( camera, renderer.domElement );
        controls.addEventListener( 'change', render );
        controls.minDistance = 10;
        controls.maxDistance = 50;
    
        scene.add( new THREE.AmbientLight( 0xffffff, 0.1 ) );
      
        var light = new THREE.PointLight( 0xffffff, 1 );
        camera.add( light );
    
        var geometry = new THREE.BoxBufferGeometry( 10, 10, 10 );
        geometry.clearGroups();
        geometry.addGroup( 0, Infinity, 0 );
        geometry.addGroup( 0, Infinity, 1 );
    
        // textures
        var loader = new THREE.TextureLoader();
        var map = loader.load( 'https://threejs.org/examples/textures/decal/decal-diffuse.png', render );
        var normalMap = loader.load( 'https://threejs.org/examples/textures/decal/decal-normal.jpg', render );
    
        var material1 = new THREE.MeshPhongMaterial( {
            color: 0xffffff, 
            specular: 0x222222,
            shininess: 100,
            map: map,
            normalMap: normalMap,
            alphaTest: 0.5,
            visible: true
        } );
    
        var material2 = new THREE.MeshNormalMaterial( {
            opacity: 0.5,
            transparent: true,
            visible: true
        } );
    
        mesh = new THREE.Mesh( geometry, [ material1, material2 ] );
        scene.add( mesh );
    
    }
    
    function render() {
    
        renderer.render( scene, camera );
    
    }
    body {
        margin: 0px;
    }
    canvs {
      display: block;
     }
    <script src="https://cdn.jsdelivr.net/npm/three@0.116.1/build/three.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/three@0.116.1/examples/js/controls/OrbitControls.js"></script>

    【讨论】:

    • 再次感谢@Mugen87!我一直在尝试使用着色材料并将两种纹理设置为制服,然后在着色器中混合它们。但这也是个好主意!!谢谢!
    • 你知道我是否可以为这两种材料应用混合模式吗?
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2019-04-12
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多