目录

项目搭建

初始化three.js基础代码

设置环境纹理

加载机器人模型

添加光阵


今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。

项目搭建

本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用 。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖,安装完成之后终端在安装 npm i three 即可。

因为我搭建的是vue3项目,为了便于代码的可读性,所以我将three.js代码单独抽离放在一个组件当中,在App根组件中进入引入该组件。具体如下:

<template><!-- 球形机器人 --><SphericalRobot></SphericalRobot>
</template><script setup>
import SphericalRobot from './components/SphericalRobot.vue';
</script><style lang="less">*{margin: 0;padding: 0;}
</style>

初始化three.js基础代码

three.js开启必须用到的基础代码如下:

导入three库

import * as THREE from 'three'

初始化场景

const scene = new THREE.Scene()

初始化相机

let camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);
camera.position.set(0, 1.5, 6);

初始化渲染器

let renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth,window.innerHeight);

监听屏幕大小的改变,修改渲染器的宽高和相机的比例

window.addEventListener("resize",()=>{ renderer.setSize(window.innerWidth,window.innerHeight)camera.aspect = window.innerWidth/window.innerHeightcamera.updateProjectionMatrix()
})

设置渲染函数

// 设置渲染函数
function render() {requestAnimationFrame(render);renderer.render(scene, camera);
}

进行挂载

import { onMounted } from "vue";
onMounted(() => {// 添加控制器let controls = new OrbitControls(camera, renderer.domElement);controls.enableDamping = true screenDom.value.appendChild(renderer.domElement)render();
});

设置环境纹理

这里的话通过RGBELoader将HDR(高动态范围)格式的图片数据加载到Three.js中,并将其转换为Cubemap格式的文本形式,以用于创建更高质量、更真实的3D场景和物体。

// 解析 HDR 纹理数据
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader'// 创建rgbe加载器
let hdrLoader = new RGBELoader();
hdrLoader.load("src/assets/imgs/sky12.hdr", (texture) => {texture.mapping = THREE.EquirectangularReflectionMapping;scene.background = texture;scene.environment = texture;
});

呈现的效果如下:

加载机器人模型

经过前几篇对three.js小demo的训练,相信大家对加载模型可谓是得心应手了吧,无非就四步嘛:

第一步引入加载GLTF模型和压缩模型的第三方库:

// 加载GLTF模型
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
// 解压GLTF模型
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';

第二步初始化loader:

// 设置解压缩的加载器
let dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath("./draco/gltf/");
dracoLoader.setDecoderConfig({ type: "js" });
let gltfLoader = new GLTFLoader();
gltfLoader.setDRACOLoader(dracoLoader);

第三步就是加载gltf模型:

// 添加机器人模型
gltfLoader.load("src/assets/model/robot.glb", (gltf) => {scene.add(gltf.scene);
});

第四步就是根据具体情况添加光源:

// 添加直线光
let light1 = new THREE.DirectionalLight(0xffffff, 0.3);
light1.position.set(0, 10, 10);
let light2 = new THREE.DirectionalLight(0xffffff, 0.3);
light1.position.set(0, 10, -10);
let light3 = new THREE.DirectionalLight(0xffffff, 0.8);
light1.position.set(10, 10, 10);
scene.add(light1, light2, light3);

添加光阵

这里使用视频纹理。VideoTexture(视频纹理)是一种用于游戏和其它交互式3D应用程序中的纹理类型。它允许开发人员将视频流或预先录制的视频作为纹理应用于3D模型,从而为用户提供更加逼真的虚拟体验。VideoTexture通常用于创建虚拟电视、显示屏或其他需要显示视频的场景。在使用VideoTexture时,视频将自动循环播放,因此它可以被用作一种实时纹理,来呈现实时生成的影像或流媒体视频。

// 添加光阵
let video = document.createElement("video");
video.src = "src/assets/zp2.mp4";
video.loop = true;
video.muted = true;
video.play();
let videoTexture = new THREE.VideoTexture(video);
const videoGeoPlane = new THREE.PlaneGeometry(8, 4.5);
const videoMaterial = new THREE.MeshBasicMaterial({map: videoTexture,transparent: true,side: THREE.DoubleSide,alphaMap: videoTexture, // 纹理贴图,它可以用于控制模型表面的透明度。
});
const videoMesh = new THREE.Mesh(videoGeoPlane, videoMaterial);
videoMesh.position.set(0, 0.2, 0);
videoMesh.rotation.set(-Math.PI / 2, 0, 0);
scene.add(videoMesh);

