three.js尝试渲染gbl模型成功!(三)

参照教程:https://cloud.tencent.com/developer/article/2276766?areaSource=102001.5&traceId=88k805RaN_gYngNdKvALJ
(作者:九仞山)

通过最近两天查three.js入门教程了解到 这玩应支持包括 .obj、.gltf等类型的模型结构。
glTF(GL传输格式)是Khronos的一个开放项目,它为3D资产提供了一种通用的、可扩展的格式,这种格式既高效又与现代web技术高度互操作。

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"
// GLTF加载器(GLTFLoader),用于载入glTF 2.0资源的加载器。
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
// OrbitControls是THREEJS中最常用的一个控制器,可以帮助我们实现以目标为焦点的旋转缩放。

(上面这方法 我还是报错 OrbitControls从cdn里引还行 GLTFLoader 可能是地址错还是咋的 也不成)
虽然名字为GLTFLoader,但实际上glb文件也是能加载的

有个模型素材网站 外国地 有免费和收费模型下载
https://sketchfab.com/search?features=downloadable&type=models

在这里插入图片描述
不要钱地就会有下载按钮
在这里插入图片描述
选择要下载的格式
在这里插入图片描述
这里先尝试glb (别问为啥 问就是找的教程里用的这格式 )
下载完长这样 给他复制到 项目里
在这里插入图片描述
gltf文件
gltf文件全称Graphics Language Transmission Forma(图形语言传输格式),是一种三维模型格式,用于传输和加载3D场景和模型;其号称是图形界的JPEG,能够实现快速的模型数据交换。

gltf文件核心是JSON文件,一个gltf文件可传输一个或多个场景, 包括网格、材质、贴图、蒙皮、骨架、变形目标、动画、灯光以及摄像机等信息。

加载gltf文件
下面通过代码实现加载一个gltf格式的文件到场景中,首先还是需要创建场景、相机、渲染器等初始化代码,具体步骤查看前面章节,代码如下

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js 3d model text</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <link type="text/css" rel="stylesheet" href="main.css">
        <style>
            body {
                background-color: #bfe3dd;
                color: #000;
            }
            a {
                color: #2983ff;
            }
        </style>
    </head>

    <body>
        <div id="container"></div>
        <script type="importmap">
            {
                "imports": {
                    "three": "../build/three.module.js",
                    "three/addons/": "./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';

            // 定义变量
            let scene,camera,renderer
            let axesHelper
            let hesLight,dirLight,sportLight 
            let controls       
            
            // 初始化场景
            initScene()
            // 初始化辅助轴
            initAxesHelper()
            // 初始化灯光
            initLight()
            // 初始化mesh
            initMesh()
            // 初始化相机
            initCamera()
            // 初始化渲染器
            initRenderer()
            // 循环动画
            animate()
            // 初始化轨道控制器
            initControls()

      
            window.addEventListener('resize',function() { 
                camera.aspect = window.innerWidth / window.innerHeight
                camera.updateProjectionMatrix()
                renderer.setSize(window.innerWidth,window.innerHeight)
            })

            function initScene() {
                scene = new THREE.Scene()
                scene.background = new THREE.Color(0xffffff)
            }

            function initAxesHelper() {
                // axesHelper = new THREE.AxesHelper(5)
                // scene.add(axesHelper)
            }
            
            function initLight() {
            //     hesLight = new THREE.HemisphereLight(0xffffff,0xffffff)
            //     hesLight.intensity = 0.8
            //     scene.add(hesLight)
            //     dirLight = new THREE.DirectionalLight()
            //     dirLight.position.set(5,5,5)
            //     scene.add(dirLight)
            //     sportLight = new THREE.SpotLight(0xffffff)
            //     sportLight.position.set(0,10,10)
            //      scene.add(sportLight)               

                const ambientLight = new THREE.AmbientLight(0xffffff, 1.5);
                scene.add(ambientLight);
                const directionalLight = new THREE.DirectionalLight(0xffffff, 2);
                directionalLight.position.set(10, 10, 10)
                scene.add(directionalLight);
            }

            function initMesh() {
                
            }

            function initCamera() {
                camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,100)
                camera.position.set(1.5,1.5,1.5)
            }

            function initRenderer() {
                renderer = new THREE.WebGLRenderer({antialias:true})
                renderer.setPixelRatio(window.devicePixelRatio)
                renderer.setSize(window.innerWidth,window.innerHeight) 
                document.body.appendChild(renderer.domElement) 
            }

            function initControls() { 
                controls = new OrbitControls(camera, renderer.domElement)
            }

            function animate() {
                requestAnimationFrame(animate)
                renderer.render(scene,camera)
            }

            const loader = new GLTFLoader()

            //   loader.load( 'models/gltf/chinese_house.glb',function(gltf) {
            loader.load( 'models/gltf/cute_character.glb',function(gltf) {
                console.log(gltf);  
                scene.add(gltf.scene)
            })

            //解决加载gltf格式模型纹理贴图和原图不一样问题
            renderer.outputEncoding = THREE.sRGBEncoding;

        </script>

    </body>

</html>

因为我OrbitControls GLTFLoader 鼠标控制器和模型加载器引入一直报错 最后复制的官网案例文件可以成功渲染

import * as THREE from ‘three’;
import { OrbitControls } from ‘three/addons/controls/OrbitControls.js’;
import { GLTFLoader } from ‘three/addons/loaders/GLTFLoader.js’;

在这里插入图片描述
第一个3D模型就渲染出来了 !!!
谁的嘴角比AK还难压我不说
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Harmony鸿蒙南向驱动开发-RTC

RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时钟给操作系…

李廉洋:4.9黄金屡创新高。黄金原油晚间最新分析建议。

但当下不管是战争因素所带来的避险情绪影响还是美国降息与否所带来的经济影响都无疑还是支撑着黄金继续走高&#xff0c;那么接下来&#xff0c;只要市场不出现较大的利空影响&#xff0c;黄金都不会有较大的回调力度&#xff0c;所以我们当下不管是短线还是长线仍旧以继续看多…

urwid,一个好用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - urwid。 Github地址&#xff1a;https://github.com/urwid/urwid Urwid 是一个功能强大的 Python 库&#xff0c;用于创建基于文本的用户界面&#xf…

Linux CPU利用率

Linux CPU利用率 在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单&#xff0c;说复杂也不是那么…

[Java基础揉碎]System类

1) exit 退出当前程序 2) arraycopy: 复制数组元素&#xff0c;比较适合底层调用&#xff0c;一般使用 Arrays.copyOf完成复制数组(Arrays.copyOf其实底层也是用的System.arraycopy, 本质是一样的) int[] src{1,2,3}; int[] dest new int[3]; System.arraycopy(src, 0, des…

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

