<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Three.js的入門案例(上)

          共 4478字,需瀏覽 9分鐘

           ·

          2021-02-28 18:58

           關(guān)注初識Threejs與小編一起學(xué)習(xí)成長 

          在Three.js的賦能下,WEB網(wǎng)頁效果逐漸豐富起來,今天我們就來運(yùn)用之前學(xué)習(xí)的Three.js基礎(chǔ)知識,實(shí)現(xiàn)一個旋轉(zhuǎn)的幾何體-球體。

          知識點(diǎn)

          1、透視投影照相機(jī)、基本材質(zhì);

          2、球體幾何模型、全景貼圖;

          3、渲染器;


          01

          創(chuàng)建DOM

          <div class="canvas" id="canvasObj"></div>


          為div容器定義樣式:

          html,body,.canvas{    width:100%;    height: 100%;    padding:0px;    margin:0px;}.canvas{    background:url(../libs/threejs/img/bg.jpg) no-repeat;    background-size:100% 100%;}



          02

          引入依賴

          這里使用import導(dǎo)入依賴,OrbitControls.js是軸道控制器控件,用它可以實(shí)現(xiàn)場景與鼠標(biāo)交互,讓場景動起來,控制場景的旋轉(zhuǎn)、縮放、平移;CSS2DRenderer.js是CSS 2D渲染器,使用CSS2DObject和CSS2DRenderer可以繪制一個2D效果的標(biāo)簽,將三維物體和基于HTML的標(biāo)簽相結(jié)合。

                  

          import * as THREE from '../libs/threeJs/three.module.js';import { OrbitControls } from '../libs/threeJs/controls/OrbitControls.js';//軸道控制器控件import { CSS2DRenderer, CSS2DObject } from '../libs/threeJs/renderers/CSS2DRenderer.js';//css 2D渲染器



          03

          核心代碼

          1、初始化場景:

          _this.scene=function(){    scene = new THREE.Scene();}


          2、初始化照相機(jī):

          _this.camera=function(){    /**     * 構(gòu)造函數(shù)總共有四個參數(shù),分別是fov,aspect,near,far      * fov:照相機(jī)視錐體垂直視野角度,實(shí)際項(xiàng)目中一般都定義45,因?yàn)?5最接近人正常睜眼角度     * aspect:照相機(jī)視錐體長寬比     * near:照相機(jī)視錐體近端面   far:照相機(jī)視錐體遠(yuǎn)端面     * */    camera = new THREE.PerspectiveCamera(45, canvasWidth / canvasHeight, 1, 1000);//遠(yuǎn)景投影的相機(jī)    camera.position.set(10, 2, 20);//position用來指定相機(jī)在三維坐標(biāo)中的位置}


          3、在場景里面創(chuàng)建球體:

          _this.addSphere=function(){    /**     * 初始化球體幾何模型     * SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength)     * radius:球體半徑     * widthSegments:水平分割面的數(shù)量     * heightSegments:垂直分割面的數(shù)量     * */    var earthGeometry = new THREE.SphereGeometry(_this.EARTH_RADIUS, 60, 60);        var textureLoader = new THREE.TextureLoader();//紋理加載器,用于加載球體的紋理    //基礎(chǔ)網(wǎng)孔材料    var earthMaterial = new THREE.MeshBasicMaterial({        color:0xffffff,//線條的十六進(jìn)制顏色        map: textureLoader.load(_this.sphereBg),//設(shè)置紋理貼圖        wireframe: false,//渲染模型為線框        wireframeLinewidth: 3,//線框線寬        skinning: false,//定義材料是否使用皮膚    });        //threeJs 的世界中,材質(zhì)(Material)+幾何體(Geometry)就是一個 mesh    //創(chuàng)建網(wǎng)格對象    earth = new THREE.Mesh(earthGeometry, earthMaterial);        //設(shè)置球體標(biāo)題    var h2html=$("<div class='title'><span>Three.js球體<br/>旋轉(zhuǎn)案例</span></div>").get(0);    var earthLabel = new CSS2DObject(h2html);    earthLabel.position.set(0, 2, 0);    earth.add(earthLabel);//DOM元素實(shí)例添加到網(wǎng)格中        scene.add(earth);//將球體添加到場景中}


          4、初始化渲染器:

          _this.renderer=function(){    renderer = new THREE.WebGLRenderer({      alpha: true,//背景是否透明      antialias: true//抗鋸齒屬性    });    //window.devicePixelRatio返回當(dāng)前顯示設(shè)備的物理像素分辨率與CSS像素分辨率之比    //設(shè)置設(shè)備像素比。通常用于HiDPI設(shè)備防止模糊輸出canvas    renderer.setPixelRatio(window.devicePixelRatio);    renderer.setSize(canvasWidth, canvasHeight);//調(diào)整輸出canvas尺寸    canvasObj.append(renderer.domElement);//把canvas添加Dom中        /**     * 初始化CSS 2D渲染器     * 可以將三維物體和基于HTML的標(biāo)簽相結(jié)合    */    labelRenderer = new CSS2DRenderer();    labelRenderer.setSize(canvasWidth, canvasHeight);    labelRenderer.domElement.style.position = 'absolute';    labelRenderer.domElement.style.top = 0;    canvasObj.append(labelRenderer.domElement);}


          5、周期性渲染場景:

          _this.renderFun=function(){    requestAnimationFrame(_this.renderFun);        var now = new Date();    var delay = now - lastDate;    lastDate = now;    var intc = 3;  // 每秒轉(zhuǎn)3度
          earth.rotation.y += Math.PI / 180 / delay * intc; labelRenderer.render(scene, camera); renderer.render(scene, camera);}


          6、調(diào)用函數(shù):

          //初始化_this.init=function(){    _this.scene();    _this.camera();    _this.addSphere();    _this.renderer();        //軸道控制器。相機(jī)對象作為參數(shù),控件可以監(jiān)聽鼠標(biāo)的變化,改變相機(jī)對象屬性    var controls = new OrbitControls(camera);    controls.enabled = true;//鼠標(biāo)控制是否可用        //滾輪是否可控制zoom,zoom速度默認(rèn)1    controls.enableZoom = false;    controls.zoomSpeed = 1.0;    // controls.minDistance = 20;// 最小距離    // controls.maxDistance = 25; //最大距離    controls.noPan = true; // 禁用右鍵拖動    controls.minPolarAngle = Math.PI / 180; // 視角不能低于水平面    controls.maxPolarAngle = Math.PI / 2; // 視角不能低于水平面    _this.renderFun();//渲染    }


          04

          寫在最后

          以上就是此次案例的核心代碼,大家可以動手嘗試一下修改構(gòu)造函數(shù)的參數(shù)值,如:基礎(chǔ)材質(zhì)的紋理貼圖、網(wǎng)格模型的旋轉(zhuǎn)方向等,通過它們的巧妙組合,可以讓場景更加絢麗多彩,快去動手實(shí)踐吧~


          如果你對本文內(nèi)容有任何建議,歡迎與小編溝通交流,一起學(xué)習(xí)成長!關(guān)注公眾號回復(fù)three.js,獲取完整案例代碼。





          “在看”我嗎?

          瀏覽 41
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  高颜值呻吟给力 | 久久国语对白 | 久久婷婷丁香五月 | 久久伊人青青草 | 国产免费看 |