Three.js图形引擎代码知识库<一>

Three.js图形引擎代码知识库<一><6/1/2018>

首先先预览实例效果:


<补充知识>渲染有两种方式实时渲染离线渲染

先看看离线渲染,想想《西游降魔篇》中最后的佛主,他肯定不是真的,是电脑渲染出来的,其画面质量是很高的,它是事先渲染好一帧一帧的图片,然后再把图片拼接成电影的。这就是离线渲染。如果不事先处理好一帧一帧的图片,那么电影播放得会很卡。CPU和GPU根本没有能力在播放的时候渲染出这种高质量的图片。

实时渲染:就是需要不停的对画面进行渲染,即使画面中什么也没有改变,也需要重新渲染。

界面布局:


脚本代码:

第一框架:

<!DOCTYPE html>
<html>

<head>
    <title></title>
    <style>
        canvas {
            width: 100%;
            height: 100%
        }
    </style>
    <script src="js/three.js"></script>
</head>

<body>
    <script>
        //场景
        var scene = new THREE.Scene();

        //透视相机(THREE.PerspectiveCamera)
        var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

        //渲染器(决定了渲染的结果应该画在页面的什么元素上面,并且以怎样的方式来绘制)
        var renderer = new THREE.WebGLRenderer();

        //设置渲染器的大小为窗口的内宽度,也就是内容区的宽度
        renderer.setSize(window.innerWidth, window.innerHeight);

        //渲染器renderer的domElement元素,表示渲染器中的画布,所有的渲染都是画在domElement上的
        //所以这里的appendChild表示将这个domElement挂接在body下面,这样渲染的结果就能够在页面中显示了
        document.body.appendChild(renderer.domElement);
        //<HTML补充>  DOM是Document Object Model的英文缩写,翻译过来是文档对象模型,提供给Javascript用来动态修改文档状态
        //<HTML补充>  使用 Javascript 语言来操作 DOM 以改变网页。为了改变网页,你必须告诉 Javascript 改变哪一个节点。这就是操作 DOM
        //<HTML补充>  可以把 DOM 看成节点,整个 Html 文件就是 document 节点,DOM 定义了访问 HTML 和 XML 文档的标准:
        //<HTML补充>  “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

        var geometry = new THREE.CubeGeometry(1, 3, 1);
        //<Three.js补充>  关于方块CubeGeometry(width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides)
        //<Three.js补充>  width:立方体x轴的长度
        //<Three.js补充>  height:立方体y轴的长度
        //<Three.js补充>  depth:立方体z轴的深度,也就是长度

        var material = new THREE.MeshBasicMaterial({
            color: 0x00ff00
        });
        var cube = new THREE.Mesh(geometry, material);
        scene.add(cube);
        camera.position.z = 5;

        //下面就是一个渲染循环
        function render() {
            //(递归执行方法)requestAnimationFrame,这个函数就是让浏览器去执行一次参数中的函数
            requestAnimationFrame(render);
            cube.rotation.x += 0.1;
            // cube.rotation.y += 0.1;

            //渲染应该使用渲染器,结合相机和场景来得到结果画面
            renderer.render(scene, camera);
            //<Three.js补充>  渲染函数的原型如下:
            //<Three.js补充>  render( scene, camera, renderTarget, forceClear )
            //<Three.js补充>  各个参数的意义是:
            //<Three.js补充>  scene:前面定义的场景
            //<Three.js补充>  camera:前面定义的相机
            //<Three.js补充>  renderTarget:渲染的目标,默认是渲染到前面定义的render变量中
            //<Three.js补充>  forceClear:每次绘制之前都将画布的内容给清除,即使自动清除标志autoClear为false,也会清除。
        }
        render();
    </script>
</body>

</html>

第二框架:(重构)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Three框架</title>
		<script src="js/Three.js" data-ke-src="js/Three.js"></script>
		<style type="text/css">
			div#canvas-frame {
				border: none;
				cursor: pointer;
				width: 100%;
				height: 600px;
				background-color: #EEEEEE;
			}

		</style>
		<script>
            var renderer;
            function initThree() {
                width = document.getElementById('canvas-frame').clientWidth;
                height = document.getElementById('canvas-frame').clientHeight;
                renderer = new THREE.WebGLRenderer({
                    antialias : true
                });
                renderer.setSize(width, height);
                document.getElementById('canvas-frame').appendChild(renderer.domElement);
                renderer.setClearColor(0xFFFFFF, 1.0);
            }

            var camera;
            function initCamera() {
                camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000);
                camera.position.x = 0;
                camera.position.y = 1000;
                camera.position.z = 0;
                camera.up.x = 0;
                camera.up.y = 0;
                camera.up.z = 1;
                camera.lookAt({
                    x : 0,
                    y : 0,
                    z : 0
                });
            }

            var scene;
            function initScene() {
                scene = new THREE.Scene();
            }

            var light;
            function initLight() {
                light = new THREE.DirectionalLight(0xFF0000, 1.0, 0);
                light.position.set(100, 100, 200);
                scene.add(light);
            }

            var cube;
            function initObject() {

                var geometry = new THREE.Geometry();
                var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors} );
                var color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0xFF0000 );

                // 线的材质可以由2点的颜色决定
                var p1 = new THREE.Vector3( -100, 0, 100 );
                var p2 = new THREE.Vector3(  100, 0, -100 );
                geometry.vertices.push(p1);
                geometry.vertices.push(p2);
                geometry.colors.push( color1, color2 );

                var line = new THREE.Line( geometry, material, THREE.LinePieces );
                scene.add(line);
            }
            function render()
            {
                renderer.clear();
                renderer.render(scene, camera);
                requestAnimationFrame(render);
            }
            function threeStart() {
                initThree();
                initCamera();
                initScene();
                initLight();
                initObject();
                render();
            }

		</script>
	</head>

	<body onload="threeStart();">
		<div id="canvas-frame"></div>
	</body>
</html>


猜你喜欢

转载自blog.csdn.net/MaximilianLiu/article/details/78989337
今日推荐