【力扣 Hot100 | 第一天】4.10 两数相加

文章目录 1.两数相加&#xff08;4.10&#xff09;1.1题目1.2解法一&#xff1a;模拟1.2.1解题思路1.2.2代码实现 1.两数相加&#xff08;4.10&#xff09; 1.1题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c…

Docker容器应用为工业连接提供了新选择

一 智能数据管理 Docker容器应用能够被灵活部署在异构计算平台上&#xff0c;且仅需占用少量的资源&#xff0c;这可为工业4.0提供一种新的数据集成方案。Docker容器应用程序是提供特定功能的小型软件模块&#xff0c;可在自动化领域中用于智能数据管理。而Softing推出的新产品…

day55 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1 300 最长递增子序列 题目链接 300 最长递增子序列 题意 找到整数数组nums的最长严格递增子序列的长度&#xff08;子序列并不改变原始的顺序&#xff0c;但是可以删除元素&#xff09; 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i] 表示以nums[i…

【现代C++】委托构造函数

现代C中的委托构造函数&#xff08;Delegating Constructors&#xff09;是C11引入的特性&#xff0c;它允许一个构造函数调用同一个类中的另一个构造函数&#xff0c;以避免代码重复。这种特性在初始化对象时提高了代码的复用性和清晰性。 1. 基本用法 在同一个类中&#xf…

Harmony鸿蒙南向驱动开发-MMC

MMC&#xff08;MultiMedia Card&#xff09;即多媒体卡&#xff0c;是一种用于固态非易失性存储的小体积大容量的快闪存储卡。 MMC后续泛指一个接口协定&#xff08;一种卡式&#xff09;&#xff0c;能符合这种接口的内存器都可称作MMC储存体。主要包括几个部分&#xff1a;…

似曾相识:面向重复类型故障的可操作故障定位

导读 搜索引擎、在线视频和电子银行等在线服务系统在人们的日常生活中有着越来越重要的作用。但是&#xff0c;由于在线服务系统包含众多有着复杂依赖关系的组件&#xff08;例如服务器、容器和微服务等等&#xff09;&#xff0c;在线服务系统中的故障难以避免&#xff0c;并…

49 样式迁移【李沐动手学深度学习v2课程笔记】

1. 样式迁移&#xff08;Style Transfer) 计算机视觉的应用之一&#xff0c;将样式图片中的样式&#xff08;比如油画风格等&#xff09;迁移到内容图片&#xff08;比如实拍的图片&#xff09;上&#xff0c;得到合成图片 可以理解成为一个滤镜&#xff0c;但相对于滤镜来讲…

leetcode 常考题-动态规划算法-单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode"…

七分钟,拿下口头offer

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen &#x1f9d1;‍&#x1f4bb;&#x1f9d1;‍&#x1f4bb;面2&#xff1a;行了…

每日一题 — 最大连续 1 的个数III

解法一&#xff1a;暴力枚举 先定义left和right双指针&#xff0c;left先固定在起始位置&#xff0c;遍历right当值等于1的时候&#xff0c;直接跳过&#xff0c;等于0的时候&#xff0c;zero计数器加一当zero等于k的时候&#xff0c;就开始记录此时最大长度是多少然后left加一…

做抖店要用到的东西:什么是精选联盟?开通到使用一篇详解!

哈喽~我是电商月月 做抖音小店的新手朋友在翻阅资料时一定接触过精选联盟这个东西 但它到底是干嘛的&#xff1f;如何开通。又是如何使用&#xff01;还没入手的朋友是不知道的 所以&#xff0c;今天我就给大家讲解一下精选联盟的入驻方法&#xff0c;以及在运营时要怎么正确…

蓝桥杯第十届c++大学B组详解

目录 1.组队 2.年号字符 3.数列求值 4.数的分解 5.迷宫 6.特别数的和 7.完全二叉树的权值 8.等差数列 9.后缀表达式 10.灵能传输 1.组队 题目解析&#xff1a;就是在个篮球人中选择这个最大的成绩&#xff0c;每个人只能选择一次不能重复选择。选满5人之后的成绩是最…

企业如何部署有效的防泄密软件策略?

在企业信息化飞速发展的今天&#xff0c;数据泄露的后果可能是灾难性的&#xff0c;不仅会导致经济损失&#xff0c;还可能损害公司的声誉。因此&#xff0c;制定和部署一个全面而有效的防泄密软件策略对于防范这种风险至关重要。策略的目标不仅是阻止外部攻击&#xff0c;更要…

《C++程序设计》阅读笔记【7-堆和拷贝构造函数】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 堆与拷贝构造函数1.1 概述1.2 分配堆对象1.3 拷贝构造函数1.3.1 默…