three.js添加3d模型
three官方的几何体也就那么几个,想要生成各种各样的模型,其难度十分之大,这时引入外部模型也不失为一种选择。具体引入办法如下。
导入依赖
点击查看代码
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; //鼠标控制器
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; //模型加载器
虽然名字为GLTFLoader,但实际上glb文件也是能加载的。
初始化场景
点击查看代码
this.scene = new THREE.Scene(); //新建场景
let width = window.innerWidth; //窗口宽度
let height = window.innerHeight; //窗口高度
let k = width / height; //窗口宽高比
this.camera = new THREE.PerspectiveCamera(60, k, 0.1, 1000); //透视相机
this.camera.position.set(0, 0, 10); //设置相机位置
//创建渲染器
this.renderer = new THREE.WebGLRenderer({
antialias: true, //抗锯齿
alpha: true,
});
this.renderer.setSize(width, height); //设置渲染区域尺寸
document
.getElementById("container")
.appendChild(this.renderer.domElement); //将画布添加到container中
其中需要注意的是调节相机参数与相机位置,否则很有可能导致场景中看不见任何东西。
创建背景
这里创建背景有3种办法,各有优劣。
1、直接加载一张贴图作为场景的background。优点:十分简单易于使用。缺点:始终是一张平行与屏幕的平面,无法随鼠标移动拖拽而变换。
点击查看代码
//创建宇宙背景
createUniverse() {
let texture = new THREE.TextureLoader().load(BgImg); //加载背景贴图
this.scene.background = texture; //设置场景背景
},
2、使用天空盒子,加载CubeTextureLoader纹理,再将该纹理设为场景的background。优点:可随鼠标移动拖拽而变换。缺点:需要特制的六张天空盒子贴图,贴图不吻合时,立方体空间边缘会出现明显割裂感,视角两侧贴图会被拉伸。
点击查看代码
import right from "@/assets/img/space1/right.jpg";
import left from "@/assets/img/space1/left.jpg";
import top from "@/assets/img/space1/top.jpg";
import bottom from "@/assets/img/space1/bottom.jpg";
import front from "@/assets/img/space1/front.jpg";
import back from "@/assets/img/space1/back.jpg";
//创建天空盒子
createSkyBox() {
//加载天空盒子纹理
let cubeTexture = new THREE.CubeTextureLoader().load([
right,
left,
top,
bottom,
front,
back,
]);
this.scene.background = cubeTexture; //设置场景背景
},
3、创建一个较大的球体,将场景内的物体全部放入球体内部,此思路也是全景图原理,在vr看房项目中大多能遇见。优点:可随鼠标移动拖拽而变换,由于球心距球壳距离相等,不会出现视角两侧贴图拉伸。缺点:需要调节球体半径到合适的尺度,保证空间相机在球体内部,否则空间会出现黑块。需要保证贴图为360全景图。否则球壳拼接边缘会出现明显空间割裂。
点击查看代码
//创建全景背景
createPanoramicBj() {
let geometry = new THREE.SphereGeometry(10000, 100, 100); //几何体
let material = new THREE.MeshBasicMaterial({
map: new THREE.TextureLoader().load(panoramicImg), //导入图片纹理
color: 0xffffff,
//材质背面显示
side: THREE.BackSide,
});
let mesh = new THREE.Mesh(geometry, material);
this.scene.add(mesh);
},
其中必须使用side: THREE.BackSide,显示材质背面。
3种办法视情况选择,当然也可能有其他我不知道办法。本文使用为创建球体的办法。

创建鼠标控制器
点击查看代码
//创建轨道控制
createOrbitControls() {
//没有缩放阻尼
this.mouseControls = new OrbitControls(
this.camera,
this.renderer.domElement
); //创建控件对象
this.mouseControls.enablePan = true; //右键平移拖拽
this.mouseControls.enableZoom = true; //鼠标缩放
this.mouseControls.minDistance = 0; //相机距离原点的距离范围
this.mouseControls.maxDistance = 100;
this.mouseControls.enableDamping = true; //滑动阻尼
this.mouseControls.dampingFactor = 0.1; //(默认.25)
this.mouseControls.maxPolarAngle = (Math.PI / 4) * 3; //y旋转角度范围
this.mouseControls.minPolarAngle = Math.PI / 4;
// this.mouseControls.autoRotate = true; //自转(相机)
// this.mouseControls.autoRotateSpeed = 5; //自转速度
},
相机的最大与最小距离需要注意调节,否则会出现缩放异常。
创建光源
点击查看代码
//创建光源
createLight() {
this.ambientLight = new THREE.AmbientLight(0x6aceff); //设置环境光
this.scene.add(this.ambientLight); //将环境光添加到场景中
this.pointLight = new THREE.PointLight(0xffffff, 1, 0);
this.pointLight.position.set(10, 10, 0); //设置点光源位置
this.scene.add(this.pointLight); //将点光源添加至场景
},
模型最终显示出来的颜色与环境光和点光源均有关。同时也需要注意调节点光源位置。
加载模型
点击查看代码
//加载模型
loadModel() {
let loader = new GLTFLoader();
//此路径是相当对于public中index.html的,模型必须放在public路径下
loader.load("model/bdd.glb", (gltf) => {
console.log(gltf);
gltf.scene.position.set(0, 0, 0);
this.scene.add(gltf.scene);
});
},

