34 Three.js的材质THREE.MeshDepthMaterial

时间:2021-11-25 06:23:55

简介

使用THREE.MeshDepthMaterial材质的物体,其外观不是由光照或某个材质属性决定的,二十有物体到摄像机的距离决定的。可以将这种材质与其他材质结合使用,从而很容易地创建出逐渐消失的效果。
摄像机的near属性和far属性之间的距离决定了场景的亮度和物体消失的速度。如果这个距离非常大,那么当物体远离摄像机时,只会稍微消失一点。如果这个距离非常小,那么物体消失的效果会非常明显。

相关属性

名称 描述
wireframe 该属性指定是否显示线框
wireframeLineWidth 该属性指定线框线的宽度

使用案例

我费了好大的力气,发现80+的版本不支持这个,全部都是这个颜色,换了一个60的版本的three.js文件,没问题

首先创建材质

var material = new THREE.MeshDepthMaterial();

然后给每一个网格赋值就好了

        var cube = new THREE.CubeGeometry(25, 25, 25);
        var mesh = new THREE.Mesh(cube, material);
        scene.add(mesh);

案例

34 Three.js的材质THREE.MeshDepthMaterial

案例查看地址:http://www.wjceo.com/blog/threejs/2018-02-12/36.html

全部代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css"> html, body { margin: 0; height: 100%; } canvas { display: block; } </style>
</head>
<body onload="draw();">

</body>
<script src="https://johnson2heng.github.io/three.js-demo/lib/three-v60.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/controls/OrbitControls.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/stats.min.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/dat.gui.min.js"></script>
<script> var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias: true,alpha:true}); renderer.setSize(window.innerWidth, window.innerHeight); //告诉渲染器需要阴影效果 //renderer.shadowMap.enabled = true; //renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默认的是,没有设置的这个清晰 THREE.PCFShadowMap renderer.setClearColor(0x000000); document.body.appendChild(renderer.domElement); } var camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.set(0, 40, 100); camera.lookAt(new THREE.Vector3(0, 0, 0)); } var scene; function initScene() { scene = new THREE.Scene(); } var ambientLight, directionalLight; function initLight() { } var cube, plane, meshMaterial; function initModel() { //辅助工具 var helper = new THREE.AxisHelper(10); scene.add(helper); var s = 25; var cube = new THREE.CubeGeometry(s, s, s); var material = new THREE.MeshDepthMaterial(); for (var i = 0; i < 3000; i++) { var mesh = new THREE.Mesh(cube, material); mesh.position.x = 800 * ( 2.0 * Math.random() - 1.0 ); mesh.position.y = 800 * ( 2.0 * Math.random() - 1.0 ); mesh.position.z = 800 * ( 2.0 * Math.random() - 1.0 ); mesh.rotation.x = Math.random() * Math.PI; mesh.rotation.y = Math.random() * Math.PI; mesh.rotation.z = Math.random() * Math.PI; mesh.updateMatrix(); scene.add(mesh); } } //初始化dat.GUI简化试验流程 var gui; function initGui() { //声明一个保存需求修改的相关数据的对象 controls = { }; var gui = new dat.GUI(); } //初始化性能插件 var stats; function initStats() { stats = new Stats(); document.body.appendChild(stats.dom); } //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 var controls; function initControls() { controls = new THREE.OrbitControls(camera, renderer.domElement); // 如果使用animate方法时,将此函数删除 //controls.addEventListener( 'change', render ); // 使动画循环使用时阻尼或自转 意思是否有惯性 controls.enableDamping = true; //动态阻尼系数 就是鼠标拖拽旋转灵敏度 //controls.dampingFactor = 0.25; //是否可以缩放 controls.enableZoom = true; //是否自动旋转 controls.autoRotate = false; //设置相机距离原点的最远距离 controls.minDistance = 50; //设置相机距离原点的最远距离 controls.maxDistance = 200; //是否开启右键拖拽 controls.enablePan = true; } function render() { renderer.render(scene, camera); } //窗口变动触发的函数 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); render(); renderer.setSize(window.innerWidth, window.innerHeight); } function animate() { //更新控制器 render(); //更新性能插件 stats.update(); //controls.update(); requestAnimationFrame(animate); } function draw() { initRender(); initScene(); initCamera(); initLight(); initModel(); initGui(); //initControls(); initStats(); animate(); window.onresize = onWindowResize; } </script>
</html>