>  기사  >  웹 프론트엔드  >  Three.js 사용법에 대한 자세한 설명

Three.js 사용법에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-04-17 10:52:344372검색

이번에는 Three.js 사용에 대한 자세한 설명을 들고 왔는데, Three.js 사용 시 주의사항은 무엇인가요?

개회 발언

webGL을 사용하면 캔버스에 3D 효과를 얻을 수 있습니다. Three.js는 사용 편의성으로 인해 널리 사용되는 webGL 프레임워크입니다. webGL을 배우고 싶다면 복잡한 네이티브 인터페이스를 버리고 이 프레임워크부터 시작하는 것이 좋은 선택입니다.

블로거도 현재 three.js를 배우고 있는데 관련 정보가 매우 부족하고 공식 API 문서조차도 매우 거칠기 때문에 천천히 코딩하고 스스로 탐색해야 한다는 사실을 발견했습니다. 그래서 이 튜토리얼을 작성하는 목적은 직접 요약하고 모든 사람과 공유하는 것입니다.

이 문서는 시작하기 튜토리얼 시리즈 중 첫 번째 문서입니다. 이번 글에서는 three.js의 기본 설정 방법을 설명하기 위해 간단한 데모를 예로 들어보겠습니다. 이 기사를 공부한 후에는 브라우저에서 3차원 그래픽을 그리는 방법을 배우게 됩니다!

준비

코드를 작성하기 전에 먼저 최신 three.js 프레임워크 패키지를 다운로드하고 페이지에 three.js를 도입해야 합니다. 물론 모든 사람이 배울 수 있는 데모도 많이 있습니다. 현재 webGL을 지원하는 브라우저는 Chrome이 가장 좋으며, Firefow가 뒤를 잇고 있습니다. 국내 Aoyou와 Cheetah도 테스트 후 실행할 수 있습니다.

예제부터 시작해보세요! 먼저 다음과 같이 HTML을 빌드합니다.

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>lesson1-by-shawn.xie</title>
 <!--引入Three.js-->
 <script src="Three.js"></script>
 <style type="text/css">
 p#canvas-frame{
  border: none;
  cursor: move;
  width: 1400px;
  height: 600px;
  background-color: #EEEEEE;
 }
 </style>
 </head>
 <body>
 <!--盛放canvas的容器-->
 <p id="container"></p>
 </body>
</html>

WebGL 그리기를 위해 캔버스 프레임 크기에 맞는 영역을 준비합니다. 구체적으로:

(1) ID가 "canvas3d"인 p 요소를 body 태그에 추가합니다.

(2) 스타일 태그에는 CSS 스타일 "canvas3d"가 지정되어 있습니다.

태그를 작성할 필요는 없으며 캔버스를 보유하는 p만 정의하면 됩니다. 캔버스는 three.js에 의해 동적으로 생성됩니다.

다음으로, three.js의 기본 단계이기도 한 다음 5단계를 통해 간단한 3차원 모델을 작성해 보겠습니다.

1. three.js 렌더러 설정

3차원 공간의 물체를 2차원 평면에 매핑하는 과정을 3차원 렌더링이라고 합니다. 일반적으로 우리는 렌더링 작업을 수행하는 소프트웨어를 렌더러라고 부릅니다. 구체적으로 다음과 같은 처리가 필요합니다.

(0) 전역 변수(객체) 선언;

(1) 캔버스 "캔버스 프레임"의 높이와 너비를 가져옵니다.

(2) 렌더러 객체 생성(속성: 앤티앨리어싱 효과가 유효로 설정됨)

(3) 렌더러의 높이와 너비를 지정합니다(캔버스 프레임과 동일한 크기). (4) [canvas] 요소를 [canvas3d] 요소에 추가합니다. (5) 렌더러의 클리어 컬러(clearColor)를 설정합니다.

rreee

2. 카메라 설정