需要注意的是这里加载的模型是必须放在public路径下的,否则会无法加载。注意根据模型尺寸,调节场景的各种参数,否则会无法看见模型。
渲染场景
点击查看代码
//重复渲染
repeatRender() {
//请求动画帧,屏幕每刷新一次调用一次,绑定屏幕刷新频率
requestAnimationFrame(this.repeatRender);
this.mouseControls.update(); //实时更新轨道控制
// this.cube.rotation.y += 0.01; //以y为轴心的旋转角度每帧自加0.01
this.renderer.render(this.scene, this.camera); //将场景和相机进行渲染
},
渲染场景时不要忘记实时update鼠标控制器。
完成
加载一个冰墩墩。

加载一朵玫瑰(win10自带的3D Viewer里面导出的,本文使用的模型全是glb文件。如果是gltf整体文件也可直接导入three,但如果贴图与模型是分开的松散gltf文件可以使用3D Viewer直接另存为glb文件即可导入three)。

加载一个凯瑟琳(在这里下载的,注册用户后里面有大量免费模型可使用)

加载一个剑刃星舰(也是sketchfab里面下载的)。

浏览地址(第一次浏览会缓存模型文件,加载较长时间):http://xisite.top/original/webGL/8/index.html
源码地址:https://gitee.com/xi1213/three-load-model
原文链接:https://xiblogs.top/?id=40
three.js添加3d模型的更多相关文章
- three.js 运行3D模型
HTML <!DOCTYPE html> <html style="height: 100%;"> <head> <title>m ...
- [Altium Designer 学习]怎样添加3D模型
对于为给PCB添加3D模型,很多人觉得这是个绣花针的活,中看不中用.在我看来这也未必,特别是常用的3D模型能在网上下载的今天,只需要几个简单的操作,就能使你的PCB更加赏心悦目.除此之外,3D模型还有 ...
- three.js实现3D模型展示
由于项目需要展示3d模型,所以对three做了点研究,分享出来 希望能帮到大家 先看看效果: three.js整体来说 不是很难 只要你静下心来研究研究 很快就会上手的 首先我们在页面上需要创建一个能 ...
- 关于PCB 3D 模型的快速导入方法
altium designer中创建的3D library 只能查看3D效果,并没有其他功能,经测试在原理图编辑界面通过给元件添加 PCB 3D 并不能真正添加3D模型,这样添加根本没有效果(显示不出 ...
- 使用three.js创建3D机房模型-分享一
序:前段时间公司一次研讨会上,一市场部同事展现了同行业其他公司的3D机房,我司领导觉得这个可以研究研究,为了节约成本,我们在网上大量检索,最后找到一位前辈的博文[TWaver的技术博客],在那篇博文的 ...
- vue.js+THREE.js演示服务端3D模型流程总结
three.js官网 ·场景搭建 使用npm或者其他获取安装three,就像npm i three,之后在需要演示模型的vue组件内import * as THREE from 'three',此时我 ...
- Altium Designer 3D模型的下载与添加
先 先晒几个图:是不是很逼真啊.. ---------------------------------------教程---------------------------------------- ...
- OpenGl读取导入3D模型并且添加鼠标移动旋转显示
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11543828.html 最近实习要用到opengl库就是跟opencv 有点像的那个,然后下了 ...
- OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...
- 3D模型展示以及体积、表面积计算
本文原创 如转载请注明出处!!! 本博客地址http://www.cnblogs.com/we-jack 本文原创,如果有同样需求的小伙伴请第一时间联系我 或者在留言区留言 上次为大家提供了3D模型的 ...
随机推荐
- clickhouse节点重做(节点替换)
测试验证环境: docker容器化部署的4节点2分片和2副本(centos7+clickhouse22.1.3) 172.17.0.6 clickhouse01172.17.0.7 clickhous ...
- 解决方案 | Get-AppxPackage : 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
前几天由于需要卸载一些win10自带应用,导致onenote2016无法启动(根本原因:当时可能remove-appxpackage导致某些微软原生应用出现问题),同时今天使用power shell出 ...
- oeasy教您玩转vim - 30 - # 屏位行号
屏位行号 回忆上节课内容 上次我们主要讲的翻页 :set scrolloff=2 控制上下留天留地 上下翻页(这个最常用) ctrl + f 向下一屏 ctrl + b 向上一屏 上下移屏一行 c ...
- Mac下浏览器跨域配置方法
open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/hooli ...
- C#全局键盘监听(Hook)的使用
一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
- Python 使用rsa类库基于RSA256算法生成JWT
JWT简介 JWT(Json web token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.JWT提供了一种简单.安全的身份认证方法,特别适合分布式站点单点登录.或者是签名. ...
- 题解:CF1918B Minimize Inversions
CF1918B Minimize Inversions 思路 暴力 一个一个的算,复杂度巨大. 数学规律 让逆序最少,也就是让升序更多.我们可以通过多组数据实验,最终我们会发现,将数列 \(A\) 减 ...
- [ABC363G] Dynamic Scheduling 与 P4511 [CTSC2015] 日程管理
思路: 对于插入操作,设插入 \(\{t,p\}\): 若当前 \(1 \sim t\) 有空位,那么就放进去. 否则,\(1 \sim t\) 是被塞满了的: 首先容易想到的是找到 \(1 \sim ...
- ComfyUI插件:ComfyUI Impact 节点(一)
前言: 学习ComfyUI是一场持久战,而 ComfyUI Impact 是一个庞大的模块节点库,内置许多非常实用且强大的功能节点 ,例如检测器.细节强化器.预览桥.通配符.Hook.图片发送器.图片 ...
- 【C3】01 概述
CSS (层叠样式表) 让你可以创建好看的网页,但是它具体是怎么工作的呢? 这篇文章通过一些很简单的例子,告诉我们什么是 CSS, 同时还会涉及一些和 CSS 相关的专业术语. 预备知识: 基本的计算 ...