上篇文章距现在有些时日了,不知大家还记得否?上次文章结束时代码应该是这样了:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>webgl互交测试</title>
- <style>
- *{
- padding: 0;
- margin: 0;
- }
- #b{
- width: 200px;
- height: 500px;
- background: #000;
- }
- </style>
- </head>
- <body>
- <div id="b">
- <div id="canvas-frame"></div>
- </div>
- <script src="three-js/build/three.js" data-ke-src="https://raw.github.com/mrdoob/three.js/master/build/three.js"></script>
- <script src="three-js/examples/js/libs/stats.min.js"></script>
- <script>
- function mythree(id){
- this.dom=document.getElementById(id);
- this.dom.style.width=window.innerWidth+"px";
- this.dom.style.height=window.innerHeight+"px";
- this.scene = new THREE.Scene();//场景
- this.camera=new THREE.PerspectiveCamera(75, this.dom.offsetWidth / this.dom.offsetHeight, 0.1, 1000);
- this.camera.position.set(0,200,0);
- this.camera.lookAt(this.scene.position);
- this.renderer = new THREE.WebGLRenderer();//渲染器
- this.renderer.setSize(this.dom.offsetWidth,this.dom.offsetHeight);//设置渲染器大小
- this.renderer.setClearColorHex(0x000000, 1);//设置渲染器颜色
- this.dom.appendChild(this.renderer.domElement);
- //document.body.appendChild(this.renderer.domElement);
- //this.camera.position.z = 180;//设置相机位置
- this.rander=(function (obj){
- return function(){
- obj.renderer.render(obj.scene, obj.camera);//渲染
- requestAnimationFrame(obj.rander);
- }
- })(this);
- this.rander();
- }
- var mt=new mythree('b');
- var c=new THREE.Mesh(
- new THREE.CubeGeometry(40,40,40),
- new THREE.MeshLambertMaterial({color: 0x0088ff})
- );//创建实物
- c.position.set(0,0,0);
- mt.scene.add(c);
- var light = new THREE.DirectionalLight(0xffffff,1.0,0); //设置平行光源
- light.position.set(200,100,200);//设置光源向量
- mt.scene.add(light); //追加光源到场景
- </script>
- </body>
- </html>
这次我们应该让场景动起来了。
首先我们简单的用onkeydown来实现键盘移动摄像头camera,首先我们要监听的是传入构造函数的dom的键盘事件(虽然监听全局的也可以,但是我希望如果以后一个页面嵌入多个画布呢?
我们在mythree中增加这样几行,
- var self=this;
- this.dom.onkeydown=function(ev){
- //alert(ev.keyCode);
- switch(ev.keyCode){
- case 65:
- self.camera.position.z++;
- break;
- case 68:
- self.camera.position.z--;
- break;
- case 87:
- self.camera.position.x--;
- break;
- case 83:
- slef.camera.position.x++;
- break;
- }
- }
当然我这里是用的wasd来控制,你们可以通过alert来试一下你想要的按键的值。
好了,确实是动起来了,不过似乎有点不对——其实方向并没有错,只是我们相当于盯着地板再看而已,所以方向是对的(之前这个把我头都弄大了,你们可以自己找一下有关webgl坐标系的资料看看)。不过因为以后加入鼠标函数后,方向会旋转,所以到时最终的实现还是有一定调整啦,不过不用急,我们一步步来,海是由无数的水滴积累而成,可不要小看了这一滴水哦。