Threejs之加载3D模型(上)

news2024/11/18 7:39:30

本文目录

  • 前言
  • 一、模型类型
    • 1.1 支持的模型类型
    • 1.2 模型加载器
  • 二、常用模型加载器
    • 2.1 代码示例
      • 2.1.1 GLTFLoader
        • 2.1.1.1 代码
        • 2.1.1.2 效果

前言

Three.js 是一个基于 WebGLJavaScript 3D 库,它提供了丰富的 API 来在网页上创建和显示 3D 图形。加载 3D 模型到 Three.js 场景中是一个常见的需求,Three.js 支持多种格式的 3D 模型,如 .glb(GL Transmission Format Binary).gltf(GL Transmission Format).obj.fbx 等。下面将简要介绍如何使用 Three.js 加载 3D 模型。

一、模型类型

1.1 支持的模型类型

Three.js 支持加载多种模型文件格式,常见的包括:

  • glTF (.gltf .glb)glTF (GL Transmission Format) 是一种新型3D模型传输格式,具有高效、紧凑、支持PBR材质等优点,是三维模型的标准格式。
  • OBJ(.obj)OBJ是一种广泛使用的3D模型格式,支持几何体和材质信息,但不支持动画。
  • FBX(.fbx)FBX支持几何体、材质、骨骼动画等丰富信息,常用于3D内容制作和动画。
  • Collada (.dae)Collada支持几何体、材质、动画等丰富信息。
  • PLY (.ply)PLY (Polygon File Format或Stanford Triangle Format) 是一种用于存储3D扫描数据的格式,支持几何体和属性信息。
  • STL(.stI)STL (Stereolithography)是一种广泛用于3D打印的格式,主要支持几何体信息。
  • VRML(.wrl)VRML (Virtual Reality Modeling Language) 是一种早期的3D模型格式,支持几何体、材质和简单动画。
  • 3DS (.3ds)3DS:是Autodesk 3D Studio的格式,支持几何体、材质和简单动画。
  • JSON (.json)Three.jsJSON格式是一种自定义的模型格式,支持几何体材质、动画等信息。

1.2 模型加载器

