• 在three.js项目里,创建一个场景,添加一些需要渲染的场景(带有材质的图形)。
    • 材质定义了物体的样子,每种材质对光源的反应不一样。
    • 渲染阴影开销非常大,并且需要渲染器、每一个物体,以及每一个光源上打开。
    • 通过修改场景中物体的position、rotation属性,可以轻松实现动画。
    • 通过辅助库,可以轻松的统计控件(Stats)和定制控件(dat.GUI)。

    点击查看【codepen】

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>My New Pen!</title>
    6. <!-- <script src="https://cdn.bootcss.com/stats.js/r17/Stats.js"></script> -->
    7. <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/89/three.min.js"></script>
    8. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    9. <script src="https://cdn.bootcss.com/dat-gui/0.7.3/dat.gui.js"></script>
    10. </head>
    11. <body>
    12. <div id="webgl-output"></div>
    13. <div id="stats-output"></div>
    14. <script>
    15. $(function() {
    16. init();
    17. var gui = new dat.GUI();
    18. gui.add(controls, 'rotationSpeed', 0, 0.5);
    19. gui.add(controls, 'bouncingSpeed', 0, 0.5);
    20. });
    21. // 增加界面控制
    22. var controls = new function() {
    23. this.rotationSpeed = 0.02;
    24. this.bouncingSpeed = 0.03;
    25. }
    26. function init() {
    27. var scene = new THREE.Scene();
    28. var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
    29. var renderer = new THREE.WebGLRenderer();
    30. renderer.setClearColor(new THREE.Color(0xeeeeee), 1);
    31. renderer.setSize(window.innerWidth, window.innerHeight);
    32. renderer.shadowMap.enabled = true;
    33. var axes = new THREE.AxesHelper(20);
    34. scene.add(axes);
    35. // 地板
    36. var planeGeometry = new THREE.PlaneGeometry(60, 20, 1);
    37. var planeMaterial = new THREE.MeshLambertMaterial({ color: 0xcccccc });
    38. var plane = new THREE.Mesh(planeGeometry, planeMaterial);
    39. plane.rotation.x = -0.5 * Math.PI;
    40. plane.position.x = 15;
    41. plane.position.y = 0;
    42. plane.position.z = 0;
    43. plane.receiveShadow = true;
    44. scene.add(plane);
    45. // 球体
    46. var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
    47. var sphereMaterial = new THREE.MeshLambertMaterial({ color: 0x7777ff, wireframe: true });
    48. var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
    49. sphere.position.x = 20;
    50. sphere.position.y = 4;
    51. sphere.position.z = 2;
    52. sphere.castShadow = true;
    53. scene.add(sphere);
    54. //创建一个立方体
    55. var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
    56. //将线框(wireframe)属性设置为true,这样物体就不会被渲染为实物物体
    57. var cubeMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000 });
    58. var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    59. cube.castShadow = true;
    60. //设置立方体的位置
    61. cube.position.x = -4;
    62. cube.position.y = 3;
    63. cube.position.z = 0;
    64. //将立方体添加到场景中
    65. scene.add(cube);
    66. // 添加光源
    67. var spotLight = new THREE.SpotLight(0xffffff);
    68. spotLight.position.set(-40, 60, -10);
    69. spotLight.castShadow = true;
    70. scene.add(spotLight);
    71. camera.position.x = -30;
    72. camera.position.y = 40;
    73. camera.position.z = 30;
    74. camera.lookAt(scene.position);
    75. $('#webgl-output').append(renderer.domElement);
    76. renderScene();
    77. var step = 0;
    78. function renderScene() {
    79. cube.rotation.x += controls.rotationSpeed;
    80. cube.rotation.y += controls.rotationSpeed;
    81. cube.rotation.z += controls.rotationSpeed;
    82. // 定义球弹的速度
    83. step += controls.bouncingSpeed;
    84. // sphere.position.x = 20 + (10 * (Math.cos(step)));
    85. sphere.position.y = 2 + 10 * Math.abs(Math.sin(step));
    86. // 通过requestAnimationFrame在特定时间间隔重新渲染场景
    87. requestAnimationFrame(renderScene);
    88. // 渲染场景
    89. renderer.render(scene, camera);
    90. }
    91. }
    92. </script>
    93. </body>
    94. </html>