vue3+threejs可视化项目——引入threejs加载钢铁侠模型(第二步)

news2025/2/23 17:22:24

文章目录

    • ⭐前言
      • 💖vue3系列相关文章
      • 💖threejs系列相关文章
    • ⭐引入threejs
      • 💖初始化一个场景scene
      • 💖 加载模型
      • 💖 加载钢铁侠模型
    • ⭐总结
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享 vue3+threejs可视化项目——引入threejs加载模型(第二步)。
背景
搭建一个模型可视化平台,可以对3d模型进行旋转、缩放、拖拽的基础操作。
threejs框架
Three.js是一个用于在Web浏览器上创建和显示3D图形的JavaScript库。它使用WebGL作为其底层渲染器,提供了一套简单易用的API,使开发者能够使用JavaScript创建复杂的3D场景和动画效果。Three.js包含了各种渲染、几何体、材质、动画、相机和灯光等组件,使开发者能够轻松地构建出令人惊叹的3D效果。

Three.js的主要特点包括:

  1. 简单易用:Three.js提供了一个直观的API,使得开发者能够快速上手并创建3D场景。

  2. 跨平台:Three.js可以在各种主流的Web浏览器上运行,包括桌面和移动设备。

  3. 强大的渲染能力:Three.js使用WebGL作为底层渲染器,可以利用硬件加速来实现高性能的3D渲染。

  4. 多样化的组件:Three.js提供了各种渲染、几何体、材质、动画、相机和灯光等组件,使开发者能够灵活地构建出各种复杂的3D效果。

  5. 社区活跃:Three.js拥有一个活跃的开发者社区,不仅提供了丰富的文档和示例,还有大量的第三方插件和工具可供使用。

总之,Three.js是一个功能强大的JavaScript库,可以帮助开发者在Web浏览器上创建出令人惊叹的3D图形和动画效果。无论是开发游戏、可视化应用还是创建交互式网站,Three.js都是一个非常有用的工具。

💖vue3系列相关文章

vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
前端vue2、vue3去掉url路由“ # ”号——nginx配置
csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板
认识vite_vue3 初始化项目到打包
python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示
让大模型分析csdn文章质量 —— 提取csdn博客评论在文心一言分析评论区内容
前端vue3——html2canvas给网站截图生成宣传海报
vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)

💖threejs系列相关文章

THREE实战1_代码重构点、线、面
THREE实战2_正交投影相机与透视相机
THREE实战3_理解光源
THREE实战5_canvans纹理
THREEJS实战6_加载fbx模型

⭐引入threejs

官方threejs文档:https://threejs.org/docs/index.html#manual/en/introduction/Installation
yarn 安装 threejs

yarn add  three

💖初始化一个场景scene

加载一个cube

<template>
    <div class="container-three-box">
        <div class="view-box" id="model-id">

        </div>
    </div>
</template>

<script setup lang="ts">
    import * as THREE from 'three';
    import {reactive,onMounted} from 'vue'
    const state:any=reactive({
        title:'加载模型',
        domId:'model-id'
    })

    const renderThree=()=>{
        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

        const renderer = new THREE.WebGLRenderer();
        renderer.setSize( window.innerWidth, window.innerHeight );
        document.getElementById(state.domId).appendChild( renderer.domElement );

        const geometry = new THREE.BoxGeometry( 1, 1, 1 );
        const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );

        // cube
        const cube = new THREE.Mesh( geometry, material );
        
        // cube加入场景
        scene.add( cube );

        camera.position.z = 5;

        // 旋转
        function animate() {
            requestAnimationFrame( animate );

            cube.rotation.x += 0.01;
            cube.rotation.y += 0.01;

            renderer.render( scene, camera );
        }

        animate();
    }

    onMounted(()=>{
        renderThree()
    })
</script>

<style lang="less">
    .view-box{
        width:600px;
        height: 600px;
    }
</style>


初始化cube
cube

💖 加载模型

loader一个模型之后加入场景scene

glb实例

const loader = new GLTFLoader();

loader.load( 'path/to/model.glb', function ( gltf ) {

	scene.add( gltf.scene );

}, undefined, function ( error ) {

	console.error( error );

} );

💖 加载钢铁侠模型

将模型放在public静态资源中
file

加载ob的代码块如下

<template>
    <div class="container-three-box">
        <div class="view-box" id="model-id">

        </div>
    </div>
</template>

