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>