OpenGL(WebGL)에는 3차원 공간의 객체를 2차원 공간에 투영하는 방식으로 원근 투영과 정사영 투영이라는 두 종류의 카메라가 있습니다. 원근투영이란 시점에 가까운 물체는 크게, 멀리 있는 물체는 작게 그리는 방법입니다. 이는 우리가 일상에서 물체를 보는 방식과 일치합니다. 정사영은 시점으로부터의 거리에 상관없이 객체를 일정한 크기로 그리는 것을 의미하며, 건축, 디자인 등의 분야에서는 객체를 다양한 각도에서 그려야 하므로 이러한 투영법이 널리 사용됩니다. Three.js에서 원근 투영과 직교 투영을 모두 사용하여 카메라를 지정하는 것도 가능합니다. 이 문서에서는 아래 단계에 따라 원근 투영 방법을 설정합니다.

(0) 전역 변수(객체) 선언;

(1) 원근 투영을 위한 카메라를 설정합니다.

(2) 카메라의 위치 좌표를 설정합니다.

(3) 카메라 상단을 "z"축 방향으로 설정합니다. (4) 시야의 중심 좌표를 설정합니다.     

//开启Three.js渲染器
var renderer;//声明全局变量(对象)
function initThree() {
 width = document.getElementById('canvas3d').clientWidth;//获取画布「canvas3d」的宽
 height = document.getElementById('canvas3d').clientHeight;//获取画布「canvas3d」的高
 renderer=new THREE.WebGLRenderer({antialias:true});//生成渲染器对象(属性:抗锯齿效果为设置有效)
 renderer.setSize(width, height );//指定渲染器的高宽(和画布框大小一致)
 document.getElementById('canvas3d').appendChild(renderer.domElement);//追加 【canvas】 元素到 【canvas3d】 元素中。
 renderer.setClearColorHex(0xFFFFFF, 1.0);//设置canvas背景色(clearColor)
}

3.장면을 설정하세요

장면은 3차원 공간이다. [Scene] 클래스를 사용하여 [scene]이라는 객체를 선언합니다.     

  //设置相机
 var camera;
 function initCamera() { 
 camera = new THREE.PerspectiveCamera( 45, width / height , 1 , 5000 );//设置透视投影的相机,默认情况下相机的上方向为Y轴,右方向为X轴,沿着Z轴朝里(视野角:fov 纵横比:aspect 相机离视体积最近的距离:near 相机离视体积最远的距离:far)
 camera.position.x = 0;//设置相机的位置坐标
 camera.position.y = 50;//设置相机的位置坐标
 camera.position.z = 100;//设置相机的位置坐标
 camera.up.x = 0;//设置相机的上为「x」轴方向
 camera.up.y = 1;//设置相机的上为「y」轴方向
 camera.up.z = 0;//设置相机的上为「z」轴方向
 camera.lookAt( {x:0, y:0, z:0 } );//设置视野的中心坐标
 }

4. 광원 조명을 설정하세요

OpenGL(WebGL)的三维空间中,存在点光源和聚光灯两种类型。 而且,作为点光源的一种特例还存在平行光源(无线远光源)。另外,作为光源的参数还可以进行 [环境光] 等设置。 作为对应, Three.js中可以设置 [点光源(Point Light)] [聚光灯(Spot Light)] [平行光源(Direction Light)],和 [环境光(Ambient Light)]。 和OpenGL一样、在一个场景中可以设置多个光源。 基本上,都是环境光和其他几种光源进行组合。 如果不设置环境光,那么光线照射不到的面会变得过于黑暗。 本文中首先按照下面的步骤设置平行光源,在这之后还会追加环境光。

(0) 声明全局变量(对象)

(1) 设置平行光源

(2) 设置光源向量

(3) 追加光源到场景

这里我们用「DirectionalLight」类声明一个叫 [light] 的对象来代表平行光源

    //设置光源
 var light;
 function initLight() { 
 light = new THREE.DirectionalLight(0xff0000, 1.0, 0);//设置平行光源
 light.position.set( 200, 200, 200 );//设置光源向量
 scene.add(light);// 追加光源到场景
 }