Three.js提供了多种的加载器来加载以上的模型。例如:

  • GLTF加载器(GLTFLoader)glTF是专为高效传输与加载3D内容设计的开放格式,支持(.gltf)与二进制(.glb)格式。它整合了网格、材质、贴图、动画等丰富元素,并允许外部存储图像与数据,实现场景与资源的灵活传输。
  • OBJ加载器(OBJLoader)OBJ加载器处理3D几何数据,支持(.obj)格式。以易读方式存储顶点位置、UV`坐标、法线及多边形信息,简化3D模型的加载过程。
  • FBX加载器(FBXLoader)FBX是一种广泛使用的3D模型文件格式,支持(.fbx)格式。它可以包含几何形状、材质、动画、骨骼等多种数据,因此在游戏开发、虚拟现实、电影制作等领域有着广泛的应用。
  • DAE加载器(ColladaLoader):用于加载和处理Collada(.dae)格式3D模型文件的扩展。Collada是一种基于XML的3D内容格式,广泛用于三维软件和渲染引擎中,因为它不仅定义了模型的几何体,还包含了材质、光源等多种信息。
  • PLY加载器(PLYLoader):用于加载PLYPolygon File Format,多边形文件格式)格式3D模型文件的加载器。支持(.ply)格式。PLY格式主要用于存储简单的3D几何数据,包括顶点、颜色、法线和UV坐标等,支持二进制和ASCII格式。
  • STL加载器(STLLoader):用于加载STLStereolithography,立体成型术)文件的类。STL文件广泛用于3D打印和计算机辅助设计(CAD)应用程序中,支持(.stl)格式。它包含了模型的几何信息,但通常不包含材质、颜色或纹理信息。
  • WRL加载器(VRMLLoader):用于加载VRMLVirtual Reality Modeling Language,虚拟现实建模语言)文件的加载器。支持(.wrl)格式。尽管VRML是一种较老的、基于文本的格式,用于定义三维对象和世界,但它在某些特定场合或历史项目中仍然有其应用价值。
  • 3DS加载器(TDSLoader):用于加载3DS3D Studio)文件的加载器。3DS文件是由Autodesk3ds Max软件创建的三维模型文件,它包含了模型的几何形状、材质、动画等信息。
  • JSON加载器(JSONLoader):用于加载JSON格式3D模型文件的加载器。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。

二、常用模型加载器

2.1 代码示例

2.1.1 GLTFLoader

2.1.1.1 代码

构造函数
GLTFLoader( filepath, gltfCallback, progressCallback, errorCallback )
代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        html,
        body {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
        }
    </style>
</head>

<body>
    <script type="module">
        // 倒入轨道控制器
        import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
        import * as THREE from 'three';
        import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
        // 创建场景
        const scene = new THREE.Scene();
        scene.background = new THREE.Color(0xffffff);
        // 创建相机
        const camera = new THREE.PerspectiveCamera( // 透视相机
            45, // 视角 角度数
            window.innerWidth / window.innerHeight, // 宽高比 占据屏幕
            0.1, // 近平面(相机最近能看到物体)
            1000, // 远平面(相机最远能看到物体)
        );
        camera.position.set(0, 2, 40);
        // 创建渲染器
        const renderer = new THREE.WebGLRenderer({
            antialias: true, // 抗锯齿
        });
        // 设置渲染器宽高
        renderer.setSize(window.innerWidth, window.innerHeight);
        // renderer(渲染器)的dom元素添加到我们的HTML文档中
        document.body.appendChild(renderer.domElement);
        // 加入灯光
        const light = new THREE.PointLight(0xffffff, 900, 100);
        light.position.set(20, 20, 10);
        const pointLightHelper = new THREE.PointLightHelper(light, 3);
        scene.add(pointLightHelper);

        scene.add(light);
        const ambientLight = new THREE.AmbientLight(0x404040, 100); // 柔和的白光
        scene.add(ambientLight);
        // 地面
        const plane = new THREE.Mesh(
            new THREE.PlaneGeometry(80, 80),
            new THREE.MeshStandardMaterial({ color: 0x817936 })
        );
        plane.rotation.x = -Math.PI / 2;
        // 添加到场景中
        scene.add(plane);
        renderer.shadowMap.enabled = true;
        renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 更好的阴影质量
        renderer.shadowMap.needsUpdate = true;
        plane.receiveShadow = true;
        light.castShadow = true;

        // 导入模型
        const gltfLoader = new GLTFLoader();
        gltfLoader.load("../models/pingzi.glb", (gltf) => {
            console.log(gltf.scene.traverse);
            // 设置模型的材质以接受阴影
            gltf.scene.traverse((child) => {
                if (child.isMesh) {
                    console.log(child)
                    child.castShadow = true; // 让模型产生阴影
                    // child.receiveShadow = true; // 让模型接受阴影
                }
            });
            // 设置模型缩放
            gltf.scene.scale.set(0.1, 0.1, 0.1);
            // 设置模型位置
            gltf.scene.position.set(0, 5.5, 0);
            scene.add(gltf.scene);
        },
            // called while loading is progressing
            (xhr) => {
                console.log((xhr.loaded / xhr.total * 100) + '% loaded');
            },
            // called when loading has errors
            (error) => {
                console.log('An error happened', error);
            })

        // 控制器
        const control = new OrbitControls(camera, renderer.domElement);
        // 开启阻尼惯性,默认值为0.05
        control.enableDamping = true;

        // 渲染循环动画
        function animate() {
            // 在这里我们创建了一个使渲染器能够在每次屏幕刷新时对场景进行绘制的循环(在大多数屏幕上,刷新率一般是60次/秒)
            requestAnimationFrame(animate);
            // 更新控制器。如果没在动画里加上,那必须在摄像机的变换发生任何手动改变后调用
            control.update();
            renderer.render(scene, camera);
        };

        // 执行动画
        animate();
    </script>
</body>
</html>
2.1.1.2 效果

请添加图片描述
可以看到我们就把.glb后缀多模型文件加载进来了,它是一个玻璃瓶子。

在学习的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(学习总结16)C++模版2

C模版2 一、非类型模板参数二、模板的特化1. 概念2. 函数模板特化3. 类模板特化全特化偏特化类模板特化应用示例 三、模板分离编译1. 什么是分离编译2. 模板的分离编译3. 解决方法 模板总结 以下代码环境为 VS2022 C。 一、非类型模板参数 模板参数分为类型形参与非类型形参。…

硬件实用技巧:螺丝M标准、螺丝长度以及螺帽M直径

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142205318 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

[LWIP] 如何实现LWIP热插拔功能

LWIP 1.4.1 硬件stm32f429 HAL 1.8.1 UCOSIII 步骤如下 1、在lwip的opt.h中使能宏定义LWIP_NETIF_LINK_CALLBACK 链接发生变化时调用回调函数 2、在初始化结束后调用函数netif_set_link_callback&#xff0c;为网卡设置一个回调函数&#xff0c;回调参考代码如下 /*** bri…

【诉讼流程-健身房-违约-私教课-多次沟通无效-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(1)】

【诉讼流程-健身房-违约-私教课-多次沟通无效-前期法律流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解&#xff08;1&#xff09;】 &#xff08;1&#xff09;前言说明1、目的2、说明1- 本章你将会看到的内容2 - 健身房其中一些套路1、先给予体验课。2、合同里的文字陷阱3、…

【DOA估计】一种基于高阶广义奇异值分解的多声源方向估计方法【附MATLAB代码】

微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;554073254 摘要 一种基于高阶广义奇异值分解的多声源方位估计方法本文提出了一种有效的宽带声源波达方向&#xff08;DOA&#xff09;估计方法。所提出的框架提供了一种有效的方法来构建一个宽带互相关矩阵从多个窄带互…

压测服务器并使用 Grafana 进行可视化

简介 仓库代码 GitCode - 全球开发者的开源社区,开源代码托管平台 参考 Welcome! - The Apache HTTP Server Project Grafana | 查询、可视化、警报观测平台 https://prometheus.io/docs/introduction/overview/

html+css+js网页设计 旅游 厦门旅游网10个页面

htmlcssjs网页设计 旅游 厦门旅游网10个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&am…

基于vue框架的宠物寄养系统3d388(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物信息,宠物分类,寄养店,宠物寄养,宠物领养,家庭环境,用户宠物 开题报告内容 基于Vue框架的宠物寄养系统开题报告 一、引言 随着人们生活水平的提高和宠物文化的普及&#xff0c;宠物已成为许多家庭不可或缺的一员。因此&…

windows和linux安装mysql5.7.31保姆级教程

一&#xff0c;资源如下&#xff0c;里面有windows和linux版的安装软件&#xff0c;内含Visual C2013中文版windows系统插件 windows资源地址&#xff1a;https://download.csdn.net/download/l1o3v1e4ding/89725150 linux&#xff08;centos&#xff09;资源地址&#xff1a;…

线性基大发现

一.构造方法 1.贪心法&#xff08;每一个数往里插入即可&#xff09; /*贪心法构造线性基的特点&#xff1a; 1.从小到大排列 2.各个基的高位可能存在重复的1 2.线性基不是唯一的&#xff0c;与原集合的元素顺序有关*/ void insert(int x){//贪心法for(int i63;i>0;i--){i…

“百度热搜”揭示月饼遇冷背后:如何在经济下行中理性消费 + 应对风险?

中秋将至,月饼本该成为节日的主角。然而,令人惊讶的是,近期的“百度热搜”显示月饼销售出现了前所未有的冷遇。这背后的原因是什么?在经济下行的背景下,人们的消费观念正悄然转变。今天,我们就来聊聊如何在这样的经济环境中保持理性消费,并应对潜在的经济风险。 经济下行…

数组去重、数组扁平化

数组去重 排序然后for循环判断相邻的两个是否一样 定义新数组&#xff0c;for循环新数组中没有这个元素就添加 利用对象的键&#xff0c;需要新建对象和数组 利用双重for循环判断 利用for循环和indexOf判断是否存在 利用newSet构造函数不接受重复数据 数组扁平化

visual studio code下载教程(手把手)

今天我来给大家介绍一下visual studio code (VScode)的下载 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。 二、官方下载…

谷歌将把那些冗长的文档变成你下一个最喜欢的播客

如果你有很多学校或工作的阅读任务&#xff0c;但更喜欢听播客&#xff0c;谷歌全新的AI驱动的Audio Overview工具可以满足你的需求。这项工具首次在今年的Google I/O大会上展示&#xff0c;Audio Overviews可以让你将文档、幻灯片和其他文本转换为一个AI主持的音频节目&#x…

深度学习:入门简介

目录 一、深度学习与机器学习的关系 二、神经网络构造 三、推导 四、感知器与多层感知器 1.感知器 2.多层感知器 3.偏置 五、如何确定输入层和输出层个数 一、深度学习与机器学习的关系 深度学习是一种机器学习的子领域&#xff0c;利用多层神经网络来学习数据的复杂特…

Windows技术栈企业基础底座(1)-为基于Windows的Nginx安装证书

企业的基础环境是一个组织的信息化数字化底座。传统企业基础环境多种系统&#xff0c;应用交杂&#xff0c;多种技术栈使得深入运维成本极大&#xff0c;且人员知识技能较难复用&#xff0c;造成资源浪费。本系列旨在尝试推动这一理念, 建立Windows, 或linux聚焦的技术栈的企业…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 huggingface-cli download Qwen/Qwen2-7B-Instruct-GGUF qwen2-7…

Flutter能赚钱,你还担心它被Google抛弃吗?

哈喽&#xff0c;我是老刘 Flutter自从诞生以来有很多的质疑和担心。 其中Flutter会不会被Google放弃是大家最重要的一个担心。 尤其是前段时间Flutter团队裁员后这种担心达到了顶点。 但是由LeanCode主导的一次针对Flutter的技术调查报告&#xff0c;应该能很大程度上解答这个…

为什么要分库分表

目录 为什么分库分表业务驱动分库分表优缺点优点缺点 如何分库分表分库分表原则分库多少合适分表多少合适分库分表字段选择逻辑 库或表不够怎么办数据归档 为什么分库分表 业务驱动 业务&#xff1a;增长快&#xff0c;业务复杂度高。系统流量疯狂增长&#xff0c;部分大表数…

[linux 驱动]i2c总线设备驱动详解与实战

目录 1 描述 2 结构体 2.1 bus_type 2.2 i2c_bus_type 2.2.1 i2c_device_match 2.2.2 i2c_device_probe 2.2.3 i2c_device_remove 2.2.4 i2c_device_shutdown 2.2 i2c_adapter 2.3 i2c_algorithm 2.4 i2c_driver 2.5 i2c_client 3 i2c核心 3.1 注册i2c适配器 3.2…