Three.js之加载外部三维模型

这篇具有很好参考价值的文章主要介绍了Three.js之加载外部三维模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料

  • 建模软件绘制3D场景
  • 加载.gltf文件(模型加载全流程)

知识点

注:基于Three.jsv0.155.0

  • 三维建模软件
  • gltf格式
  • 加载.gltf文件
  • OrbitControls辅助设置相机参数:相机位置、相机目标对象
  • gltf不同文件形式(.glb)
  • 模型命名(程序与美术协作):.getObjectByName()
  • 递归遍历层级模型修改材质:.traverse()
  • 外部模型材质是否共享的问题
  • 纹理encoding和渲染器
  • gltf模型更换.map(纹理.flipY)

三维建模软件

D美术常用的三维建模软件,比如Blender、3dmax、C4D、maya等等

  • Blender(轻量开源)
  • 3dmax
  • C4D
  • maya

特殊行业项目可能涉及到行业软件,比如机械相关、建筑相关

  • 机械相关:SW、UG等
  • 建筑相关:草图大师、revit

gltf格式

GLTF格式是新2015发布的三维模型格式,随着物联网、WebGL、5G的进一步发展,会有越来越多的互联网项目Web端引入3D元素,你可以把GLTF格式的三维模型理解为.jpg、.png格式的图片一样,现在的网站,图片基本是标配,对于以后的网站来说如果需要展示一个场景,使用3D来替换图片表达也是很正常的事情。图片有很多格式,对于三维模型自然也是如此,Web开发的时候图片会有常用格式,对于Web3D开发也一样,肯定会根据需要选择一个常见的大家都熟悉的格式,随时时间的发展,GLTF必然称为一个极为重要的标准格式。

不仅three.js,其它的WebGL三维引擎cesium、babylonjs都对gltf格式有良好的的支持。

gltf格式文件不一定就是以扩展名.gltf结尾,.glb就是gltf格式的二进制文件。比如你可以把.gltf模型和贴图信息全部合成得到一个.glb文件中,.glb文件相对.gltf文件体积更小,网络传输自然更快。文章来源地址https://www.toymoban.com/news/detail-743355.html

加载.gltf文件

  1. gltf模型加载器GLTFLoader.js
  2. 相机参数根据需要设置
  3. 加载gltf的时候,webgl渲染器编码方式设置
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Three.js</title>
</head>
  <body>
  </body>
  <!-- 具体路径配置,你根据自己文件目录设置,我的是课件中源码形式 -->
  <script type="importmap">
    {
      "imports": {
        "three": "./js/three.module.js",
        "three/addons/": "../three.js/examples/jsm/"
      }
    }
  </script>
  <script type="module">
    import * as THREE from 'three';
    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
    import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

    const width = window.innerWidth
    const height = window.innerHeight

    // 场景
    const scene = new THREE.Scene();

    const textureLoader = new THREE.TextureLoader();
    const texture = textureLoader.load('./img/6.JPG');
    console.log('texture.flipY', texture.flipY);


    const loader = new GLTFLoader();
    // 加载工厂文件
    loader.load('assets/工厂.gltf', function(gltf) {
      // 模型
      const model = gltf.scene;
      console.log('🚀 ~ file: 6.加载外部三维模型.html:34 ~ loader.load ~ model:', model)
      
      // 获取某个模型并改变材质颜色
      const water = model.getObjectByName('水面');
      water.material.map = texture;
      console.log('🚀 ~ file: 6.加载外部三维模型.html:37 ~ loader.load ~ water:', water)

      // water.material = new THREE.MeshBasicMaterial({
      //   color: '#ffffff'
      // })
      // water.material.color.set('#ffffff');

      //遍历模型并改变材质颜色
      model.traverse(function(child){
        // 模型网格
        if(child.isMesh){
          // 网格材质
          child.material.color.set('#ffffff');
        }
      })

      scene.add(model);
    })

    // 点光源
    const pointLight = new THREE.PointLight( 0xffffff, 1.0, 0, 0);
    pointLight.position.set(200, 200, 200 );
    scene.add( pointLight );
    
    // 环境光
    const ambientLight = new THREE.AmbientLight( 0xffffff, 1);
    scene.add( ambientLight );

    // 坐标系
    const axes = new THREE.AxesHelper(200);
    scene.add(axes);

    // 相机
    const camera = new THREE.PerspectiveCamera(75, width/height, 0.1, 3000);
    camera.position.set(-49, 146, 35);
    camera.lookAt(-11, -51,  0.7);

    // 渲染器
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height);
    renderer.render(scene, camera);
    document.body.appendChild(renderer.domElement);

    renderer.outputColorSpace = THREE.SRGBColorSpace;//设置为SRGB颜色空间

    const controls = new OrbitControls(camera, renderer.domElement);
    controls.target.set(-11, -51,  0.7);
    controls.update();//update()函数内会执行camera.lookAt(controls.targe)
    // Vector3 {x: -49.803731395661714, y: 146.90160246353028, z: 35.47368304973255}
    // Vector3 {x: -11.970638355445846, y: -51.0801205834488, z: 0.7429414745816755}
    // 渲染循环
    function render() {
        renderer.render(scene, camera);
        // console.log('🚀 ~ file: 6.加载外部三维模型.html:70 ~ render ~ camera:', camera.position) // 鼠标左键改变相机位置
        // console.log('🚀 ~ file: 6.加载外部三维模型.html:66 ~ controls:', controls.target) // 鼠标右键改变相机观察点
        requestAnimationFrame(render);
    }
    render();

    // 控制器

    controls.addEventListener('change', () => {
      // 因为动画渲染了,所以这里可以省略
      renderer.render(scene, camera);
    });
  </script>
