Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 344|回复: 0

[默认分类] 【three.js详解之一】入门篇

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-9 13:32:40 | 显示全部楼层 |阅读模式


    开场白

    webGL可以让我们在canvas上实现3D效果。而three.js是一款webGL框架,由于其易用性被广泛应用。如果你要学习webGL,抛弃那些复杂的原生接口从这款框架入手是一个不错的选择。
    博主目前也在学习three.js,发现相关资料非常稀少,甚至官方的api文档也非常粗糙,很多效果需要自己慢慢敲代码摸索。所以我写这个教程的目的一是自己总结,二是与大家分享。
    本篇是系列教程的第一篇:入门篇。在这篇文章中,我将以一个简单的demo为例,阐述three.js的基本配置方法。学完这篇文章,你将学会如何在浏览器中绘制一个立体图形!
    准备工作
    在写代码之前,你首先要去下最新的three.js框架包,在你的页面里引入three.js,当然文件包里面也有不少的demo便于大家学习;
    chrome是目前支持webGL最好的浏览器,Firefow居其次,国内的遨游、猎豹经测试也可以运行。
    从实例开始入门!
    首先我们搭建HTML,如下:

    1. <!DOCTYPE html>
    2. <html>
    3.     <head>
    4.         <meta charset="UTF-8">
    5.         <title>lesson1-by-shawn.xie</title>
    6.         <!--引入Three.js-->
    7.         <script src="Three.js"></script>
    8.         <style type="text/css">
    9.             div#canvas-frame{
    10.                   border: none;
    11.                   cursor: move;
    12.                   width: 1400px;
    13.                   height: 600px;
    14.                   background-color: #EEEEEE;
    15.                 }
    16.         </style>
    17.     </head>
    18.     <body>
    19.         <!--盛放canvas的容器-->
    20.         <div id="container"></div>
    21.     </body>
    22. </html>
    复制代码

    准备和画布框大小一致的领域用于WebGL绘制。 具体来说:
    (1) body 标签中添加 id 为「canvas3d」的 div 元素。
    (2) style 标签中指定 「canvas3d」的CSS样式。
    需要注意的是,我们并不需要写一个<canvas>标签,我们只需要定义好盛放canvas的div就可以,canvas是three.js动态生成的!
    下面我们开始写脚本,我们将通过以下五步构建一个简单的立体模型,这也是three.js的基本步骤:
    1.设置three.js渲染器
    三维空间里的物体映射到二维平面的过程被称为三维渲染。 一般来说我们都把进行渲染操作的软件叫做渲染器。 具体来说要进行下面这些处理。
    (0) 声明全局变量(对象);
    (1) 获取画布「canvas-frame」的高宽;
    (2) 生成渲染器对象(属性:抗锯齿效果为设置有效);
    (3) 指定渲染器的高宽(和画布框大小一致);
    (4) 追加 【canvas】 元素到 【canvas3d】 元素中;
    (5) 设置渲染器的清除色(clearColor)。


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


    2.设置摄像机camera
    OpenGL(WebGL)中、三维空间中的物体投影到二维空间的方式中,存在透视投影和正投影两种相机。 透视投影就是、从视点开始越近的物体越大、远处的物体绘制的较小的一种方式、和日常生活中我们看物体的方式是一致的。 正投影就是不管物体和视点距离,都按照统一的大小进行绘制、在建筑和设计等领域需要从各个角度来绘制物体,因此这种投影被广泛应用。在 Three.js 也能够指定透视投影和正投影两种方式的相机。 本文按照以下的步骤设置透视投影方式。
    (0) 声明全局的变量(对象);
    (1) 设置透视投影的相机;
    (2) 设置相机的位置坐标;
    (3) 设置相机的上为「z」轴方向;
    (4) 设置视野的中心坐标。

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


    3.设置场景scene
    场景就是一个三维空间。 用 [Scene] 类声明一个叫 [scene] 的对象。

    1.         //设置场景
    2.               var scene;
    3.               function initScene() {   
    4.                 scene = new THREE.Scene();
    5.               }
    复制代码


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

    1.         //设置光源
    2.               var light;
    3.               function initLight() {
    4.                 light = new THREE.DirectionalLight(0xff0000, 1.0, 0);//设置平行光源
    5.                 light.position.set( 200, 200, 200 );//设置光源向量
    6.                 scene.add(light);// 追加光源到场景
    7.               }
    复制代码


    5.设置物体object
       这里,我们声明一个球模型

    1.         //设置物体
    2.               var sphere;
    3.               function initObject(){  
    4.                 sphere = new THREE.Mesh(
    5.                      new THREE.SphereGeometry(20,20),                //width,height,depth
    6.                      new THREE.MeshLambertMaterial({color: 0xff0000}) //材质设定
    7.                 );
    8.                 scene.add(sphere);
    9.                 sphere.position.set(0,0,0);
    10.               }
    复制代码

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

    1.         //执行
    2.               function threeStart() {
    3.                 initThree();
    4.                 initCamera();
    5.                 initScene();   
    6.                 initLight();
    7.                 initObject();
    8.                 renderer.clear();
    9.                 renderer.render(scene, camera);
    10.               }
    复制代码

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

    总结
    以上就是three.js的入门内容,我们核心的五步就是:
    1.设置three.js渲染器
    2.设置摄像机camera
    3.设置场景scene
    4.设置光源light
    5.设置物体object
    可能其中有些设置你还不太清楚,没关系,后面几篇文章会对以上五个主要步骤进行详细的讲解,敬请期待~~

    本例完整代码:

    1. <!DOCTYPE html>
    2. <html>
    3.     <head>
    4.         <meta charset="UTF-8">
    5.         <title>lesson1-by-shawn.xie</title>
    6.         <!--引入Three.js-->
    7.         <script src="Three.js"></script>
    8.         <script type="text/javascript">
    9.             //开启Three.js渲染器
    10.              var renderer;//声明全局变量(对象)
    11.              function initThree() {
    12.                 width = document.getElementById("canvas3d").clientWidth;//获取画布「canvas3d」的宽
    13.                 height = document.getElementById("canvas3d").clientHeight;//获取画布「canvas3d」的高
    14.                 renderer=new THREE.WebGLRenderer({antialias:true});//生成渲染器对象(属性:抗锯齿效果为设置有效)
    15.                 renderer.setSize(width, height );//指定渲染器的高宽(和画布框大小一致)
    16.                 document.getElementById("canvas3d").appendChild(renderer.domElement);//追加 【canvas】 元素到 【canvas3d】 元素中。
    17.                 renderer.setClearColorHex(0xFFFFFF, 1.0);//设置canvas背景色(clearColor)
    18.               }
    19.                //设置相机
    20.               var camera;
    21.               function initCamera() {
    22.                 camera = new THREE.PerspectiveCamera( 45, width / height , 1 , 5000 );//设置透视投影的相机,默认情况下相机的上方向为Y轴,右方向为X轴,沿着Z轴朝里(视野角:fov 纵横比:aspect 相机离视体积最近的距离:near 相机离视体积最远的距离:far)
    23.                 camera.position.x = 0;//设置相机的位置坐标
    24.                 camera.position.y = 50;//设置相机的位置坐标
    25.                 camera.position.z = 100;//设置相机的位置坐标
    26.                 camera.up.x = 0;//设置相机的上为「x」轴方向
    27.                 camera.up.y = 1;//设置相机的上为「y」轴方向
    28.                 camera.up.z = 0;//设置相机的上为「z」轴方向
    29.                 camera.lookAt( {x:0, y:0, z:0 } );//设置视野的中心坐标
    30.               }
    31.                //设置场景
    32.               var scene;
    33.               function initScene() {   
    34.                 scene = new THREE.Scene();
    35.               }
    36.               //设置光源
    37.               var light;
    38.               function initLight() {
    39.                 light = new THREE.DirectionalLight(0xff0000, 1.0, 0);//设置平行光源
    40.                 light.position.set( 200, 200, 200 );//设置光源向量
    41.                 scene.add(light);// 追加光源到场景
    42.               }
    43.                //设置物体
    44.               var sphere;
    45.               function initObject(){  
    46.                 sphere = new THREE.Mesh(
    47.                      new THREE.SphereGeometry(20,20),                //width,height,depth
    48.                      new THREE.MeshLambertMaterial({color: 0xff0000}) //材质设定
    49.                 );
    50.                 scene.add(sphere);
    51.                 sphere.position.set(0,0,0);
    52.               }
    53.               //执行
    54.               function threeStart() {
    55.                 initThree();
    56.                 initCamera();
    57.                 initScene();   
    58.                 initLight();
    59.                 initObject();
    60.                 renderer.clear();
    61.                 renderer.render(scene, camera);
    62.               }
    63.         </script>
    64.         <style type="text/css">
    65.             div#canvas3d{
    66.                   border: none;
    67.                   cursor: move;
    68.                   width: 1400px;
    69.                   height: 600px;
    70.                   background-color: #EEEEEE;
    71.                 }
    72.         </style>
    73.     </head>
    74.     <body onload="threeStart();">
    75.         <!--盛放canvas的容器-->
    76.         <div id="canvas3d"></div>
    77.     </body>
    78. </html>
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-23 20:28 , Processed in 0.352170 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表