当前位置:   article > 正文

three.js 小例子分析_three.js 五角星

three.js 五角星

这是一个官方的小例子就是分析学习下。
https://threejs.org/examples/#webgl_geometry_extrude_shapes

开头的引入js没什么好说

  1. <script src="../build/three.js"></script>
  2. //这是鼠标控制的工具
  3. <script src="js/controls/TrackballControls.js"></script>

接着分析代码

  1. var camera, scene, renderer, controls;
  2. init();
  3. animate();

开头简单例子就帮忙总结了一下three.js 大舞台搭建

  1. camera   摄像机 
  2. scene     场景(画板)
  3. renderer  渲染器 (画笔)
  4. controls   这里就是场景画面的控制器
  5. init() 初始化上面的几个元素
  6. animate()  动画,场景变换 

下面开始看看init()到底都做了些什么

  1. function init() {
  2. //初始化画笔
  3. renderer = new THREE.WebGLRenderer();
  4. //设置设备像素比。通常用于避免HiDPI设备上绘图模糊
  5. //不懂的PixelRatio的同学可以看下这篇博客
  6. //https://www.cnblogs.com/timejs/p/5409533.html
  7. renderer.setPixelRatio( window.devicePixelRatio );
  8. //将输出canvas的大小调整为(width, height)并考虑设备像素比
  9. renderer.setSize( window.innerWidth, window.innerHeight );
  10. document.body.appendChild( renderer.domElement );
  11. //初始化场景
  12. scene = new THREE.Scene();
  13. scene.background = new THREE.Color( 0x222222 );
  14. //初始化摄像机
  15. camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
  16. camera.position.set( 0, 0, 500 );
  17. //控制器
  18. controls = new THREE.TrackballControls( camera, renderer.domElement );
  19. controls.minDistance = 200;
  20. controls.maxDistance = 500;
  21. //设置环境光 (此灯全局均匀地照亮场景中的所有对象)
  22. scene.add( new THREE.AmbientLight( 0x222222 ) );
  23. //点光源
  24. var light = new THREE.PointLight( 0xffffff );
  25. light.position.copy( camera.position );
  26. scene.add( light );
  27. //使用Catmull-Rom算法从一系列点创建平滑的三维样条曲线 。
  28. var closedSpline = new THREE.CatmullRomCurve3( [
  29. new THREE.Vector3( - 60, - 100, 60 ),
  30. new THREE.Vector3( - 60, 20, 60 ),
  31. new THREE.Vector3( - 60, 120, 60 ),
  32. new THREE.Vector3( 60, 20, - 60 ),
  33. new THREE.Vector3( 60, - 100, - 60 )
  34. ] );
  35. //曲线的类型
  36. closedSpline.curveType = 'catmullrom';
  37. //是否闭合
  38. closedSpline.closed = true;
  39. var extrudeSettings = {
  40. steps: 100,
  41. bevelEnabled: false,//允许斜面
  42. extrudePath: closedSpline //THREE.CurvePath。应该挤出形状的3D样条路径
  43. };
  44. var pts = [], count = 3;
  45. for ( var i = 0; i < count; i ++ ) {
  46. var l = 20;
  47. var a = 2 * i / count * Math.PI;
  48. pts.push( new THREE.Vector2( Math.cos( a ) * l, Math.sin( a ) * l ) );
  49. }
  50. //三边形
  51. var shape = new THREE.Shape( pts );
  52. //从路径形状创建拉伸的图形
  53. var geometry = new THREE.ExtrudeBufferGeometry( shape, extrudeSettings );
  54. //非光泽表面
  55. var material = new THREE.MeshLambertMaterial( { color: 0xb00000, wireframe: false } );
  56. var mesh = new THREE.Mesh( geometry, material );
  57. scene.add( mesh );
  58. var randomPoints = [];
  59. for ( var i = 0; i < 10; i ++ ) {
  60. randomPoints.push( new THREE.Vector3( ( i - 4.5 ) * 50, THREE.Math.randFloat( - 50, 50 ), THREE.Math.randFloat( - 50, 50 ) ) );
  61. }
  62. var randomSpline = new THREE.CatmullRomCurve3( randomPoints );
  63. //
  64. var extrudeSettings = {
  65. steps: 200,
  66. bevelEnabled: false,
  67. extrudePath: randomSpline
  68. };
  69. var pts = [], numPts = 5;
  70. //画五角星,也就是两个不同半径的圆
  71. for ( var i = 0; i < numPts * 2; i ++ ) {
  72. var l = i % 2 == 1 ? 10 : 20;
  73. var a = i / numPts * Math.PI;
  74. pts.push( new THREE.Vector2( Math.cos( a ) * l, Math.sin( a ) * l ) );
  75. }
  76. var shape = new THREE.Shape( pts );
  77. var geometry = new THREE.ExtrudeBufferGeometry( shape, extrudeSettings );
  78. var material2 = new THREE.MeshLambertMaterial( { color: 0xff8000, wireframe: false } );
  79. var mesh = new THREE.Mesh( geometry, material2 );
  80. scene.add( mesh );
  81. var materials = [ material, material2 ];
  82. var extrudeSettings = {
  83. depth: 20,
  84. steps: 1,
  85. bevelEnabled: true,
  86. bevelThickness: 2,
  87. bevelSize: 4,
  88. bevelSegments: 1
  89. };
  90. var geometry = new THREE.ExtrudeBufferGeometry( shape, extrudeSettings );
  91. var mesh = new THREE.Mesh( geometry, materials );
  92. mesh.position.set( 50, 100, 50 );
  93. scene.ad d( mesh );
  94. }

 animate() 方法

  1. function animate() {
  2. requestAnimationFrame( animate );
  3. //控制器变化更新视图
  4. controls.update();
  5. renderer.render( scene, camera );
  6. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/84965
推荐阅读
相关标签
  

闽ICP备14008679号