国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

uniapp vue3中使用threejs渲染3D模型

這篇具有很好參考價(jià)值的文章主要介紹了uniapp vue3中使用threejs渲染3D模型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言: 因?yàn)楣拘枨? 需要在App中內(nèi)嵌一個(gè)3D模型. 在市場(chǎng)上看了一下情況, 大部分都是vue2的, 并沒有vue3的版本...現(xiàn)在vue3也不是個(gè)新東西了. 后期模型會(huì)放入App內(nèi). 下面寫法并不支持App(已解決在App中渲染, 關(guān)注我可見), 支持h5

template:

<template>
  <view class="">
    <view id="threeView">456</view>
    <view class="">
      22222
    </view>
  </view>
</template>

js:

<script module="three" lang="renderjs" setup>
  import * as THREE from 'three'
  //引入軌道控制器(用來通過鼠標(biāo)事件控制模型旋轉(zhuǎn)、縮放、移動(dòng))
  import {
    OrbitControls
  } from 'three/examples/jsm/controls/OrbitControls.js'
  import {
    GLTFLoader
  } from 'three/examples/jsm/loaders/GLTFLoader.js'
  import {
    FBXLoader
  } from 'three/examples/jsm/loaders/FBXLoader.js'
  import {
    computed,
    onMounted,
    ref,
    watch
  } from 'vue'
  // 如果模型沒有顯示出來, 可能是cameraZ的值不夠, 請(qǐng)注意
  let scene = '',
    camera = '',
    renderer = '',
    cube = '',
    sphere = '',
    step = '',
    stats = '',
    group = '',
    cameraZ = 500,
    url = '../../static/Eraser(1).glb',
    width = 800,
    height = 560,
    orbitcontrols = '';
  const init = () => {
    console.log(cameraZ, 'cameraZ');
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000);
    camera.position.set(0, 0, cameraZ);
    renderer = new THREE.WebGLRenderer({
      antialias: true
    });
    renderer.setClearColor(0xffffff, 0);
    renderer.setSize(width / 1.2, height / 1.2);
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.shadowMapEnabled = true;
    document.getElementById("threeView").appendChild(renderer.domElement);
    orbitcontrols = new OrbitControls(camera, renderer.domElement); //移動(dòng)控件
    orbitcontrols.enabled = true;
    orbitcontrols.enableRotate = true;
    orbitcontrols.enableZoom = false;
    orbitcontrols.autoRotate = true;
    orbitcontrols.minPolarAngle = Math.PI / 4;
    orbitcontrols.maxPolarAngle = 3 - (Math.PI / 4);
    console.log('78', url.endsWith('gltf'), url.endsWith('glb'))
    console.log(url)
    if (url.endsWith('gltf') || url.endsWith('glb')) {
      //設(shè)置了六個(gè)平行光  有些材質(zhì)不接受環(huán)境光會(huì)很暗
      const directionLight1 = new THREE.DirectionalLight(0xffffff, 1);
      directionLight1.position.set(-300, 0, 0)
      scene.add(directionLight1);

      const directionLight2 = new THREE.DirectionalLight(0xffffff, 1);
      directionLight2.position.set(300, 0, 0)
      scene.add(directionLight2);

      const directionLight3 = new THREE.DirectionalLight(0xffffff, 1);
      directionLight3.position.set(0, 300, 0)
      scene.add(directionLight3);

      const directionLight4 = new THREE.DirectionalLight(0xffffff, 1);
      directionLight4.position.set(0, 300, 0)
      scene.add(directionLight4);

      const directionLight5 = new THREE.DirectionalLight(0xffffff, 1);
      directionLight5.position.set(0, 0, -300)
      scene.add(directionLight5);

      const directionLight6 = new THREE.DirectionalLight(0xffffff, 1);
      directionLight6.position.set(0, 0, 300)
      scene.add(directionLight6);
    }
    let Sun = new THREE.DirectionalLight(0xffffff, 1);
    Sun.position.set(0, 300, 0);
    Sun.castShadow = true;
    let Ambient = new THREE.AmbientLight(0xffffff, 1);
    scene.add(Ambient);
    scene.add(Sun);
  }
  const loadModel = () => {
    let loader1 = new GLTFLoader();
    let FBXloader = new FBXLoader();
    let rotateObj = [];
    const loadLoader = url.endsWith('fbx') ? FBXloader : loader1;
    loadLoader.load(url, function(gltf) {
      const loadscene = gltf.scene || gltf;

      loadscene.scale.set(1, 1, 1);

      let group = new THREE.Group();
      group.add(loadscene);

      let bbox = new THREE.Box3().setFromObject(group);
      // console.log(bbox,'bbox---');
      let mdlen = bbox.max.x - bbox.min.x; //邊界的最小坐標(biāo)值 邊界的最大坐標(biāo)值
      let mdhei = bbox.max.y - bbox.min.y;
      let mdwid = bbox.max.z - bbox.min.z;
      group.position.set(0, 0, 0);
      // console.log(camera,'相機(jī)的信息',group,'組的信息');
      let dist = Math.abs(camera.position.z - group.position.z - (mdwid / 2));
      //console.log('dist值為:' + dist );
      let vFov = camera.fov * Math.PI / 180; //弧度=角度*Math.PI/180
      //console.log('vFov值為:' + vFov );
      let vheight = 2 * Math.tan(vFov * 0.5) * dist;
      //console.log('vheight值為:' + vheight );
      let fraction = mdhei / vheight;
      // console.log('fraction值為:' + fraction );
      let finalHeight = height * fraction;
      //console.log('finalHeight值為:' + finalHeight);
      let finalWidth = (finalHeight * mdlen) / mdhei;
      //console.log('finalWidth值為:' + finalWidth );                

      let value1 = width / finalWidth;
      // console.log('value1縮放比例值為:' + value1);
      let value2 = height / finalHeight;
      // console.log('value2縮放比例值為:' + value2);

      if (value1 >= value2) {
        group.scale.set(value2, value2, value2);
      } else {
        group.scale.set(value1 / 2, value1 / 2, value1 / 2);
        // group.scale.set(value1,value1,value1);
      }
      let bbox2 = new THREE.Box3().setFromObject(group)
      // console.log(bbox2,'bbox2');
      let mdlen2 = bbox2.max.x - bbox2.min.x;
      let mdhei2 = bbox2.max.y - bbox2.min.y;
      let mdwid2 = bbox2.max.z - bbox2.min.z;
      group.position.set(-(bbox2.max.x + bbox2.min.x) / 2,
        -(bbox2.max.y + bbox2.min.y) / 2,
        -(bbox2.max.z + bbox2.min.z) / 2);
      document.getElementById("threeView").click(); //去掉加載效果
      scene.add(group);
      // let boxhelper = new THREE.BoxHelper(group,0xbe1915); //輔助線外面紅色框
      // scene.add(boxhelper);  
    })
  }
  const animate = () => {
    requestAnimationFrame(animate);
    orbitcontrols.update(); //自動(dòng)旋轉(zhuǎn)
    renderer.render(scene, camera);
  }
  setTimeout(() => {
    init();
    animate();
    loadModel();
  }, 100)
