three.js基础学习

本文介绍了在JavaScript中使用Three.js创建3D场景的基础步骤,包括设置场景、摄像机、渲染器,实现动画、添加光源和阴影效果。通过实例演示了如何从平面效果到带有阴影的3D立方体的渐进过程。
摘要由CSDN通过智能技术生成

javascript中使用Three.js设计并且实现3D场景是一个很有意思的事情,因为在浏览器中就能够渲染出3D场景,非常简单和轻便。接下来就总结以下我学习Three.js过程中的心得。

1 建立基本场景

Three.js中有三要素:场景、摄像机和渲染器,只有以上三者结合才能渲染出可见的内容。当然在这之前你需要先下载Three.js文件,直接百度搜索Three.js到官网下载即可,下载完成之后新建一个html文件并且引入Three.js即可。一个最基本的使用Three.js的html文件应该是这样子的:


    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Wonanut 3D </title>
  5. <style type="text/css">
  6. body { margin: 0; }
  7. canvas { width: 100%; height: 100%; }
  8. </style>
  9. </head>
  10. <body>
  11. <script type="text/javascript" src="js/three.js"> </script>
  12. <script type="text/javascript">
  13. // 场景
  14. var scene = new THREE. Scene();
  15. // 摄像机
  16. var camera = new THREE. PerspectiveCamera( 75, window. innerWidth / window. innerHeight, 0.1, 1000);
  17. camera. position. z = 5;
  18. // 渲染器
  19. var renderer = new THREE. WebGLRenderer();
  20. renderer. setSize( window. innerWidth, window. innerHeight );
  21. document. body. appendChild( renderer. domElement );
  22. // 渲染器 end
  23. // 物体
  24. var geometry = new THREE. BoxGeometry( 1, 1, 1);
  25. var material = new THREE. MeshBasicMaterial( { color: 0x00ff00} );
  26. var cube = new THREE. Mesh( geometry, material );
  27. scene. add( cube );
  28. // 物体 end
  29. </script>
  30. </body>
  31. </html>

我们打开浏览器看一下:

哦天哪,发生了什么,浏览器上黑乎乎一片什么都没有啊。

别急,这是因为我们只是设置了三要素,但并没有渲染,只有使用渲染器scene和camera进行渲染之后才能看到内容,在scene.add( cube ); 后面添加一句:

renderer.render(scene, camera);
    
    

再试试效果如何:

快看,现在屏幕中出现了一个正方形,这正是我们所期待的!

但是,我们使用的Three.js不应该是三维场景吗,为什么现在只有平面效果?不急,接下来我们使用requestAnimationFrame让画面动起来! 

 

2 让画面动起来

将上一步中最后一句代码:

renderer.render(scene, camera);
    
    

替换为:


    
    
  1. // 动画
  2. function animate( ) {
  3. cube. rotation. x += 0.01;
  4. cube. rotation. y += 0.01;
  5. renderer. render( scene, camera );
  6. requestAnimationFrame( animate );
  7. }
  8. animate();

再到浏览器看看效果,如果没有什么问题的话,现在你所看到的画面应该是一个旋转的立方体:

不过我对这个效果还是不满意,它看起来像是一个 正方体,但缺少了阴影灯光效果,接下来我们添加灯光效果。

 

3 添加光效

使用点光源THREE.SpotLight,代码如下:


    
    
  1. // 光源
  2. var spotLight = new THREE. SpotLight( 0xffffff );
  3. spotLight. position. set( - 40, 60, - 10 );
  4. scene. add( spotLight );
  5. // 光源 end

同时将cube的材质从MeshBasicMaterial换为MeshLamberMaterial,因为最基本的MeshBasicMaterial材质对光源不会有任何反应。


    
    
  1. // 物体
  2. var geometry = new THREE. BoxGeometry( 1, 1, 1);
  3. var material = new THREE. MeshLambertMaterial( { color: 0x00ff00} );
  4. var cube = new THREE. Mesh( geometry, material );
  5. scene. add( cube );
  6. // 物体 end

 

 