<script setup lang="ts">
    import * as THREE from 'three';

    import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';
    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';


    import {reactive,onMounted} from 'vue'
    const state:any=reactive({
        title:'加载模型',
        domId:'model-id'
    })

    const renderThree=()=>{
        let camera, scene, renderer;

        let object;


        function init() {

            camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 20 );
            camera.position.z = 2.5;

            // scene

            scene = new THREE.Scene();

            const ambientLight = new THREE.AmbientLight( 0xffffff );
            scene.add( ambientLight );

            const pointLight = new THREE.PointLight( 0xffffff, 15 );
            camera.add( pointLight );
            scene.add( camera );

            // manager

            function loadModel() {

                object.traverse( function ( child ) {

                    if ( child.isMesh ) child.material.map = texture;

                } );

                object.position.y = - 0.95;
                object.scale.setScalar( 0.0008 );
                scene.add( object );

                render();

            }

            const manager = new THREE.LoadingManager( loadModel );

            // texture

            const textureLoader = new THREE.TextureLoader( manager );
            const texture = textureLoader.load( '/static/iron_man/obj/textures/Octane_Albedo.jpg', render );
            texture.colorSpace = THREE.SRGBColorSpace;

            // model

            function onProgress( xhr ) {

                if ( xhr.lengthComputable ) {

                    const percentComplete = xhr.loaded / xhr.total * 100;
                    console.log( 'model ' + percentComplete.toFixed( 2 ) + '% downloaded' );

                }

            }

            function onError() {}

            const loader = new OBJLoader( manager );
            loader.load( '/static/iron_man/obj/source/Octane.obj', function ( obj ) {

                object = obj;

            }, onProgress, onError );

            //

            renderer = new THREE.WebGLRenderer( { antialias: true } );
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.getElementById(state.domId).appendChild( renderer.domElement );

            //

            const controls = new  OrbitControls( camera, renderer.domElement );
            controls.minDistance = 2;
            controls.maxDistance = 5;
            controls.addEventListener( 'change', render );

            //

            window.addEventListener( 'resize', onWindowResize );

        }

        function onWindowResize() {

            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();

            renderer.setSize( window.innerWidth, window.innerHeight );

        }

        function render() {

            renderer.render( scene, camera );

        }

        init()

    }

    onMounted(()=>{
        renderThree()
    })
</script>

<style lang="less">
    .view-box{
        width:600px;
        height: 600px;
    }
</style>

iron_man
360度旋转模型
rotate-iron-man

⭐总结

要在Three.js中加载模型有以下3点注意事项。

  1. 首先,确保已经包含了Three.js库文件。
  2. 创建一个空的HTML页面,并在页面中添加一个canvas元素,用于渲染Three.js场景,确认dom存在:
  3. 注意场景的光线配置和整体缩放

Three.js
Three.js是一个基于WebGL的JavaScript库,用于创建和显示3D图形。它提供了一些方法和工具,使得在网页上加载和展示模型变得更加简单和高效。

加载模型的原理如下:

  1. 创建一个场景(Scene):首先,需要创建一个场景对象,用于存放加载的模型。

  2. 创建一个渲染器(Renderer):接下来,需要创建一个渲染器对象,用于将场景中的模型渲染到屏幕上。渲染器可以通过调用WebGLRenderer类来创建。

  3. 创建一个相机(Camera):在场景中显示模型需要使用一个相机对象。三.js提供了多种相机类型,如透视相机(PerspectiveCamera)和正交相机(OrthographicCamera)等。

  4. 加载模型文件:使用Loader类中的方法,如GLTFLoaderFBXLoader等,加载模型文件。这些方法接收模型文件的路径作为参数,并返回一个模型对象。

  5. 将模型添加到场景中:将加载的模型对象添加到场景中,使用add()方法将模型对象添加为场景的子对象。

  6. 设置光源(Lighting):为了能够正确显示模型的材质和纹理,需要设置光源。可以使用AmbientLightDirectionalLight等类来创建不同类型的光源。

  7. 渲染场景:最后,需要调用渲染器的render()方法将场景中的模型渲染到屏幕上。

以上就是使用Three.js加载模型的基本原理。通过创建场景、渲染器和相机,加载模型文件,并将模型添加到场景中,然后设置光源,最后渲染场景。

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
iron_man

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 最后,感谢你的阅读!

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

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

相关文章

Mysql root 密码重置详解

文章目录 1 概述1.1 前言1.2 mysql 版本查询 2 windows 操作系统2.1 mysql 8 及以上版本2.1.1 关闭 mysql 服务2.1.2 通过无认证方式启动 mysql2.1.3 新开窗口&#xff0c;登录 mysql&#xff0c;重置密码 1 概述 1.1 前言 不同的操作系统&#xff08;如&#xff1a;windows、…

vue2使用 element表格展开功能渲染子表格

默认样式 修改后 样式2 <el-table :data"needDataFollow" border style"width: 100%"><el-table-column align"center" label"序号" type"index" width"80" /><el-table-column align"cent…

AI与区块链的完美交融创新时代的双重引擎

每个投资者都梦想早日进入“下一个亚马逊、苹果或比特币”&#xff0c;以追求代际财富。 然而&#xff0c;这些机会很少而且相距甚远&#xff0c;而且正如每一个虔诚的加密货币本地人都知道的那样&#xff0c;这条道路上常常布满了失败的项目、失信的承诺和波动。 但在 2023 …

5个99%的人可能不知道的实用程序库!

前言 作为一名前端开发者,这些 JavaScript 库极大地提高了我的工作效率,如格式化日期、处理 URL 参数和调试移动网页。朋友们,我想和你们分享这些库。 1. 使用 “Day.js” 来格式化日期和时间 链接 作为开发者,我已经厌倦了在 JavaScript 中操作日期和时间,因为它太麻烦了。…

【SQL】SQL语法小结