5.设置物体object

   这里,我们声明一个球模型   

   //设置物体
 var sphere;
 function initObject(){ 
 sphere = new THREE.Mesh(
  new THREE.SphereGeometry(20,20), //width,height,depth
  new THREE.MeshLambertMaterial({color: 0xff0000}) //材质设定
 );
 scene.add(sphere);
 sphere.position.set(0,0,0);
 }

最后,我们写一个主函数执行以上五步:

        //执行
 function threeStart() {
 initThree();
 initCamera();
 initScene(); 
 initLight();
 initObject();
 renderer.clear(); 
 renderer.render(scene, camera);
 }

这时,测试以上程序,你会发现浏览器窗口中出现了你绘制的球形模型

总结

以上就是three.js的入门内容,我们核心的五步就是:

1.设置three.js渲染器

2.设置摄像机camera

3.设置场景scene

4.设置光源light

5.设置物体object

可能其中有些设置你还不太清楚,没关系,后面几篇文章会对以上五个主要步骤进行详细的讲解,敬请期待~~

本例完整代码:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>lesson1-by-shawn.xie</title>
 <!--引入Three.js-->
 <script src="Three.js"></script>
 <script type="text/javascript">
 //开启Three.js渲染器
 var renderer;//声明全局变量(对象)
 function initThree() {
 width = document.getElementById('canvas3d').clientWidth;//获取画布「canvas3d」的宽
 height = document.getElementById('canvas3d').clientHeight;//获取画布「canvas3d」的高
 renderer=new THREE.WebGLRenderer({antialias:true});//生成渲染器对象(属性:抗锯齿效果为设置有效)
 renderer.setSize(width, height );//指定渲染器的高宽(和画布框大小一致)
 document.getElementById('canvas3d').appendChild(renderer.domElement);//追加 【canvas】 元素到 【canvas3d】 元素中。
 renderer.setClearColorHex(0xFFFFFF, 1.0);//设置canvas背景色(clearColor)
 }
 //设置相机
 var camera;
 function initCamera() { 
 camera = new THREE.PerspectiveCamera( 45, width / height , 1 , 5000 );//设置透视投影的相机,默认情况下相机的上方向为Y轴,右方向为X轴,沿着Z轴朝里(视野角:fov 纵横比:aspect 相机离视体积最近的距离:near 相机离视体积最远的距离:far)
 camera.position.x = 0;//设置相机的位置坐标
 camera.position.y = 50;//设置相机的位置坐标
 camera.position.z = 100;//设置相机的位置坐标
 camera.up.x = 0;//设置相机的上为「x」轴方向
 camera.up.y = 1;//设置相机的上为「y」轴方向
 camera.up.z = 0;//设置相机的上为「z」轴方向
 camera.lookAt( {x:0, y:0, z:0 } );//设置视野的中心坐标
 }
 //设置场景
 var scene;
 function initScene() { 
 scene = new THREE.Scene();
 }
 //设置光源
 var light;
 function initLight() { 
 light = new THREE.DirectionalLight(0xff0000, 1.0, 0);//设置平行光源
 light.position.set( 200, 200, 200 );//设置光源向量
 scene.add(light);// 追加光源到场景
 }
 //设置物体
 var sphere;
 function initObject(){ 
 sphere = new THREE.Mesh(
  new THREE.SphereGeometry(20,20), //width,height,depth
  new THREE.MeshLambertMaterial({color: 0xff0000}) //材质设定
 );
 scene.add(sphere);
 sphere.position.set(0,0,0);
 }
 //执行
 function threeStart() {
 initThree();
 initCamera();
 initScene(); 
 initLight();
 initObject();
 renderer.clear(); 
 renderer.render(scene, camera);
 }
 </script>
 <style type="text/css">
 p#canvas3d{
  border: none;
  cursor: move;
  width: 1400px;
  height: 600px;
  background-color: #EEEEEE;
 }
 </style>
 </head>
 <body onload=&#39;threeStart();&#39;>
 <!--盛放canvas的容器-->
 <p id="canvas3d"></p>
 </body>
</html>

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Angular js操作用户的方法

token怎么储存在客户端localStorage内

AngularJS购物车结算时全选反选z

위 내용은 Three.js 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.