接下来可以进行添加镜面反射:在Three.js中,Reflector是一种可以创建反射效果的对象。它可以模拟出水面或镜面等表面的反射效果,用于增强场景的真实感。Reflector可以创建在平面、球体、圆柱体等几何体上,可以使用Three.js中的Reflector、Refractor、RefractorRTT等类来创建不同类型的反射效果。

// 添加镜面反射
let reflectorGeometry = new THREE.PlaneGeometry(100, 100);
let reflectorPlane = new Reflector(reflectorGeometry, {textureWidth: window.innerWidth,textureHeight: window.innerHeight,color: 0x332222,
});
reflectorPlane.rotation.x = -Math.PI / 2;
scene.add(reflectorPlane);

demo做完,给出本案例的完整代码:(获取素材也可以私信博主)

<template><div class="canvas-container" ref="screenDom"></div>
</template><script setup>
import * as THREE from "three";
import { ref, onMounted, onUnmounted } from "vue";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
import { Reflector } from "three/examples/jsm/objects/Reflector";
let screenDom = ref(null);
// 创建场景
let scene = new THREE.Scene();
// 创建相机
let camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);
camera.position.set(0, 1.5, 6);// 创建渲染器
let renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth,window.innerHeight);// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {camera.aspect = window.innerWidth / window.innerHeight;// 更新摄像头camera.updateProjectionMatrix();// 更新摄像机的投影矩阵renderer.setSize(window.innerWidth, window.innerHeight);// 更新渲染器renderer.setPixelRatio(window.devicePixelRatio);// 设置渲染器的像素比
});// 设置渲染函数
function render() {requestAnimationFrame(render);renderer.render(scene, camera);
}onMounted(() => {// 添加控制器let controls = new OrbitControls(camera, renderer.domElement);controls.enableDamping = true screenDom.value.appendChild(renderer.domElement)render();
});// 创建rgbe加载器
let hdrLoader = new RGBELoader();
hdrLoader.load("src/assets/imgs/sky12.hdr", (texture) => {texture.mapping = THREE.EquirectangularReflectionMapping;scene.background = texture;scene.environment = texture;
});// 设置解压缩的加载器
let dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath("./draco/gltf/");
dracoLoader.setDecoderConfig({ type: "js" });
let gltfLoader = new GLTFLoader();
gltfLoader.setDRACOLoader(dracoLoader);
// 添加机器人模型
gltfLoader.load("src/assets/model/robot.glb", (gltf) => {scene.add(gltf.scene);
});// 添加直线光
let light1 = new THREE.DirectionalLight(0xffffff, 0.3);
light1.position.set(0, 10, 10);
let light2 = new THREE.DirectionalLight(0xffffff, 0.3);
light1.position.set(0, 10, -10);
let light3 = new THREE.DirectionalLight(0xffffff, 0.8);
light1.position.set(10, 10, 10);
scene.add(light1, light2, light3);// 添加光阵
let video = document.createElement("video");
video.src = "src/assets/zp2.mp4";
video.loop = true;
video.muted = true;
video.play();
let videoTexture = new THREE.VideoTexture(video);
const videoGeoPlane = new THREE.PlaneGeometry(8, 4.5);
const videoMaterial = new THREE.MeshBasicMaterial({map: videoTexture,transparent: true,side: THREE.DoubleSide,alphaMap: videoTexture, // 纹理贴图,它可以用于控制模型表面的透明度。
});
const videoMesh = new THREE.Mesh(videoGeoPlane, videoMaterial);
videoMesh.position.set(0, 0.2, 0);
videoMesh.rotation.set(-Math.PI / 2, 0, 0);
scene.add(videoMesh);// 添加镜面反射
let reflectorGeometry = new THREE.PlaneGeometry(100, 100);
let reflectorPlane = new Reflector(reflectorGeometry, {textureWidth: window.innerWidth,textureHeight: window.innerHeight,color: 0x332222,
});
reflectorPlane.rotation.x = -Math.PI / 2;
scene.add(reflectorPlane);</script>
<style lang="less" scoped></style>