</script>

上面寫法并不優(yōu)雅, 只是臨時(shí)作為一個(gè)demo可以參考.

注意: 需要自己手動(dòng)下載three, 在npm中npm i three即可, 同時(shí)注意script中的屬性

模型鏈接:百度網(wǎng)盤 請(qǐng)輸入提取碼

提取碼:?zsbn文章來源地址http://www.zghlxwxcb.cn/news/detail-531497.html

到了這里,關(guān)于uniapp vue3中使用threejs渲染3D模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • THREEJS 在 uni-app 中使用(微信小程序)

    THREEJS 在 uni-app 中使用(微信小程序)

    threejs 主要是用來開發(fā)web端的3D世界,源生包無法適配 微信小程序(會(huì)報(bào) document.createElementNS 的錯(cuò)),需要使用 github 上經(jīng)過大佬改寫的 threejs 包。 將源碼下載到本地后,找到 將 以上三個(gè)文件 復(fù)制到自己的 uni-app 項(xiàng)目中 (任意路徑下,這里我放在了自己的 utils 下,好像一般

    2024年02月07日
    瀏覽(38)
  • 小程序-uni-app:uni-app-base項(xiàng)目基礎(chǔ)配置及使用/uni-app+vue3+ts+vite+vscode

    小程序-uni-app:uni-app-base項(xiàng)目基礎(chǔ)配置及使用/uni-app+vue3+ts+vite+vscode

    目前(20230605)uni-app最新版本(3.8.4.20230531) 一、官網(wǎng)文檔 微信開放文檔 uni-app官網(wǎng) 二、創(chuàng)建項(xiàng)目 項(xiàng)目目標(biāo):vue3+ts+vite+vscode 創(chuàng)建以 typescript 開發(fā)的工程(如命令行創(chuàng)建失敗,請(qǐng)直接訪問?gitee?下載模板) npx degit dcloudio/uni-preset-vue#vite-ts uniapp-base ? 本文創(chuàng)建成功 ? 為了驗(yàn)

    2024年02月15日
    瀏覽(91)
  • 小程序-uni-app:uni-app-base項(xiàng)目基礎(chǔ)配置及使用 / uni-app+vue3+ts+vite+vscode

    小程序-uni-app:uni-app-base項(xiàng)目基礎(chǔ)配置及使用 / uni-app+vue3+ts+vite+vscode

    目前(20230605)uni-app最新版本(3.8.4.20230531) 一、官網(wǎng)文檔 微信開放文檔 uni-app官網(wǎng) 二、創(chuàng)建項(xiàng)目 項(xiàng)目目標(biāo):vue3+ts+vite+vscode 創(chuàng)建以 typescript 開發(fā)的工程(如命令行創(chuàng)建失敗,請(qǐng)直接訪問?gitee?下載模板) npx degit dcloudio/uni-preset-vue#vite-ts uniapp-base ? 本文創(chuàng)建成功 ? 為了驗(yàn)

    2024年02月05日
    瀏覽(3535)
  • uniapp系列-超詳細(xì)教你在uni-app+vue3里通過web-view組件傳遞信息打開H5頁面寫入localstorage并解決兼容性

    uniapp系列-超詳細(xì)教你在uni-app+vue3里通過web-view組件傳遞信息打開H5頁面寫入localstorage并解決兼容性

    web-view 是一個(gè) web 瀏覽器組件,可以用來承載網(wǎng)頁的容器,會(huì)自動(dòng)鋪滿整個(gè)頁面(nvue 使用需要手動(dòng)指定寬高)。 點(diǎn)擊這里直達(dá)官網(wǎng)文檔 點(diǎn)擊這里下載我的代碼demo 本文最下面還有一些 常見或者奇怪問題解決方案 哦~ 之前開發(fā)好的H5頁面,不想重新開發(fā),想要直接放進(jìn)項(xiàng)目用

    2024年02月09日
    瀏覽(27)
  • Vue3集成ThreeJS實(shí)現(xiàn)3D效果,threejs+Vite+Vue3+TypeScript 實(shí)戰(zhàn)課程【一篇文章精通系列】

    Vue3集成ThreeJS實(shí)現(xiàn)3D效果,threejs+Vite+Vue3+TypeScript 實(shí)戰(zhàn)課程【一篇文章精通系列】

    這是一個(gè)使用Vue3,TypeScript,Vite和Three.js的項(xiàng)目。Vue3是一個(gè)流行的JavaScript框架,用于構(gòu)建用戶界面。TypeScript是一種靜態(tài)類型的編程語言,它是JavaScript的超集,可以編譯成純JavaScript。Vite是一個(gè)由Evan You開發(fā)的新的前端構(gòu)建工具,能夠提供快速的冷啟動(dòng)和即時(shí)熱更新。 Three.j

    2024年02月03日
    瀏覽(25)
  • VUE3+ThreeJs實(shí)現(xiàn)3D全景場(chǎng)景,可自由旋轉(zhuǎn)視角

    VUE3+ThreeJs實(shí)現(xiàn)3D全景場(chǎng)景,可自由旋轉(zhuǎn)視角

    three.js是一個(gè)用于在Web上創(chuàng)建三維圖形的JavaScript庫。它可以用于創(chuàng)建各種類型的三維場(chǎng)景,包括游戲、虛擬現(xiàn)實(shí)、建筑和產(chǎn)品可視化等。three.js提供了許多功能和特性,包括3D渲染、光照、材質(zhì)、幾何形狀、動(dòng)畫、交互和相機(jī)控制等。使用three.js,開發(fā)人員可以輕松地創(chuàng)建復(fù)雜

    2024年02月11日
    瀏覽(24)
  • uniapp使用vue3語法利用uni.navigateTo跳轉(zhuǎn)和接收參數(shù)

    官網(wǎng)利用vue3語法寫uni.navigateTo跳轉(zhuǎn)接參可能出現(xiàn)接收參數(shù)有問題的情況 ,獲取上一個(gè)頁面數(shù)據(jù)需要進(jìn)行調(diào)整。 ????????uni官網(wǎng):uni.navigateTo(OBJECT) | uni-app官網(wǎng) 利用onload鉤子3函數(shù)接收參數(shù)

    2024年02月02日
    瀏覽(22)
  • uni-app使用vue3,在元素或組件實(shí)例上添加ref,用this.$refs顯示undefined

    項(xiàng)目中引用了一個(gè)UI組件庫,在表單上添加了`ref`屬性,方便提交時(shí)驗(yàn)證。觸發(fā)提交方法時(shí)顯示不存在這個(gè)方法或this.$refs為undefined。 解決方法: 引入`getCurrentInstance`,t得到當(dāng)前組件實(shí)例,然后用`ctx.$refs`代替`this.$refs`。這里的`ctx`相當(dāng)于全局this。 ------------------ 2023/10/27更新-

    2024年02月07日
    瀏覽(24)
  • 手寫類似于BetterScroll樣式的左右聯(lián)動(dòng)菜單 uni-app+vue3+ts (使用了script setup語法糖)

    ?注意:在模擬器用鼠標(biāo)滾動(dòng)是不會(huì)切換光標(biāo)的,因?yàn)槭褂玫氖怯|摸滑動(dòng)。【自定義類型貼在最后了】 script 部分如下: ?template部分如下: scss樣式: ?category.d.ts main-arr.d.ts ?

    2024年02月05日
    瀏覽(23)
  • uni-app+vue3會(huì)遇到哪些問題

    已經(jīng)用 uni-app+vue3+ts 開發(fā)了一段時(shí)間,記錄一下日常遇見的問題和解決辦法 uni-app 是支持多端,如果你想讓你的代碼,只在部分平臺(tái)使用,那么就需要用的它的單端處理語法 //#ifdef 和 //#ifndef 等。 因?yàn)橛挟愋问謾C(jī)屏的存在,最頂部有攝像頭,最下面有導(dǎo)航條,為了避免界面內(nèi)

    2024年02月19日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包