Three.js学习笔记05

场景相关函数和属性

下面的代码中应用到了所有以上的函数及属性:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript"
            src="libs/three.js"></script>
    <script type="text/javascript"
            src="libs/stats.js"></script>
    <script type="text/javascript"
            src="libs/dat.gui.js"></script>
    <style>
        body{
            /*移除滚动条*/
            margin:0;
            overflow:hidden;
        }
    </style>
</head>
<body>
<div id="WebGL-output"></div>
<div id="Stats-output"></div>
<script type="text/javascript">
    function init(){
        var scene=new THREE.Scene();
        //scene.fog=new THREE.Fog(0xffffff,0.1,100);//颜色、近处、远处,越远浓度越高
        scene.fog=new THREE.FogExp2(0xffffff,0.015);//颜色、浓度

        var stats=new initStats();

        var camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,1,1000);
        camera.position.x=-30;
        camera.position.y=40;
        camera.position.z=30;
        camera.lookAt(scene.position);
        scene.add(camera);

        var renderer=new THREE.WebGLRenderer();
        renderer.setClearColor(0xFFFFFF,1.0);
        renderer.setSize(window.innerWidth,window.innerHeight);
        renderer.shadowMapEnabled=true;

        var planeGeometry=new THREE.PlaneGeometry(60,50,1,1);
        var planeMaterial=new THREE.MeshLambertMaterial({color:0xffffff});
        var plane=new THREE.Mesh(planeGeometry,planeMaterial);
        plane.rotation.x = -0.5 * Math.PI;
        plane.position.x = 0;
        plane.position.y = 0;
        plane.position.z = 0;
        plane.receiveShadow=true;
        scene.add(plane);

        var spotLight=new THREE.SpotLight(0xffffff);
        spotLight.position.set(-30,80,-10);
        spotLight.castShadow=true;//此光源产生阴影
        scene.add(spotLight);

        var ambientLight=new THREE.AmbientLight(0x0a0a0a);
       // ambientLight.castShadow=true;//此光源产生阴影
        scene.add(ambientLight);

        document.getElementById("WebGL-output").appendChild(renderer.domElement);

        var controls=new function(){
            this.rotationSpeed=0.02;
            this.numberOfObjects = scene.children.length;

            this.addCube=function(){
                var cubeSize = Math.ceil((Math.random() * 3));
                var cubeGeometry=new THREE.CubeGeometry(cubeSize,cubeSize,cubeSize);
                var cubeMaterial=new THREE.MeshLambertMaterial({color:Math.random()*0xffffff});
                var cube=new THREE.Mesh(cubeGeometry,cubeMaterial);
                cube.castShadow=true;
                cube.name="cube-"+scene.children.length;
                cube.position.x=-30+Math.round(Math.random()*planeGeometry.parameters.width);
                cube.position.y=Math.round(Math.random()*5);
                cube.position.z=-25+Math.round(Math.random()*planeGeometry.parameters.height);
                scene.add(cube);
                this.numberOfObjects=scene.children.length;
            };

            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.outputObjects = function () {
                console.log(scene.children);
            };

        };

       // scene.overrideMaterial=new THREE.MeshLambertMaterial({color:0xffffff});//设置所有物体的材质属性

        var gui=new dat.GUI();
        gui.add(controls,‘rotationSpeed‘,0,1.0);//范围为0-0.5
        gui.add(controls, ‘addCube‘);
        gui.add(controls, ‘removeCube‘);
        gui.add(controls, ‘outputObjects‘);
        gui.add(controls, ‘numberOfObjects‘).listen();

        render ();

        function render() {
            stats.update();
            scene.traverse(function (e) {//将一个函数作为参数传递进来,这个传递进来的函数将会在场景的每一个子对象上调用一次
                if (e instanceof THREE.Mesh && e != plane) {
                    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/yhhzxcvbnm/p/8287447.html

时间: 2024-11-02 18:47:21

Three.js学习笔记05的相关文章

js 学习笔记 05

DOM 对象的 clientHeight 包括:content+padding,offsetHeight 包括:content+padding+border /** * 禁止输入汉字 */ appUtils.bindEvent($(_pageId+" #test"),function(e){ e = window.event || e; if(!/[\u4e00-\u9fa5]+/.test(e.data)) { return false; } e.stopPropagation();

Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> <script src="https://cdn.bootcss.com/vue/2.2.

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

[Pro Angular.JS]学习笔记1.1:设置开发环境

可以使用yeoman.io,很方便.我已经写了一篇随笔,介绍如何使用.这里也有一篇介绍的文章:http://www.cnblogs.com/JoannaQ/p/3756281.html 代码编辑器,在Mac下用了一下WebStorm,太恶心了.另外发现书的作者使用的开发环境是Windows + VS Express 2013,为了方便学习,我也使用VS Express 2013 Update2.VS2013用起来蛮舒服的,把WebStorm比得跟驼屎一样.也许是因为我没用习惯吧. 1.安装Nod

【转】Backbone.js学习笔记(二)细说MVC

文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Backbone源码结构 1: (function() { 2: Backbone.Events // 自定义事件 3: Backbone.Model // 模型构造函数和原型扩展 4: Backbone.Collection // 集合构造函数和原型扩展 5: Backbone.Router // 路由

Angular JS 学习笔记

特定领域语言 编译器:遍历DOM来查找和它相关的属性, 分为编译和链接两个阶段, 指令:当关联的HTML结构进入编译阶段时应该执行的操作,可以写在名称里,属性里,css类名里:本质上是函数 稳定的DOM:绑定了数据模型的DOM元素的实例不会在绑定的生命周期发生改变 作用域:用来检测模型的改变和为表达式提供执行上下文的 AngularJS 和其它模板系统不同,它使用的是DOM而不是字符串 指令: 由某个属性.元素名称.css类名出现而导致的行为,或者说是DOM的变化 Filter过滤器:扮演着数据

Node.js学习笔记(3) - 简单的curd

这个算是不算完结的完结吧,前段时间也是看了好久的Node相关的东西,总想着去整理一下,可是当时也没有时间: 现在看来在整理的话,就有些混乱,自己也懒了,就没在整理,只是简单的记录一下 一.demo的简单介绍 这次demo,只涉及到简单的curd操作,用到的数据库是mongo,所以要安装mongo数据库,数据库连接驱动是mongoose: 当然关于mongo的驱动有很多,比如mongous mongoskin等:(详见http://cnodejs.org/topic/4f4ca8e0940ce2e

JS学习笔记-OO疑问之封装

封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 匿名函数 即没有名字的函数,其创建方式为 function(){...} 单独存在的匿名函数,无法运行,可通过赋值给变量调用或通过表达式自我执行来实现运行. 1.赋值给变量为一般的函数使用方式 var run = function(){ return '方法运行中'; }; alert(run()); 2.通过表达式自我执行 (function(a

每日js学习笔记2014.5.4

<script language="javascript">var mystring = "这是第一个正则表达式的例子";var myregex = new RegExp("这是"); //创建正则表达式if (myregex.test(mystring)) //test的功能是查找字符串中是否有匹配项,有则返回true,没有则返回false{ document.write ("找到了指定的模式");}else{