Three.js--》实现3d球形机器人模型展示相关推荐

  1. Three.js--》实现3d官网模型展示

    目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载飞船模型 实现滚轮滑动切换3D场景 设置星光流动特效 今天简单实现一个three.js的小Demo,加强自己对thr ...

  2. HTML+CSS+JS实现 ❤️3D万花筒图片相册展示特效❤️

    效果演示: 文末获取源码 代码目录: 主要代码实现: HTML代码 : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  3. js jquery 3D模型展示

    本人主要用于商城商品的3D模型展示: 效果如下:    可旋转可放大的3D模型展示 用法介绍 (1)如果你想直接使用简单的展示功能那么已经有封装好的js在此 下载引用即可 https://downlo ...

  4. three.js实现3D模型展示

    开头说明下  文章是转载我同事一个 哥们的.怕自己 以后会用 拿过来  方便以后使用 three.js实现3D模型展示 由于项目需要展示3d模型,所以对three做了点研究,分享出来 希望能帮到大家 ...

  5. 使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课...

    前言: 今年是建国70周年,爱国热情异常的高涨,为自己身在如此安全.蓬勃发展的国家深感自豪. 我们公司楼下为庆祝国庆,拉了这样的标语,每个人做好一件事,就组成了我们强大的祖国. 看到这句话,深有感触, ...

  6. Three 之 three.js (webgl)基础 第二个入门案例之汽车模型加载和简单模型展示

    Three 之 three.js (webgl)基础 第二个入门案例之汽车模型加载和简单模型展示 目录 ​Three 之 three.js (webgl)基础 第二个入门案例之汽车模型加载和简单模型展 ...

  7. 使用three.js创建3D机房模型-分享一

    使用three.js创建3D机房模型-分享一 序:前段时间公司一次研讨会上,一市场部同事展现了同行业其他公司的3D机房,我司领导觉得这个可以研究研究,为了节约成本,我们在网上大量检索,派本人研究一下w ...

  8. 3D API,快速展示模型,实现3D模型在线可视化展示,还能进行各种测量视图等操作......

    如果你是一名从事3D建模相关的代码开发者,是否经常会遇到以下问题: 渲染效果不及预期 模型展示不够直观 测量视图等操作难以实现 ..... 由此带来的结局大多是: 造成客户对模型理解不清晰,增加双方的 ...

  9. 3D全景模型展示可视化技术演示

    在疫情的影响下,全国多地实行管控,人员和货物流通受阻,对企业的产品销售带来很大的影响,这就凸显了线上三维(3D)展示的重要性,线上三维展示可以给企业产品宣传给来不少便利,很多企业利用线上三维交互展示把 ...

最新文章

  1. python之操作系统介绍,进程的创建
  2. ip访问php $_files空,PHP中表单没有问题但$_FILES为空怎么办?
  3. 程序员面试金典 - 面试题 16.01. 交换数字(位运算swap)
  4. 兄弟连 企业shell笔试题 16-31
  5. spring使用之旅(一) ---- bean的装配
  6. cc1plus.exe: error: unrecognized command line option -fno-keep-inline-dllexport
  7. easyui 使用笔记
  8. 实验四------实验十二
  9. 利用ACIS、HOOPS开发三维软件
  10. 请求报错provisional headers are shown
  11. 微量小程序联盟,如何实现微信小程序换量和微信小程序推广?
  12. Android 音视频难学?音视频(流媒体)开发学习也有套路
  13. [最小生成树] 篱笆
  14. nodejs在Linux下使用图片相关模块出现Error: write EPIPE
  15. Unity3d制作菜单栏
  16. Getting help from shells
  17. 跑步与不跑步的人,区别,在十年之后 跑者心语
  18. vimeo下载_通过Vimeo的API喜欢,关注列表和上传
  19. rgb sw 线主板接口在哪_个性外观兼容强,还送三风扇,酷冷至尊TD500 MESH体验|机箱|电源|散热器|主板|白色...
  20. window下生成.pem文件

热门文章

  1. ExtJS6.2学习
  2. 一个人可以搭建数仓吗
  3. Win10删除右键Open folder as pycharm project
  4. 技术分享 | 半监督学习介绍
  5. 基于RFID技术的智能书架
  6. mysql中什么是表?列?行?什么是主键和外键?什么是索引?为什么要使用索引?
  7. 联合国工作机会,面向中国!!!
  8. onsubmit事件 原来是这么回事
  9. 超级计算机更深的蓝,最深不过最清的蓝
  10. 函数指针,指针函数,返回值为指针的函数