1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Three.js的入門(mén)案例(上)

        共 4478字,需瀏覽 9分鐘

         ·

        2021-02-28 18:58

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

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

        知識(shí)點(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)場(chǎng)景與鼠標(biāo)交互,讓場(chǎng)景動(dòng)起來(lái),控制場(chǎng)景的旋轉(zhuǎn)、縮放、平移;CSS2DRenderer.js是CSS 2D渲染器,使用CSS2DObject和CSS2DRenderer可以繪制一個(gè)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、初始化場(chǎng)景:

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


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

        _this.camera=function(){    /**     * 構(gòu)造函數(shù)總共有四個(gè)參數(shù),分別是fov,aspect,near,far      * fov:照相機(jī)視錐體垂直視野角度,實(shí)際項(xiàng)目中一般都定義45,因?yàn)?5最接近人正常睜眼角度     * aspect:照相機(jī)視錐體長(zhǎng)寬比     * 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用來(lái)指定相機(jī)在三維坐標(biāo)中的位置}


        3、在場(chǎng)景里面創(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)就是一個(gè) mesh    //創(chuàng)建網(wǎng)格對(duì)象    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);//將球體添加到場(chǎng)景中}


        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、周期性渲染場(chǎng)景:

        _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ī)對(duì)象作為參數(shù),控件可以監(jiān)聽(tīng)鼠標(biāo)的變化,改變相機(jī)對(duì)象屬性    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; // 禁用右鍵拖動(dòng)    controls.minPolarAngle = Math.PI / 180; // 視角不能低于水平面    controls.maxPolarAngle = Math.PI / 2; // 視角不能低于水平面    _this.renderFun();//渲染    }


        04

        寫(xiě)在最后

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


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





        “在看”我嗎?

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            性高潮久久久久 | 三级片视频在线看 | 小香蕉网站 | 午夜成人免费观看 | 一边吃奶边做爰 | 国产一区二区操逼视频 | 深夜福利免费 | 操逼免费观看视频网站 | 国产色婷婷在线 | 意大利伦理放荡人妇米达 |