zoukankan      html  css  js  c++  java
  • 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历。(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~)

    ----------------------------------------------------------------分界线------------------------------------------------------------------

    (顺便请教一下,分界线应该怎么弄才好看,每次调半天才合适!!!)

    工程开始:

      1、目标:利用WebGL的第三方js库,three.js写一个简单的网页版“我的世界小游戏”。

        (当时定了这个题目之后我就后悔了,我这个菜鸟做一个这个还是有点难度的。)

      2、准备工作:

        1)首先了解一下three.js,其次你要了解一个最简单的demo的生成方式,这里我就转载一篇我们博客园博友的文章:【three.js详解之一】入门篇

           (我不知道能不能转载博友的文章,我私信他了,但还是没回,我相信他还是应该能接受的吧。)

          2)参考一下官方给出的一些three.js的例子,有些还是挺有意思的,【官方例子】

          3)其实还是要求一定的web基础的,懂一些html,JavaScript。

      3、进行时:

        1)html部分我就不详细讲解了,我就讲解一下重点的部分,首先我们需要引入两个js文件,three.js和Detector.js,第二个js文件的作用:Detector是一个探测器,用来探测WebGL的支持情况。

    1 <script>
    2     if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
    3 </script>

         2)我们需要搭建一个场景,在我转载的博友的文章中,有详细的说明,这里我也简单的提一下。

          我把我的渲染器定义成了一个函数,然后通过函数的调用实现场景的布置。函数代码如下:

          (很多的代码我原来都不懂什么意思,注释都是我百度每一条什么意思然后添加上去的,希望可以帮助到大家)

          这里有几点需要注意:

          ①这里不是通过常规的添加html标签进行网页的设计,而是通过createElement的方法添加标签。

          ②渲染器、相机camera、场景scene、光源light、物体object是基本的五个部分。

          ③对于我添加的五个button按钮,他对应的有五个onclick事件,通过button的内容大家也不难看出来,其实每个事件对应的一个图形,玩过我的世界的人都应该知道,里面的工具很多,但是我就简单的添加了四个不一样的形状,因此我将五个method()函数封装了起来,然后通过统一的onclick点击调用实现形状的切换。

          ④最下面有四个分别对鼠标和shift按键的监听事件,字面意思很好理解,大家可以看一下,实现的函数将会在下面展示出来。

     1 <script>
     2                 function init(){
     3 
     4                 container = document.createElement( 'div' );//使用createElement创建一个div,就是整个页面
     5                 document.body.appendChild( container );//添加子节点
     6 
     7                 var info = document.createElement( 'div' );//在大的div中创建第一个div,表示head部分,名字为info
     8                 info.style.position = 'absolute';
     9                 info.style.top = '10px';
    10                 info.style.width = '100%';
    11                 info.style.textAlign = 'center';
    12                 info.innerHTML = '计算机图形学作业:简单模拟我的世界<br><strong>shift + click</strong>:移除图形<br>' +
    13                 '<button class="btn1" onclick="method1()">正方体</button><button class="btn2" onclick="method2()">球体</button>' +
    14                 '<button class="btn3" onclick="method3()">长方体</button><button class="btn4" onclick="method4()">圆柱体</button>' +
    15                 '<br><button class="btn5" onclick="method5()">预览</button>';
    16                 container.appendChild( info );//将创建的info添加到大的div中
    17 
    18                 camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 10000 );//设置透视投影的相机
    19                 camera.position.set( 500, 800, 1300 );//设置相机坐标
    20                 camera.lookAt( new THREE.Vector3() );//设置视野的中心坐标
    21 
    22                 scene = new THREE.Scene();//设置场景,场景是一个三维空间,用Scene类声明一个对象scene
    23                 // grid,定义画布上的坐标格子
    24                 var size = 500, step = 50;
    25                 var geometry = new THREE.Geometry();//创建一个基本的几何形状
    26                 for ( var i = - size; i <= size; i += step ) {
    27                     geometry.vertices.push( new THREE.Vector3( - size, 0, i ) );
    28                     geometry.vertices.push( new THREE.Vector3(   size, 0, i ) );
    29                     geometry.vertices.push( new THREE.Vector3( i, 0, - size ) );
    30                     geometry.vertices.push( new THREE.Vector3( i, 0,   size ) );
    31                 }
    32                 var material = new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2, transparent: true } );
    33                 //创建一个线条材质,线条颜色黑色,透明度0.2
    34                 var line = new THREE.LineSegments( geometry, material );
    35                 scene.add( line );
    36                 raycaster = new THREE.Raycaster();
    37                 mouse = new THREE.Vector2();
    38                 var geometry = new THREE.PlaneBufferGeometry( 1000, 1000 );
    39                 geometry.rotateX( - Math.PI / 2 );
    40                 plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
    41                 scene.add( plane );
    42                 objects.push( plane );
    43                 // 创建环境光为灰色
    44                 var ambientLight = new THREE.AmbientLight( 0x606060 );
    45                 scene.add( ambientLight );
    46                 //创建平行光为白色
    47                 var directionalLight = new THREE.DirectionalLight( 0xffffff );
    48                 directionalLight.position.set( 1, 0.75, 0.5 ).normalize();
    49                 scene.add( directionalLight );
    50 
    51                 renderer = new THREE.WebGLRenderer( { antialias: true } );//生成渲染器对象,锯齿效果为true
    52                 renderer.setClearColor( 0xf0f0f0 );
    53                 renderer.setPixelRatio( window.devicePixelRatio );
    54                 renderer.setSize( window.innerWidth, window.innerHeight );
    55                 container.appendChild( renderer.domElement );
    56                 document.addEventListener( 'mousemove', onDocumentMouseMove, false );//鼠标移动事件
    57                 document.addEventListener( 'mousedown', onDocumentMouseDown, false );//鼠标点击事件
    58                 document.addEventListener( 'keydown', onDocumentKeyDown, false );//对shift按键的控制
    59                 document.addEventListener( 'keyup', onDocumentKeyUp, false );//对shift按键的控制
    60                 window.addEventListener( 'resize', onWindowResize, false );//窗口改变事件
    61             }
    62 
    63 </script>

        可以先给大家看一看整个场景布置出来的效果:(很普通的一个格子状)

        

         3)这里引出一个问题,我们在点击选择了图形之后,我们需要一个选择的图形的预览,就跟随在你鼠标的左上方,时刻的提醒着你选择的是什么图形,说的有点抽象,我们看个实际图形吧!旁边那个虚虚的就是跟随在鼠标左右的,左边那个是实体,你的鼠标移动到那里,那个虚虚的就会跟随到那里。现在我们就实现一个功能,就以正方体为例子吧!

          

        代码如下:

     1 <script>
     2     function methodfollow1(){
     3                 // 这个几何对象是鼠标在移动时候,跟随鼠标显示的几何对象
     4                 rollOverGeo = new THREE.BoxGeometry( 50, 50, 50 );//创建一个盒状几何对象
     5                 rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
     6                 //创建一个色彩为红色的材料,透明度为半透明
     7                 rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
     8                 //通过mesh方法把颜色应用到几何对象上
     9                 scene.add( rollOverMesh );
    10                 //最后把该立方体对象添加到场景scene中
    11             }
    12 </script>

         4)现在我们的跟随预览实现了,那么下面需要实现的就是我们添加到画布格子中的一个个图形了,还是以正方体为例子吧!直接看代码吧。

          注意:里面引用了methodfollow1()函数,很好理解,每个图形对应不同的实体和不同的跟随预览。还有一点需要注意是这个函数是你点击了button出发的click事件(两个)。

    1 <script>
    2    function method1(){
    3                 methodfollow1();
    4                 // 实体对象,就是鼠标点击确定之后的实体对象,并且实体对象的图片引入
    5                 cubeGeo = new THREE.BoxGeometry( 50, 50, 50 );
    6                 cubeMaterial = new THREE.MeshLambertMaterial( { color: 0xfeb74c, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" ) } );
    7             } 
    8 </script>   

         5)正方体的实体和跟随预览的函数都写好了,这里需要讲两点:

           ①实体的四个函数和跟随预览的四个函数(当然你有多少个形状就写多少个函数,也可以统一封装成类进行调用),定义函数的方法是一样的,就像高中的同理可得。但是用到的图形函数不一样,我给大家简单列举几个吧,大家也可以去看看这个:点击我,关于函数的参数,大家可以自己去百度一下,这样自己理解的更快一点而且深刻。

     1 <script>
     2     THREE.CubeGeometry(width, height, depth, widthSegments, heightSegments, depthSegments)//立方体
     3     THREE.PlaneGeometry(width, height, widthSegments, heightSegments)//平面
     4     THREE.SphereGeometry(radius, segmentsWidth, segmentsHeight, phiStart, phiLength, thetaStart, thetaLength)//球体
     5     THREE.CircleGeometry(radius, segments, thetaStart, thetaLength)//圆形
     6     THREE.CylinderGeometry(radiusTop, radiusBottom, height, radiusSegments, heightSegments, openEnded)//圆柱体
     7     THREE.TetrahedronGeometry(radius, detail)//正四面体
     8     THREE.OctahedronGeometry(radius, detail)//正八面体
     9     THREE.IcosahedronGeometry(radius, detail)//正二十面体
    10     THREE.TorusGeometry(radius, tube, radialSegments, tubularSegments, arc)//圆环面
    11 </script>

          ②每一个button的click事件对应的method函数都需要先进行调用methodfollow函数,因为创建跟随预览是在创建实体之先。

         6)接下来讲一讲前面留下的四个监听事件。功能分别如下:

    1 onDocumentMouseMove:鼠标移动时发生的事件,主要是跟随预览
    2 onDocumentMouseDown:鼠标点击确定发生的事件,主要是实体
    3 onDocumentKeyDown
    4 onDocumentKeyUp    :这两个函数是对shift的控制,在我们添加错了图形之后,可以按下shift键来进行错误图形的删除

           实现的代码如下(实现的方法很多种,大家可以自由发挥):

     1 <script>
     2                 function onDocumentMouseMove( event ) {
     3                 event.preventDefault();//取消事件的默认动作
     4                 mouse.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1 );
     5                 raycaster.setFromCamera( mouse, camera );
     6                 var intersects = raycaster.intersectObjects( objects );
     7                 if ( intersects.length > 0 ) {
     8                     var intersect = intersects[ 0 ];
     9                     rollOverMesh.position.copy( intersect.point ).add( intersect.face.normal );
    10                     rollOverMesh.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
    11                 }
    12                 render();
    13             }
    14             function onDocumentMouseDown( event ) {
    15                 event.preventDefault();
    16                 mouse.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1 );
    17                 raycaster.setFromCamera( mouse, camera );
    18                 var intersects = raycaster.intersectObjects( objects );
    19                 if ( intersects.length > 0 ) {
    20                     var intersect = intersects[ 0 ];
    21                     // delete cube
    22                     if ( isShiftDown ) {
    23                         if ( intersect.object != plane ) {
    24                             scene.remove( intersect.object );
    25                             objects.splice( objects.indexOf( intersect.object ), 1 );
    26                         }
    27                     // create cube
    28                     } else {
    29                         var voxel = new THREE.Mesh( cubeGeo, cubeMaterial );
    30                         voxel.position.copy( intersect.point ).add( intersect.face.normal );
    31                         voxel.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
    32                         scene.add( voxel );
    33                         objects.push( voxel );
    34                     }
    35                     render();
    36                 }
    37             }
    38             function onDocumentKeyDown( event ) {
    39                 switch( event.keyCode ) {
    40                     case 16: isShiftDown = true; break;
    41                 }
    42             }
    43             function onDocumentKeyUp( event ) {
    44                 switch ( event.keyCode ) {
    45                     case 16: isShiftDown = false; break;
    46                 }
    47             }
    48 </script>

        7)这样一来,我们基本的大模块都已经完成了,那么接下来我们就看看我们的成果吧,很激动!(左边的四个形状的预览,是我后面添加的,利用几个html标签就行了)

     4、结束总结

        1、我把我的源代码贴出来吧!(可千万不要问我:我复制了源代码为什么预览不出来啊!!)

      1 <!DOCTYPE html>
      2 <html lang="en">
      3     <head>
      4         <title>three.js webgl - interactive - voxel painter</title>
      5         <meta charset="utf-8">
      6         <title>opengl实现我的世界</title>
      7         <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
      8         <style>
      9             body {
     10                 font-family: Monospace;
     11                 background-color: #f0f0f0;
     12                 margin: 0px;
     13                 overflow: hidden;
     14             }
     15             #aa{
     16                 font-size: 10px;
     17             }
     18 
     19             #oldie { background-color: #ddd !important }
     20         </style>
     21     </head>
     22     <body>
     23         <a id="aa">正方体</a>
     24         <img src="textures/zhengfangti.png">
     25         <a id="aa">球体</a>
     26         <img src="textures/qiuti.png">
     27         <a id="aa">长方体</a>
     28         <img src="textures/changfangti.png">
     29         <a id="aa">圆柱体</a>
     30         <img src="textures/yuanzhuti.png">
     31         <script src="../build/three.js"></script>
     32         <script src="js/Detector.js"></script>
     33         <script src="js/jquery-2.2.4.min.js"></script>
     34         <script>
     35             if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
     36             //detector是一个探测器,引用了detector.js,用来探测webgl的支持情况
     37 
     38             var container;
     39             var camera, scene, renderer;
     40             var plane, cube;
     41             var mouse, raycaster, isShiftDown = false;
     42 
     43             var rollOverMesh, rollOverMaterial;
     44             var cubeGeo, cubeMaterial;
     45 
     46             var objects = [];
     47 
     48             init();
     49             render();//渲染
     50 
     51 
     52 
     53             function init(){
     54 
     55                 container = document.createElement( 'div' );//使用createElement创建一个div,就是整个页面
     56                 document.body.appendChild( container );//添加子节点
     57 
     58                 var info = document.createElement( 'div' );//在大的div中创建第一个div,表示head部分,名字为info
     59                 info.style.position = 'absolute';
     60                 info.style.top = '10px';
     61                 info.style.width = '100%';
     62                 info.style.textAlign = 'center';
     63                 info.innerHTML = '计算机图形学作业:简单模拟我的世界<br><strong>shift + click</strong>:移除图形<br>' +
     64                 '<button class="btn1" onclick="method1()">正方体</button><button class="btn2" onclick="method2()">球体</button>' +
     65                 '<button class="btn3" onclick="method3()">长方体</button><button class="btn4" onclick="method4()">圆柱体</button>' +
     66                 '<br><button class="btn5" onclick="method5()">预览</button>';
     67                 container.appendChild( info );//将创建的info添加到大的div中
     68 
     69                 camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 10000 );//设置透视投影的相机
     70                 camera.position.set( 500, 800, 1300 );//设置相机坐标
     71                 camera.lookAt( new THREE.Vector3() );//设置视野的中心坐标
     72 
     73                 scene = new THREE.Scene();//设置场景,场景是一个三维空间,用Scene类声明一个对象scene
     74                 // grid,定义画布上的坐标格子
     75                 var size = 500, step = 50;
     76                 var geometry = new THREE.Geometry();//创建一个基本的几何形状
     77                 for ( var i = - size; i <= size; i += step ) {
     78                     geometry.vertices.push( new THREE.Vector3( - size, 0, i ) );
     79                     geometry.vertices.push( new THREE.Vector3(   size, 0, i ) );
     80                     geometry.vertices.push( new THREE.Vector3( i, 0, - size ) );
     81                     geometry.vertices.push( new THREE.Vector3( i, 0,   size ) );
     82                 }
     83                 var material = new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2, transparent: true } );
     84                 //创建一个线条材质,线条颜色黑色,透明度0.2
     85                 var line = new THREE.LineSegments( geometry, material );
     86                 scene.add( line );
     87                 raycaster = new THREE.Raycaster();
     88                 mouse = new THREE.Vector2();
     89                 var geometry = new THREE.PlaneBufferGeometry( 1000, 1000 );
     90                 geometry.rotateX( - Math.PI / 2 );
     91                 plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
     92                 scene.add( plane );
     93                 objects.push( plane );
     94                 // 创建环境光为灰色
     95                 var ambientLight = new THREE.AmbientLight( 0x606060 );
     96                 scene.add( ambientLight );
     97                 //创建平行光为白色
     98                 var directionalLight = new THREE.DirectionalLight( 0xffffff );
     99                 directionalLight.position.set( 1, 0.75, 0.5 ).normalize();
    100                 scene.add( directionalLight );
    101 
    102                 renderer = new THREE.WebGLRenderer( { antialias: true } );//生成渲染器对象,锯齿效果为true
    103                 renderer.setClearColor( 0xf0f0f0 );
    104                 renderer.setPixelRatio( window.devicePixelRatio );
    105                 renderer.setSize( window.innerWidth, window.innerHeight );
    106                 container.appendChild( renderer.domElement );
    107                 document.addEventListener( 'mousemove', onDocumentMouseMove, false );//鼠标移动事件
    108                 document.addEventListener( 'mousedown', onDocumentMouseDown, false );//鼠标点击事件
    109                 document.addEventListener( 'keydown', onDocumentKeyDown, false );//对shift按键的控制
    110                 document.addEventListener( 'keyup', onDocumentKeyUp, false );//对shift按键的控制
    111                 window.addEventListener( 'resize', onWindowResize, false );//窗口改变事件
    112             }
    113 
    114 
    115 
    116             //把创建鼠标跟随几何图形和实体图形都抽象成函数,通过点击事件进行调用
    117             function method1(){
    118                 methodfollow1();
    119                 // 实体对象,就是鼠标点击确定之后的实体对象,并且实体对象的图片引入
    120                 cubeGeo = new THREE.BoxGeometry( 50, 50, 50 );
    121                 cubeMaterial = new THREE.MeshLambertMaterial( { color: 0xfeb74c, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" ) } );
    122             }
    123             function method2(){
    124                 methodfollow2();
    125                 // 实体对象,就是鼠标点击确定之后的实体对象,并且实体对象的图片引入
    126                 cubeGeo = new THREE.SphereGeometry( 50, 10, 10 );
    127                 cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x4D662D/*, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" )*/ } );
    128             }
    129             function method3(){
    130                 methodfollow3();
    131                 // 实体对象,就是鼠标点击确定之后的实体对象,并且实体对象的图片引入
    132                 cubeGeo = new THREE.CubeGeometry( 50, 100, 50 );
    133                 cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x4D662D, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" ) } );
    134             }
    135             function method4(){
    136                 methodfollow4();
    137                 // 实体对象,就是鼠标点击确定之后的实体对象,并且实体对象的图片引入
    138                 cubeGeo = new THREE.CylinderBufferGeometry( 25,25, 100, 50 ,50);
    139                 cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x4D662D, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" ) } );
    140             }
    141             function method5(){
    142                 window.open("newwindows.html","_blank","resizable=yes,scrollbars=yes,titlebar=yes,windth=800,height=800");
    143             }
    144 
    145             function methodfollow1(){
    146                 // 这个几何对象是鼠标在移动时候,跟随鼠标显示的几何对象
    147                 rollOverGeo = new THREE.BoxGeometry( 50, 50, 50 );//创建一个盒状几何对象
    148                 rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
    149                 //创建一个色彩为红色的材料,透明度为半透明
    150                 rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
    151                 //通过mesh方法把颜色应用到几何对象上
    152                 scene.add( rollOverMesh );
    153                 //最后把该立方体对象添加到场景scene中
    154             }
    155             function methodfollow2(){
    156                 // 这个几何对象是鼠标在移动时候,跟随鼠标显示的几何对象
    157                 rollOverGeo = new THREE.SphereGeometry( 50, 10, 10 );//创建一个盒状几何对象
    158                 rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
    159                 //创建一个色彩为红色的材料,透明度为半透明
    160                 rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
    161                 //通过mesh方法把颜色应用到几何对象上
    162                 scene.add( rollOverMesh );
    163                 //最后把该立方体对象添加到场景scene中
    164             }
    165             function methodfollow3(){
    166                 // 这个几何对象是鼠标在移动时候,跟随鼠标显示的几何对象
    167                 rollOverGeo = new THREE.CubeGeometry( 50, 100, 50 );//创建一个盒状几何对象
    168                 rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
    169                 //创建一个色彩为红色的材料,透明度为半透明
    170                 rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
    171                 //通过mesh方法把颜色应用到几何对象上
    172                 scene.add( rollOverMesh );
    173                 //最后把该立方体对象添加到场景scene中
    174             }
    175             function methodfollow4(){
    176                 // 这个几何对象是鼠标在移动时候,跟随鼠标显示的几何对象
    177                 rollOverGeo = new THREE.CylinderGeometry( 25,25 ,100, 50,50 );//创建一个盒状几何对象
    178                 rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
    179                 //创建一个色彩为红色的材料,透明度为半透明
    180                 rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
    181                 //通过mesh方法把颜色应用到几何对象上
    182                 scene.add( rollOverMesh );
    183                 //最后把该立方体对象添加到场景scene中
    184             }
    185 
    186 
    187             function onWindowResize() {
    188 
    189                 camera.aspect = window.innerWidth / window.innerHeight;
    190                 camera.updateProjectionMatrix();
    191 
    192                 renderer.setSize( window.innerWidth, window.innerHeight );
    193 
    194             }
    195 
    196             function onDocumentMouseMove( event ) {
    197                 event.preventDefault();//取消事件的默认动作
    198                 mouse.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1 );
    199                 raycaster.setFromCamera( mouse, camera );
    200                 var intersects = raycaster.intersectObjects( objects );
    201                 if ( intersects.length > 0 ) {
    202                     var intersect = intersects[ 0 ];
    203                     rollOverMesh.position.copy( intersect.point ).add( intersect.face.normal );
    204                     rollOverMesh.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
    205                 }
    206                 render();
    207             }
    208             function onDocumentMouseDown( event ) {
    209                 event.preventDefault();
    210                 mouse.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1 );
    211                 raycaster.setFromCamera( mouse, camera );
    212                 var intersects = raycaster.intersectObjects( objects );
    213                 if ( intersects.length > 0 ) {
    214                     var intersect = intersects[ 0 ];
    215                     // delete cube
    216                     if ( isShiftDown ) {
    217                         if ( intersect.object != plane ) {
    218                             scene.remove( intersect.object );
    219                             objects.splice( objects.indexOf( intersect.object ), 1 );
    220                         }
    221                     // create cube
    222                     } else {
    223                         var voxel = new THREE.Mesh( cubeGeo, cubeMaterial );
    224                         voxel.position.copy( intersect.point ).add( intersect.face.normal );
    225                         voxel.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
    226                         scene.add( voxel );
    227                         objects.push( voxel );
    228                     }
    229                     render();
    230                 }
    231             }
    232             function onDocumentKeyDown( event ) {
    233                 switch( event.keyCode ) {
    234                     case 16: isShiftDown = true; break;
    235                 }
    236             }
    237             function onDocumentKeyUp( event ) {
    238                 switch ( event.keyCode ) {
    239                     case 16: isShiftDown = false; break;
    240                 }
    241             }
    242             function render() {
    243 
    244                 renderer.render( scene, camera );
    245 
    246             }
    247 
    248         </script>
    249     </body>
    250 </html>
    源代码

        2、其实这个小程序没什么多大的难度,主要是娱乐一下,可能有些大神能做出更好的,当然,我要是做的很好,我为什么还在上学呢,哈哈!

        3、这里又一个小小的私心,每次看到博客园的很多大牛,都是粉丝很多很多,我看了看我自己的只有3个,额,我的意思是希望大家相互关注一下,以后有什么好的博客,大家也能及时的看到!嘿嘿,不过这不是打广告,只是我感觉每次有个人关注我之后,我都兴奋了好几个小时,然后我也会关注他。

        4、大家有什么好的建议和意见都可以提出来,我都虚心接受的,我接触的东西肯定没有广大的博友多,希望大家相互照顾!谢谢。看了看时间:2016年6月25日凌晨3:34,从11点多开始写,改了很多地方,怕自己的东西大家看了不喜欢,我会努力的!该睡觉了,10点钟还有课呢,头疼/(ㄒoㄒ)/~~

     

    博客园:爱家人爱老婆的IT男 QQ群:145252709,我会上传资源,同时会有很多大神跟你们讨论学习分享 微信公众号:程序猿的野生香蕉【获取文章中出现的工具】
  • 相关阅读:
    Git for windows(Msysgit)中文乱码
    DB2嵌入式编程,语句“EXEC SQL INCLUDE”说明
    《DB2 最佳实践: 性能调优和问题诊断最佳实践,第 1 部分》阅读笔记
    android sdk setup时出现:Failed to fetch URL...
    Git GUI启动报错问题记录
    安全快门
    在VFP6中模拟CursorAdapter的功能
    调试asp.net网页时不显示treeview的原因
    XP机器上WCF采用X509证书加密时IIS读取证书的授权
    在SQLSERVER2008中建立数据库复制碰到的问题
  • 原文地址:https://www.cnblogs.com/bokeyuanlibin/p/5615710.html
Copyright © 2011-2022 走看看