19-THREE.JS 混合材质

<!DOCTYPE html>

<html>

<head>
    <title></title>
    <script src="https://cdn.bootcss.com/three.js/r67/three.js"></script>
    <script src="https://cdn.bootcss.com/stats.js/r10/Stats.min.js"></script>
    <script type="text/javascript" src="https://cdn.bootcss.com/dat-gui/0.7.3/dat.gui.js"></script>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>

<div id="Stats-output">
</div>
<div id="WebGL-output">
</div>
<script type="text/javascript">

    // 初始化
    function init() {

        var stats = initStats();

        // 创建一个场景
        var scene = new THREE.Scene();

        // 创建一个相机
        var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 10, 130);

        // 场景一个渲染器
        var renderer = new THREE.WebGLRenderer();

        renderer.sortObjects = false;

        renderer.setClearColor(new THREE.Color(0x00000, 1.0));
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMapEnabled = true;

        // 设置相机的位置 最远最近距离 朝向
        camera.position.x = -50;
        camera.position.y = 40;
        camera.position.z = 50;
        camera.near = 7;
        camera.far = 139;
        camera.lookAt(scene.position);

        // 把渲染后的效果放到DOM元素中去
        document.getElementById("WebGL-output").appendChild(renderer.domElement);

        var step = 0;

        var controls = new function () {
            this.cameraNear = camera.near;
            this.cameraFar = camera.far;
            this.rotationSpeed = 0.02;
            this.numberOfObjects = scene.children.length;
            this.color = 0x00ff00;

            this.removeCube = function () {
                var allChildren = scene.children;
                var lastObject = allChildren[allChildren.length - 1];
                if (lastObject instanceof THREE.Mesh) {
                    scene.remove(lastObject);
                    this.numberOfObjects = scene.children.length;
                }
            };

            this.addCube = function () {

                var cubeSize = Math.ceil(3 + (Math.random() * 3));
                var cubeGeometry = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);

                //混合材质
                var cubeMaterial = new THREE.MeshDepthMaterial();
                var colorMaterial = new THREE.MeshBasicMaterial({
                    color: controls.color,
                    transparent: true,
                    blending: THREE.MultiplyBlending
                });
                var cube = new THREE.SceneUtils.createMultiMaterialObject(cubeGeometry, [colorMaterial, cubeMaterial]);
                cube.children[1].scale.set(0.99, 0.99, 0.99);
                cube.castShadow = true;

                // 给正方体随机的位置
                cube.position.x = -60 + Math.round((Math.random() * 100));
                cube.position.y = Math.round((Math.random() * 10));
                cube.position.z = -100 + Math.round((Math.random() * 150));

                // 在场景中添加正方体
                scene.add(cube);
                this.numberOfObjects = scene.children.length;
            };

            this.outputObjects = function () {
                console.log(scene.children);
            }
        };

        var gui = new dat.GUI();
        gui.addColor(controls, ‘color‘);
        gui.add(controls, ‘rotationSpeed‘, 0, 0.5);
        gui.add(controls, ‘addCube‘);
        gui.add(controls, ‘removeCube‘);
        gui.add(controls, ‘cameraNear‘, 0, 50).onChange(function (e) {
            camera.near = e;
        });
        gui.add(controls, ‘cameraFar‘, 50, 200).onChange(function (e) {
            camera.far = e;
        });

        var i = 0;
        while (i < 10) {
            controls.addCube();
            i++;
        }

        render();

        function render() {
            stats.update();

            // 旋转所有正方体
            scene.traverse(function (e) {
                if (e instanceof THREE.Mesh) {

                    e.rotation.x += controls.rotationSpeed;
                    e.rotation.y += controls.rotationSpeed;
                    e.rotation.z += controls.rotationSpeed;
                }
            });

            requestAnimationFrame(render);
            renderer.render(scene, camera);
        }

        function initStats() {

            var stats = new Stats();

            stats.setMode(0); // 0: fps, 1: ms
            stats.domElement.style.position = ‘absolute‘;
            stats.domElement.style.left = ‘0px‘;
            stats.domElement.style.top = ‘0px‘;

            document.getElementById("Stats-output").appendChild(stats.domElement);

            return stats;
        }
    }
    window.onload = init;
</script>
</body>
</html>

原文地址:https://www.cnblogs.com/shuaihan/p/9881031.html

