three.js入门——画一个3D正方体

three.js 是一款WebGL框架,WebGL可以让我们在canvas上实现3D效果。
实现3D效果在国内来说还算是比较新的东西,可供查阅的资料也不多。
这篇文章仅是一个入门篇,介绍如何绘制一个3D正方体。


介绍完毕,首先奉上实现的效果图:
图片描述

这就是实现的效果图,还是挺有立体感的吧?

绘制前的准备

写代码前,要先下载最新的three.js框架包,引入自己的页面。

具体实现过程

准备一个canvas画布

这个画布是我们展现整个3D正方形的画布,也就是上图那个黑色的方框。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Camera 相机</title>
  <style>
    #canvas {
      width: 400px;
      height: 300px;
      border: 1px solid red;
      margin: 50px auto;
      display:block;
    }
  </style>
</head>
<body>
  <canvas id="canvas"></canvas>
  <script src="./libs/three.min.js"></script>
</body>
</html>

明确绘制思路

接下来的绘制过程会涉及到多个概念:canvas、scene、camera、renderer。
为了能更好理解绘制过程的代码和有助于记忆,我们先来理解这几个概念:


假设我们现在正在旅游的途中,看到了一个很唯美的画面,想把这个3D世界记录下来

  • 这个唯美的场景就是scene,我们用相机camera拍摄下来形成照片

  • 为了能看清楚这个照片,我们把这个照片放置在一个画布canvas上

  • 最后,我们再用renderer修饰渲染一下

这样,我们就能成功展现这个3D世界了。
【程序还是很贴近生活哒?】
通过现实世界的理解,我们接下来开始代码啦o( ̄▽ ̄)ブ

准备好canvas、scene、camera、renderer,给一个初始化的方法

<script>
var camera, scene, renderer, canvas;
init();
function init () {
  canvas = document.getElementById('canvas');
}

接下来我们要做的就是完善这个init()方法啦。


创建一个3D场景scene
场景最简单了,只需要用Scene声明一个scene对象。

scene = new THREE.Scene();

准备好camera
我们这里设置的相机是一个透视的相机PerspectiveCamera
camera有四个参数

  • 第一个参数是视线辐射的角度,这个参数越大,我们能看到的视觉越广,这个物体看上去会更小。

  • 第二个参数是图像内容展示的比例:width/height。我们一般把这个比例设置为和画布的比例一样,这样看到的图片才不会变形。

  • 第三四个参数分别是相机离展示内容(正方体)最近的距离和最远的距离。

camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);

接下来给camera设置摆放的位置,并把camera放到场景scene中
由于我们的世界是3D的,camera的摆放位置也是三维的,涉及三个参数:X轴、Y轴、Z轴。(0, 0, 0)是相机的原点,(1, 1, 5)就是把我们的相机往右和往上移动了1个单位,往后移动了5个单位。
ps: 这个时候画布canvas的大小正好是正方体的5倍。

camera.position.set(1, 1, 5);
scene.add(camera);

在场景中添加一个立方体
每个形状都是一个mesh,geometry可以理解为物体的骨骼, material可以理解为物体的皮囊
再创建一个可填充的形状cube
这样就构成了完整的实物
我们再将这个形状放入场景scene中
CubeGeometry参数设置为1:1:1表示这是一个正方体,当然可以自行修改比例,变成不一样的立方体

var geometry = new THREE.CubeGeometry(1, 1, 1);
// 添加three自带的最简单的一种材质
var material = new THREE.MeshBasicMaterial({
  color: 0xff0000,
});
var cube = new THREE.Mesh(geometry, material);    
var cube = new THREE.Mesh(geometry, material);

最后,创建renderer对图像进行渲染
将canvas交给renderer,也就是一个渲染的容器
antialias: true 平滑,抗锯齿,输出的画面会进行优化,不会带毛边

renderer =  new THREE.WebGLRenderer({
  canvas: canvas,
  antialias: true
});
// 设置renderer的样式
renderer.setSize(canvas.width, canvas.height);
renderer.render(scene, camera);

经过以上步骤,我们的的正方体就成功创建好了。
图片描述

以下是本例完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Camera 相机</title>
  <style>
    #canvas {
      width: 400px;
      height: 300px;
      border: 1px solid red;
      margin: 50px auto;
      display:block;
    }
  </style>
</head>
<body>
  <canvas id="canvas"></canvas>
  <script src="./libs/three.min.js"></script>
  <script>
  var camera, scene, renderer, canvas;
  init();
  function init () {
    canvas = document.getElementById('canvas');
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);
    camera.position.set(1, 1, 5);
    scene.add(camera);

    var geometry = new THREE.CubeGeometry(1, 1, 1);
    var material = new THREE.MeshBasicMaterial({
      color: 0xff0000,
    });
    // cube 是一个可以填充的形状
    var cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    renderer =  new THREE.WebGLRenderer({
      // 将canvas交给renderer  一个渲染的容器
      canvas: canvas,
      // 平滑, 抗锯齿  输出的画面会进行优化,不会带毛边
      antialias: true
    });
    // 设置renderer的样子
    renderer.setSize(canvas.width, canvas.height);
    renderer.render(scene, camera);
  }
  </script>
</body>
</html>

猜你喜欢

转载自www.cnblogs.com/homehtml/p/12194381.html