THREE.js<模型的紋理貼圖切換>

效果圖:

202006162310.gif

想詳細了解3D模型的導入逸寓,可參考之前的文章母谎。點擊查看

??知識點:

  1. OBJLoader 模型文件加載器,點擊查看 剧防;
 <!-- 引入obj模型加載庫OBJLoader.js -->
<script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/OBJLoader.js"></script>
  1. MTLLoader 材質文件加載器植锉,點擊查看;
<!-- 引入obj模型材質加載庫MTLLoader.js -->
<script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/MTLLoader.js"></script>

??文件:

image.png

??代碼如下:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            /* 隱藏body窗口區(qū)域滾動條 */
        }

        .switchPanel {
            width: 100%;
            position: fixed;
            bottom: 8%;
            z-index: 99;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .chartlet {
            width: 60px;
            height: 60px;
            border-radius: 50%;
            overflow: hidden;
            cursor: pointer;
            margin: 20px;
            position: relative;
            transition: 0.3s;
        }

        .chartlet:hover {
            box-shadow: 0px 2px 5px #525151;
        }

        .chartlet img {
            width: 100%;
            transform-origin: 5% 95%;
            position: absolute;
            bottom: 0;
            transform: scale(4);
        }
    </style>
    <!--引入three.js三維引擎-->
    <script src="http://www.yanhuangxueyuan.com/threejs/build/three.js"></script>
    <!-- 引入threejs擴展控件OrbitControls.js -->
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js"></script>
    <!-- 引入obj模型加載庫OBJLoader.js -->
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/OBJLoader.js"></script>
    <!-- 引入obj模型材質加載庫MTLLoader.js -->
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/MTLLoader.js"></script>
</head>

<body>
    <div class="switchPanel">
        <div class="chartlet" onclick="changeMap('texture1')">
            <img src="./texture1.png" alt="">
        </div>
        <div class="chartlet" onclick="changeMap('texture2')">
            <img src="./texture2.png" alt="">
        </div>
        <div class="chartlet" onclick="changeMap('texture3')">
            <img src="./texture3.png" alt="">
        </div>
    </div>
</body>

<script>
    /**
     * 創(chuàng)建場景對象Scene
     */
    var scene = new THREE.Scene();

    var OBJ;

    /**
     * OBJ和材質文件mtl加載
     */
    var OBJLoader = new THREE.OBJLoader();//obj加載器
    var MTLLoader = new THREE.MTLLoader();//材質文件加載器

    MTLLoader.load('./material.mtl', function (materials) {

        // 返回一個包含材質的對象MaterialCreator
        console.log(materials);

        //obj的模型會和MaterialCreator包含的材質對應起來
        OBJLoader.setMaterials(materials);
        OBJLoader.load('./model.obj', function (obj) {
            scene.add(obj);//返回的組對象插入場景中
            obj.children[0].scale.set(5, 5, 5);//網格模型縮放
            OBJ = obj.children[0] //賦值,方便更換紋理貼圖
            console.log(OBJ)
        })
    })

    // 更換紋理貼圖方法
    function changeMap(img) {
        // 更換紋理貼圖
        var texture = new THREE.TextureLoader().load(img + '.png');
        OBJ.material.map = texture
    }
    
    /**
     * 光源設置
     */
    //點光源
    var point = new THREE.PointLight(0xffffff);
    point.position.set(400, 200, 300); //點光源位置
    // scene.add(point); //點光源添加到場景中
    //環(huán)境光
    var ambient = new THREE.AmbientLight(0xffffff, 1);
    scene.add(ambient);
    /**
     * 相機設置
     */
    var width = window.innerWidth; //窗口寬度
    var height = window.innerHeight; //窗口高度
    var k = width / height; //窗口寬高比
    var s = 150; //三維場景顯示范圍控制系數峭拘,系數越大俊庇,顯示的范圍越大
    //創(chuàng)建相機對象
    var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    camera.position.set(200, 300, 200); //設置相機位置
    camera.lookAt(scene.position); //設置相機方向(指向的場景對象)
    /**
     * 創(chuàng)建渲染器對象
     */
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height); //設置渲染區(qū)域尺寸
    renderer.setClearColor(0xffffff, 1); //設置背景顏色
    document.body.appendChild(renderer.domElement); //body元素中插入canvas對象

    // 渲染函數
    function render() {
        renderer.render(scene, camera); //執(zhí)行渲染操作
        if (OBJ) {
            OBJ.rotation.x += 0.01;//每次繞y軸旋轉0.01弧度
        }
        requestAnimationFrame(render); //請求再次執(zhí)行渲染函數render,渲染下一幀
    }
    render();
    //創(chuàng)建控件對象  相機對象camera作為參數   控件可以監(jiān)聽鼠標的變化鸡挠,改變相機對象的屬性
    var controls = new THREE.OrbitControls(camera);
</script>

</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末辉饱,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子拣展,更是在濱河造成了極大的恐慌彭沼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件备埃,死亡現場離奇詭異溜腐,居然都是意外死亡,警方通過查閱死者的電腦和手機瓜喇,發(fā)現死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門挺益,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乘寒,你說我怎么就攤上這事望众。” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵烂翰,是天一觀的道長夯缺。 經常有香客問我,道長甘耿,這世上最難降的妖魔是什么踊兜? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮佳恬,結果婚禮上捏境,老公的妹妹穿的比我還像新娘。我一直安慰自己毁葱,他們只是感情好垫言,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倾剿,像睡著了一般筷频。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上前痘,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天凛捏,我揣著相機與錄音,去河邊找鬼芹缔。 笑死坯癣,一個胖子當著我的面吹牛,可吹牛的內容都是我干的乖菱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蓬网,長吁一口氣:“原來是場噩夢啊……” “哼窒所!你這毒婦竟也來了?” 一聲冷哼從身側響起帆锋,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吵取,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锯厢,有當地人在樹林里發(fā)現了一具尸體皮官,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年实辑,在試婚紗的時候發(fā)現自己被綠了捺氢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡剪撬,死狀恐怖摄乒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤馍佑,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布斋否,位于F島的核電站,受9級特大地震影響拭荤,放射性物質發(fā)生泄漏茵臭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一舅世、第九天 我趴在偏房一處隱蔽的房頂上張望旦委。 院中可真熱鬧,春花似錦歇终、人聲如沸社证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽追葡。三九已至,卻和暖如春奕短,著一層夾襖步出監(jiān)牢的瞬間宜肉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工翎碑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谬返,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓日杈,卻偏偏與公主長得像遣铝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子莉擒,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355