时间: 2024-11-05 18:53:54

19-THREE.JS 混合材质的相关文章

vray学习笔记(4)混合材质是个什么东西

看下定义: The Blend material lets you mix two materials on a single side of the surface. Blend material材质的出现时为了解决怎么将两种材质混合的问题而出现的. 混合材质一般用在什么地方呢? 我所了解的是游戏地形方面会用到,我做了一个demo,可以看下效果. 它是由两个材质构成的,一个是黄土的材质,一个是绿草地的材质,看下材质编辑器里面是个什么情况. 上面就是混合材质的直观感受,我们再回顾下定义,"将两个

Three.js开发指南---使用three.js的材质(第四章)

材质就像物体的皮肤,决定了几何体的外表,例如是否像草地/金属,是否透明,是否显示线框等 一 材质 THREE.js的材质分为多种,Three.js提供了一个材质基类THREE.Material, 该基类拥有three.js所有材质的公有属性,分为三类:基础属性,融合属性,高级属性 基础属性:ID,name,透明度,是否可见,是否需要刷新等 融合属性:决定了物体如何与背景融合 高级属性:可以控制WEBGL上下文渲染物体的方法,大多数情况下,是不会用这些属性,我们这里不再讨论 1.1 基础属性 属性

js混合计算字符串字节长度

js混合计算字符串字节长度 function getBt(str) { if (str.length > 0) { var char = str.match(/[^\x00-\xff]/ig); return str.length + (char == null ? 0 : char.length); } else { return 0; } } 用法:直接调用getBt('计算我的字节长度');

three.js各种材质的实现源码

three.js常用材质:基本材质.兰伯特材质.冯氏材质.标准材质. 我们可以自己使用着色器实现这些材质,用于批量渲染等用途. 为了简单,假设物体只有一张漫反射贴图,场景中只存在一个环境光和一个平行光. 一.基本材质(MeshBasicMaterial) 基本材质不对光源产生反应. 顶点着色器 varying vec2 vUv; void main() { vUv = uv; vec3 transformed = vec3( position ); vec4 mvPosition = model

使用Three.js的材质

1.three.js提供哪些材质? MeshBasicMaterial(网格基础材质)/基础材质,,可以用它富裕几何体一种简单的亚瑟,或者显示几何体的线框 MeshDepthMaterial(网格深度材质)/根据网格到相机的举例,这种材质决定如何给网格染色 MeshNormalMaterial(网格法向材质)/这是一种简单的材质,根据物体表面的方向向量计算颜色 MeshFaceMaterial(网格面材质)/这是一个容器,可以在这个容器里为物体的各个表面指定不同的颜色 MeshLambertMa

OC与JS混合开发

随着iOS开发的成本增大,越来越多的公司开始使用html5混合开发软件了,因为使用原生的开发花费的成本跟时间都很大,而使用html5来搭建界面会方便很多,效率相对而言也提高了.虽然使用UIWebView实现的交互效果与原生效果相比还是会大打折扣,这类界面通常没有复杂的交互效果,所以现在主流应用大多采用混合开发.花了几天时间,把JS的基础全部看了一遍,又研究了一下巧神的书,写了一个iOS7以前的JS与OC混合开发的demo. 既然是html5页面搭建的布局,那么肯定是得有html5页面的,所以首先

17-THREE.JS 基本材质

<!DOCTYPE html> <html> <head> <title></title> <script src="https://cdn.bootcss.com/three.js/r67/three.js"></script> <script src="https://cdn.bootcss.com/stats.js/r10/Stats.min.js"></sc

JS的使用

Javascript代码在浏览器中运行,做出更流畅.优美的页面效果,增强用户体验与java是完全不同的东西,只是名称类似而已写在<script></script>标签中 大小写敏感弱类型语言分号结尾注释(单行,多行)字符串推荐使用单引号,也可以使用双引号 用于处理日期和时间 Date创建对象:var date=new Date();看文档 JavaScript Date 对象参考手册方法toLocaleTimeString()表示根据本地时间格式,把 Date 对象的时间部分转换为

js五种设计模式说明与示例

第一种模式:js工厂模式 var lev=function(){         return "啊打";      };      function Parent(){             var  Child = new Object();             Child.name="李小龙";             Child.age="30";             Child.lev=lev;           retur