</html>

到了这里,关于Three.js之加载外部三维模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是Web3D?Web3D技术发展历程以及Web3D应用场景

    当今的互联网已经迈入了第三代,这被称为Web3.0,而Web3D正是Web3.0的其中一个技术分支。Web3D是指将三维图形技术应用于Web上的技术,它是将3D图形和Web技术结合起来的一个分支,可以使用户在Web上以更真实、更直观的方式浏览和操作虚拟场景。本文将介绍什么是Web3D、Web3D技术

    2024年02月15日
    浏览(38)
  • Three.js加载外部glb,fbx,gltf,obj 模型文件

    vue3使用Three.js加载外部模型文件 1.安装Three.js 2.新建一个renderModel.js 用于处理Three.js相关逻辑 3.modelPage.vue 中使用页面 6.效果图:

    2024年02月15日
    浏览(32)
  • web3d-three.js场景设计器-天空包围盒-TWEEN.js

    THREE.JS 实现场景天空包围盒,为了让场景背景更具体,而不是呆板的纯色,可以给厂家添加围绕的包围盒。 这里使用球体来实现,球体中央则是场景 给球体添加天空的渐变色 加入场景 代码如下 function createSky( hemiLight) {   const vertexShader = `varying vec3 vWorldPosition;     void main

    2024年01月23日
    浏览(35)
  • 初识web3D--webGL/webGPU

    当今互联网时代,我们已经逐渐习惯了浏览和享受丰富多样的网络内容。从文字、图片到视频,我们可以在Web上畅游于各种信息和娱乐资源之间。然而,随着科技的不断进步,一个全新而令人兴奋的概念正在崭露头角——Web3D。 Web3D是一种革命性的技术,它将三维图形、虚拟

    2024年02月04日
    浏览(42)
  • web3d-three.js场景设计器-sprite广告牌

    three.js使用Sprite精灵实现文字或者图片广告牌 1.将文字绘制到Canvas,调整对应宽高。 2.作为Cavans材质绑定到Sprite 3.加载到场景调整适当的scale function createLabel({ text, fontSize, textColor, color, imageUrl }) {     return new Promise((resolve, reject) = {         let canvas = document.createElement(\\\'canvas\\\')

    2024年02月02日
    浏览(38)
  • 【three.js / React-three-fiber】加载3D模型性能优化

    无论是大型虚拟世界还是简单的网站,性能优化都是必要的。 特别是在运用三维模型的情况下,我们需要更加深入的优化。因为 三维模型通常包含大量的数据和复杂的几何形状 ,如果不进行性能优化,浏览器可能会因为负载过重而崩溃。 在本文中,我们将探讨如何在 thre

    2024年02月02日
    浏览(37)
  • Three.js一学就会系列:05 加载3D模型

    Three.js一学就会系列:01 第一个3D网站 Three.js一学就会系列:02 画线 Three.js一学就会系列:03 炫酷3D划线 Three.js一学就会系列:04 炫酷3D文字 最近开始入坑前端3D建站,跟大家一起慢慢深入three.js做网站3D 这篇文章给大家讲下 如何加载一个3D模型 GLTFLoader : 加载GLTF加载器,glT

    2024年02月02日
    浏览(36)
  • three.js加载3D模型,在网页上展示3D模型(.glb.gltf.fbx格式)

    Three.js是一款开源的主流3D绘图JS引擎,简单点,可以将它理解为three+js就可以了,three表示3D,js表示JavaScript的意思。 结构  .glb.gltf文件最好放在服务器上 放在本地容易报找不到的错 .fbx格式文件可以在本地用3d看图(win10自带)打开另存为.glb格式 index.html代码 js代码 项目案例

    2024年02月11日
    浏览(37)
  • 17个WebGL框架及Web3D图形库

    WebGL是基于OpenGL的JavaScript API库,允许Web浏览器在浏览器中渲染3D / 2D图形,而无需安装额外的插件、桌面应用程序。WebGL允许通过浏览器使用机器GPU将3D图形渲染成HTML页面。WebGL目前在大多数浏览器(如Google Chrome,Mozilla Firefox和Safari)中都受支持。WebGL可以通过浏览器设置或使用

    2024年02月06日
    浏览(48)
  • 纯干货!最全WebGL框架及Web3D图形库

    WebGL 是一个 JavaScript API,用于在 Web 浏览器中呈现交互式 2D 和 3D 图形。它基于 OpenGL ES,这是一种广泛使用的嵌入式系统图形渲染标准。 WebGL 通常用于各种应用程序,包括: 3D 图形: WebGL 允许开发人员在 Web 浏览器中创建和显示 3D 图形,从而实现沉浸式体验、游戏、模拟和

    2024年02月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包