欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Three.js基础学习教程

程序员文章站 2022-09-01 21:54:57
一、three.js官网及使用three.js必备的三个条件 1.three.js 官网 2.使用three.js必备的三个条件 (to actually be...

一、three.js官网及使用three.js必备的三个条件

1.three.js 官网

2.使用three.js必备的三个条件

(to actually be able to display anything with three.js, we need three things: a scene, a camera, and a renderer so we can render the scene with the camera.)

大致意思是使用three.js可以实现任何显示的东西,必须满足三个条件: a scene场景、a camera相机、a renderer渲染器. 三者缺一不可。

二、使用three.js必备三个条件(a scene场景、a camera相机、a renderer渲染器)之间的关系 

Three.js基础学习教程

如上图所示,来说明a scene场景、a camera相机、a renderer渲染器三者之间关系[/code]

1.场景scene是一个物体的容器【通俗理解装东西的嘛】,开发者可以将需要的角色放入场景中,例如苹果,葡萄。同时,角色自身也管理着其在场景中的位置。

2.相机camera的作用就是面对场景,在场景中取一个合适的景,把它拍下来。【可以想象成人的眼睛】

3.渲染器renderer的作用就是将相机拍摄下来的图片,放到浏览器中去显示

三、通过上述理论来实践官网案例

效果图如下

Three.js基础学习教程

官网案例实现源码

<html>
 <head>
 <title>my first three.js app</title>
 <style>
  body { margin: 0; }
  canvas { width: 100%; height: 100% }
 </style>
 </head>
 <body>
 <script src="./lib/three.js"></script>
 <script>
  //创建一个场景对象
  var scene = new three.scene();
  //创建一个相机对象
  var camera = new three.perspectivecamera( 75, window.innerwidth/window.innerheight, 0.1, 1000 );
  
  //创建一个渲染器对象
  var renderer = new three.webglrenderer(); 
  //设置画布尺寸
  renderer.setsize( window.innerwidth, window.innerheight );
  //设置画布色
   renderer.setclearcolor(0x00aabb, 1.0);
   //将渲染画布添加到浏览器中,以便后面剩放相机拍下的景
  document.body.appendchild( renderer.domelement );
  
  //创建一个几何体长、宽、高分别为1几何体对象
  var geometry = new three.boxgeometry( 1, 1, 1 );
  //材料、皮肤
  var material = new three.meshbasicmaterial( { color: 0x00ff00 } );
  //将material材料添加到几何体geometry,产生新的对象几何体cube
  var cube = new three.mesh( geometry, material );
  //将几何体添加至场景中
  scene.add( cube );
  //设置相机z轴,垂直电脑屏幕位置
  camera.position.z = 5;
   
  var render = function () {
  /*requestanimationframe( render ); //循环渲染
  cube.rotation.x += 0.1; //x轴每秒旋转60次
  cube.rotation.y += 0.1;//y轴每秒旋转60次*/
  renderer.render(scene, camera); //实时将相机拍下的几何体渲染到场景中
  };
  render();
</script>
 </body>
</html>

通过官网案例不难发现,camera照相机默认的观察方向是屏幕的方向(z轴负方向),当变化坐标以后,就要将照相机指向原点,才能观察到物体

Three.js基础学习教程 z轴负方向???因此这里很有必要说说三维坐标(如下图)

Three.js基础学习教程

Three.js基础学习教程照相机指向原点???来说说相机camera相机(很重要!!想象一下人看不到东西是什么感觉).

案例中采用透视相机(从视点开始越近的物体越大、远处的物体绘制的较小的一种方式、和日常生活中我们看物体的方式是一致的。)

var camera = new three.perspectivecamera(fov, aspect , near,far)

Three.js基础学习教程

new three.perspectivecamera(fov, aspect , near,far)  透视相机
视野角:fov 这里视野角(有的地方叫拍摄距离)越大,场景中的物体越小,视野角越小,场景中的物体越大
纵横比:aspect
相机离视体积最近的距离:near
相机离视体积最远的距离:far

综上,相信结合上述三维坐标、相机图理解相机、就应该变得很简单咯哦.接下来接着修改上述案例(说明 后面案例鼠标滚动放大缩小、三维旋转都是基于相机来实现的)

四、将官网案修改且设置相机朝向及相机位置

利用[lookat]方法来设置相机的视野中心。 「lookat()」的参数是一个属性包含中心坐标「x」「y」「z」的对象。

设置相机的上方向为正方向y轴 camera.up.x = 0; camera.up.y = 1/*相机朝向--相机上方为y轴*/; camera.up.z = 0;

五、实现旋转立方体

旋转动画原理相机围绕y轴旋转,不断修改相机x、z轴位置,并且保持场景中的物体一直再相机的视野中,实时将相机拍摄下来的图片,放到浏览器中去显示

//相机围绕y轴旋转,不断修改相机x、z轴位置,并且保持场景中的物体一直再相机的视野中
//实时渲染成像
function animation(){
  var timer = date.now()*0.0001;
  camera.position.x = math.cos(timer)*100;
  camera.position.z = math.sin(timer)*100;
  camera.lookat(scene.position); //设置相机视野中心
  renderer.render(scene, camera);
  requestanimationframe(animation);//渲染回调函数
}

实现效果图如下所示

Three.js基础学习教程

旋转立方体——案例源码

<!doctype html>
<html>
 <head>
 <meta charset="utf-8">
 <title>旋转立方体 </title>
 <style>
  #canvas-frame {
  width: 100%;
  height: 600px;
  }
 </style>
 </head>
 <body onload="threestart()">
 <div id="canvas-frame" ></div>
 </body>
 <script type="text/javascript" src="./lib/three.js" ></script>
 <script type="text/javascript">
  var renderer, //渲染器
  width = document.getelementbyid('canvas-frame').clientwidth, //画布宽
  height = document.getelementbyid('canvas-frame').clientheight; //画布高
  //初始化渲染器
  function initthree(){
  renderer = new three.webglrenderer({
   antialias : true
   //canvas: document.getelementbyid('canvas-frame')
  });
  renderer.setsize(width, height);
  renderer.setclearcolor(0xffffff, 1.0);
  document.getelementbyid('canvas-frame').appendchild(renderer.domelement);
  renderer.setclearcolor(0xffffff, 1.0);
  }
  //初始化场景
  var scene;
  function initscene(){
  scene = new three.scene();
  }
  var camera;
  function initcamera() { //透视相机
  camera = new three.perspectivecamera(45, width/height , 1, 10000);
  camera.position.x = 50;
  camera.position.y = 150;
  camera.position.z =150;
  camera.up.x = 0;
  camera.up.y = 1; //相机朝向--相机上方为y轴
  camera.up.z = 0;
  camera.lookat({ //相机的中心点
   x : 0,
   y : 0,
   z : 0
  });
   
  // camera 正交相机
  /*camera = new three.orthographiccamera(-300, 300, 100, -100, 1, 10000);
  camera.position.x = 250;
  camera.position.y = 100;
  camera.position.z = 1800;
  camera.up.x = 0;
  camera.up.y = 1; //相机朝向--相机上方为y轴
  camera.up.z = 0;
  camera.lookat({ //相机的中心点
   x : 0,
   y : 0,
   z : 0
  });*/
  }
  
  function initlight(){
  // light--这里使用环境光
  //var light = new three.directionallight(0xffffff); /*方向性光源*/
  //light.position.set(600, 1000, 800);
  var light = new three.ambientlight(0xffffff); //模拟漫反射光源
  light.position.set(600, 1000, 800); //使用ambient light时可以忽略方向和角度,只考虑光源的位置
  scene.add(light);
  }
  function initobject(){ //初始化对象
   
  //初始化地板
  initfloor();
  }
  function initgrid(){ //辅助网格
  var helper = new three.gridhelper( 1000, 50 );
  helper.setcolors( 0x0000ff, 0x808080 );
  scene.add( helper );
  }
  
  function initfloor(){
  //创建一个立方体
  var geometry = new three.boxgeometry(80, 20, 80);
   for ( var i = 0; i < geometry.faces.length; i += 2 ) {
   var hex = math.random() * 0xffffff;
   geometry.faces[ i ].color.sethex( hex );
   geometry.faces[ i + 1 ].color.sethex( hex );
  }
  var material = new three.meshbasicmaterial( { vertexcolors: three.facecolors} );
  //将material材料添加到几何体geometry
  var mesh = new three.mesh(geometry, material);
  mesh.position = new three.vector3(0,0,0);
  scene.add(mesh);
  }
 
  
  //初始化页面加载
  function threestart(){
  //初始化渲染器
  initthree();
  //初始化场景
  initscene();
  //初始透视化相机
  initcamera();
  //初始化光源
  //initlight();
  //模型对象
  initobject();
  //初始化网格辅助线
  initgrid();
  //renderer.render(scene, camera);
  //实时动画
  animation();
  
  }
  /*
  * 旋转原理
  * 相机围绕y轴旋转
  * 不断修改相机x、z轴位置,并且保持场景中的物体一直再相机的视野中,
  * 实时将相机拍摄下来的图片,放到浏览器中去显示
  */
  function animation(){
  //渲染成像
  var timer = date.now()*0.0001;
  camera.position.x = math.cos(timer)*100; //相机位置x轴方向
  camera.position.z = math.sin(timer)*100; //相机位置y轴方向
  //设置相机视野中心
  camera.lookat(scene.position);
  //渲染成像
  renderer.render(scene, camera);
  //渲染回调animation函数
  requestanimationframe(animation);
  }
 </script>
</html>

至此完毕,附上个人绘制思路流程图

Three.js基础学习教程

【参考资料】

使用3d引擎threejs实现星空粒子移动效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。