4 添加阴影效果

为了渲染阴影效果,需要对代码做如下修改:


    
    
  1. renderer. setClearColor( new THREE. Color( 0x000000, 1.0));
  2. renderer. shadowMap. enabled = true;

同时要给立方体设置投射阴影:

cube.castShadow = true;
    
    

设置地面接受阴影:

plane.receiveShadow = true;
    
    

设置spotLight投射阴影:

spotLight.castShadow = true;
    
    

为了添加阴影效果,我们需要设置一个平面来接受阴影,因此重新创建一个场景,源码如下:


    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Wonanut 3D </title>
  5. <style type="text/css">
  6. body { margin: 0; }
  7. canvas { width: 100%; height: 100%; }
  8. </style>
  9. </head>
  10. <body>
  11. <script type="text/javascript" src="js/three.js"> </script>
  12. <script type="text/javascript" src="js/stats.js"> </script>
  13. <script type="text/javascript">
  14. 场景-----------------------
  15. var scene = new THREE. Scene();
  16. --------------------------
  17. 摄像机---------------------
  18. var camera = new THREE. PerspectiveCamera( 45, window. innerWidth / window. innerHeight, 0.1, 1000);
  19. camera. position. x = - 30;
  20. camera. position. y = 40;
  21. camera. position. z = 30
  22. camera. lookAt(scene. position);
  23. --------------------------
  24. 渲染器--------------------
  25. var renderer = new THREE. WebGLRenderer();
  26. renderer. setSize( window. innerWidth, window. innerHeight );
  27. document. body. appendChild( renderer. domElement );
  28. // 设置渲染器渲染阴影效果
  29. renderer. setClearColor( new THREE. Color( 0x000000));
  30. renderer. setSize( window. innerWidth, window. innerHeight);
  31. renderer. shadowMap. enabled = true;
  32. 渲染器 end----------------
  33. 坐标轴--------------------
  34. var axes = new THREE. AxesHelper( 20);
  35. scene. add(axes);
  36. -------------------------
  37. 平面---------------------
  38. var planeGeometry = new THREE. PlaneGeometry( 60, 20, 1, 1);
  39. var planeMaterial = new THREE. MeshLambertMaterial({ color: 0xcccccc});
  40. var plane = new THREE. Mesh(planeGeometry, planeMaterial);
  41. plane. rotation. x = - 0.5 * Math. PI;
  42. plane. position. x = 15
  43. plane. position. y = 0
  44. plane. position. z = 0
  45. scene. add(plane);
  46. // 设置投影
  47. plane. receiveShadow = true;
  48. --------------------------
  49. 物体----------------------
  50. var geometry = new THREE. BoxGeometry( 4, 4, 4);
  51. var material = new THREE. MeshLambertMaterial( { color: 0x00ff00} );
  52. var cube = new THREE. Mesh( geometry, material );
  53. cube. position. x = 0;
  54. cube. position. y = 2;
  55. cube. position. z = 0;
  56. // 设置投影
  57. cube. castShadow = true;
  58. scene. add( cube );
  59. 物体 end ------------------
  60. 光源-----------------------
  61. var spotLight = new THREE. SpotLight( 0xffffff );
  62. spotLight. position. set( - 40, 60, - 10 );
  63. scene. add( spotLight );
  64. // 设置投影
  65. spotLight. castShadow = true;
  66. 光源 end -------------------
  67. 状态监视器-------------------
  68. var stats = new Stats();
  69. stats. showPanel( 0 );
  70. document. body. appendChild( stats. dom );
  71. 状态监视器 end --------------
  72. renderer. render( scene, camera );
  73. </script>
  74. </body>
  75. </html>

渲染结果如下图:

阴影是有了,但总觉得阴影不太对劲,比较模糊。通过查阅资料,我找到了答案:

光源的位置一定要距离合适,否则容易引起阴影模糊粗糙的像打马赛克一样

 所以嘛,这个东西还是要自己去调的(其实具体原因我也不清楚,反正我没调好)

</article>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值