相关资料 参考链接1&#xff1a;SQL 语法&#xff08;超级详细&#xff09; 参考链接2&#xff1a;史上超强最常用SQL语句大全 SQL练习网站&#xff1a;CSDN、牛客、LeetCode、LintCode SQL相关视频&#xff1a; 推荐书籍&#xff1a; 文章目录 数据分析对SQL的要求SQL语法简介…

Android Activity的启动流程(Android-10)

前言 在Android开发中&#xff0c;我们经常会用到startActivity(Intent)方法&#xff0c;但是你知道startActivity(Intent)后Activity的启动流程吗&#xff1f;今天就专门讲一下最基础的startActivity(Intent)看一下Activity的启动流程&#xff0c;同时由于Launcher的启动后续…

竞赛保研 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案

工业平板主板采用联发科MT6762平台方案&#xff0c;搭载Android 11.0操作系统&#xff0c; 主频最高2.0GHz&#xff0c;效能有大幅提升;采用12nm先进工艺&#xff0c;具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器&#xff0c;最高主频为680MHz, 支持108…

Vue-24、Vue过滤器

1、效果 2、过滤器实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>过滤器</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.…

有序矩阵中第 K 小的元素

题目链接 有序矩阵中第 K 小的元素 题目描述 注意点 每行和每列元素均按升序排序找到一个内存复杂度优于 O(n) 的解决方案 解答思路 使用二分查找&#xff0c;思路为&#xff1a; &#xff08;1&#xff09;因为左上角的元素值更小&#xff0c;右下角的元素值更大&#xf…

dp专题13 零钱兑换II

本题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 根据题意&#xff0c;这是一道很裸的背包问题&#xff0c;其中这里是返回 背包方案数 的。 我们可以直接推出公式 &#xff1a; dp [ j ] dp[ j - coins[ i ] ] 在我之前…

User-Agent(用户代理)是什么?

User-Agent&#xff08;用户代理&#xff09;是什么&#xff1f; User-Agent 即用户代理&#xff0c;简称“UA”&#xff0c;它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客…

onlyoffice源码编译

环境准备 官网要求CPU dual core 2 GHz or better RAM at least 2 GB, but depends of the host OS. More is better HDD at least 40 GB of free space SWAP at least 4 GB, but depends of the host OS. More is better SoftwareOS 64-bit Ubuntu 16.04 The solution has be…

Linux命令之pwd,cd,ls,cat,more,less,head,tail文件目录类命令的使用

一、实验题 1、在桌面打开终端&#xff0c;查看当前目录 2、改变目录位置至当前目录的父目录 3、改变目录位置至用户的家目录 4、利用绝对路径改变目录到/usr/local目录下 5、列出当前目录下的文件及目录 6、列出包括以“.”开始的隐藏文件在内的所有文件 7、列出当前目录下所…

SQL实践:利用tag检索文件的多种情况讨论(二)

在上一篇文章SQL实践&#xff1a;利用tag检索文件的多种情况讨论中&#xff0c;我们介绍了在使用外键的方式为数据关联tag后&#xff0c;如何筛选&#xff1a; 如何筛选包含某一个tag的数据如何筛选包含且只包含某一个tag的数据如何筛选包含多个指定tag的数据 这篇文章主要是…

Mysql 安装通过mysql installer安装+配置环境+连接可视化工具

注意&#xff1a;不适合纯小白&#xff0c;小白建议移步别的大佬MySQL详细安装教程 目录 注意&#xff1a;不适合纯小白&#xff0c;小白建议移步别的大佬MySQL详细安装教程 前言 准备工作 一、Mysql下载 二、MySQL installer 安装以及系统环境配置 三、检验MySQL 四、可…

docker-consul部署

目录 一、环境 二、consul服务器 三、registrator服务器 四、consul-template 一、环境 consul服务器 192.168.246.10 运行consul服务、nginx服务、consul-template守护进程 registrator服务器 192.168.246.11 运行registrator容器、运行ngi…

Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

文章目录 RTMP服务器搭建与视频流推送第一部分&#xff1a;搭建RTMP服务器&#xff08;流媒体服务器&#xff09;1.1 安装Docker1.2 搭建RTMP服务器 第二部分&#xff1a;使用ffmpeg进行视频推流&#xff08;推流客户端&#xff09;2.1 安装ffmpeg2.2 使用ffmpeg推流 第三部分&…

matlab 直道转向时方向盘最小转角算法

1、内容简介 略 33-可以交流、咨询、答疑 2、内容说明 汽车主动转向&#xff0c;直道转向时方向盘最小转角算法&#xff0c;一个m脚本和simulink的计算结果 略 3、仿真分析 略 4、参考论文 汽车主动转向关键技术研究

ElasticSearch概述+SpringBoot 集成ES

ES概述 开源的、高扩展的、分布式全文检索引擎【站内搜索】 解决问题 1.搜索词是一个整体时&#xff0c;不能拆分&#xff08;mysql整体连续&#xff09; 2.效率会低&#xff0c;不会用到索引&#xff08;mysql索引失效&#xff09; 解决方式 进行数据的存储&#xff08;只存储…