依据第一节的原理,可以看出基于three.js的三维与纯webgl的逻辑大致是相同的,但是three.js帮我们省去了很多工作,这就是框架的意义。
构建顺序:
获取canvas元素;
创建three渲染器
创建三维场景
设置画图区域及容器大小。
创建相机、光源、纹理
渲染场景,加载下一帧。
requestAnimationFrame()函数目前还不能理解,将此函数放在onload中,反复刷新网页,
会发现贴图交替变换,刷新的越快,有可能会前后两次不变(与电脑刷新频率有关),在控制台加上一句打印之后,发现这个run函数在无限循环执行,此后的动画效果应该也是这么做的。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to WebGL</title>
<script src="../libs/Three.js"></script>
<script>
var renderer = null,
scene = null,
camera = null,
cube = null,
animating = false;
function onLoad()
{
//获取canvas元素
var container = document.getElementById("container");
// 创建three.js渲染器
renderer = new THREE.WebGLRenderer( { antialias: true } );
//设置画图的大小为容器的大小,并将渲染器追加到元素中
renderer.setSize(container.offsetWidth, container.offsetHeight);
container.appendChild( renderer.domElement );
// 创建一个三维的场景
scene = new THREE.Scene();
// 创建相机,设置相机的位置
camera = new THREE.PerspectiveCamera( 45, container.offsetWidth / container.offsetHeight, 1, 4000 );
camera.position.set( 0, 0, 3 );
// 创建一个光源,光源的位置放在相机的正上方
var light = new THREE.DirectionalLight( 0xffffff, 1.5);
light.position.set(0, 0, 1);
scene.add( light );
// 创建一个纹理
var mapUrl = "../images/molumen_small_funny_angry_monster.jpg";
var map = THREE.ImageUtils.loadTexture(mapUrl);
// 将纹理赋值给材质
var material = new THREE.MeshPhongMaterial({ map: map });
// 创建立方体
var geometry = new THREE.CubeGeometry(1, 1, 1);
// 将几何体和材质放到一个网格中
cube = new THREE.Mesh(geometry, material);
// 设置网格的朝向,否则看不到立方体的形状
cube.rotation.x = Math.PI / 5;
cube.rotation.y = Math.PI / 5;
// 将三维模型添加到场景之中
scene.add( cube );
// Run our render loop
run();
}
function run()
{
//渲染场景
renderer.render( scene, camera );
console.log("xr")
// 请求下一帧,此函数为h5的知识,不属于webgl范畴,可以去了解一下。
requestAnimationFrame(run);
}
</script>
</head>
<body onLoad="onLoad();" style="">
<h1>Welcome to WebGL!</h1>
<div id="container" style="width:95%; height:80%; position:absolute;"></div>
<div id="prompt" style="width:95%; height:6%; bottom:0; text-align:center; position:absolute;">Click to animate the cube</div>
</body>
</html>