javascript - Three.js 中同一位置的两种 Material

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

我正在尝试将两种 Material 放入一个平面中,一种放在另一种之上。我的意思是,我有一个砖 block 背景,在它上面我需要放置另一种具有其他纹理的 Material 。

最佳答案

使用以下方法将多个 Material 应用于网格。这个想法是定义 BufferGeometry.groups以某种方式使用不同的 Material 渲染整个几何体(而不仅仅是其中的一部分)。

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/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a0d4c8d2c5c5e0908e9191968e91" rel="noreferrer noopener nofollow">[email protected]</a>/build/three.js"></script>
<script src="https://cdn.jsdelivr.net/npm/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="285c405a4d4d68180619191e0619" rel="noreferrer noopener nofollow">[email protected]</a>/examples/js/controls/OrbitControls.js"></script>

关于javascript - Three.js 中同一位置的两种 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62909522/

相关文章:

javascript - 如何强制 Showoff 不向 .content div 添加 margin-top

javascript - 复制对象数组并在不修改原始数组的情况下进行更改

javascript - 在 three.js 中围绕它的 y 轴旋转 3D 对象

javascript - 将线框更改为 false 后,脸部不可见

三.js - 将顶点颜色传递给片段着色器

javascript - 在 FF 中淡入 <li> 时,项目符号点不显示

javascript - Google Apps 脚本 - 检查电子邮件是否已正确发送

javascript - Jquery 鼠标滚轮事件仅适用于 Chrome

javascript - React.js 和 ES2015 - 将方法从父级传递给子级

javascript - ES2015 模板字符串中 "tags"的用途是什么?