Threejs学习05——球缓冲几何体背景贴图和环境贴图

实现随机多个三角形随机位置随机颜色展示效果

这是一个非常简单基础的threejs的学习应用!本节主要学习的是球面缓冲几何体的贴图部分,这里有环境贴图以及背景贴图,这样可以有一种身临其境的效果!这里环境贴图用的是一个.hdr的文件,可以在网上随便下载一些使用,我在这里的例子里面使用的hdr文件已经免费上传到资源中,可以在文章上方直接下载!

实现效果

准备工作

使用vue创建项目,然后实现以上功能需要安装一些插件:threejs

javascript 复制代码
yarn add three

在index.html中引入main.js

javascript 复制代码
<script src="./main/main.js" type="module"></script>

然后我们编写的Threejs代码都在main.js中编写!

设计效果

引入OrbitControls鼠标控制插件

javascript 复制代码
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

创建一个场景

javascript 复制代码
//创建一个场景
const scene = new THREE.Scene();

创建一个透视相机

javascript 复制代码
/**
 * 创建一个相机(透视相机)
 * fov --- 摄像机视锥体垂直视野角度
    aspect --- 摄像机视锥体长宽比
    near --- 摄像机视锥体近端面
    far --- 摄像机视锥体远端面
 */
const camera = new THREE.PerspectiveCamera(90,window.innerWidth/window.innerHeight,1,1000);

设置相机对象位置以及将相机加入场景中

javascript 复制代码
//设置相机对象 x y z
camera.position.set(0,0,10); 
//相机加入场景中
scene.add(camera);

接下来我们循环创建球缓冲几何体对象,并设置球缓冲几何体的材质,这里我们主要设置材质的金属材质metalness以及光滑程度roughness,然后根据球缓冲几何体以及材质创建一个网格物体,最后将物体添加到场景中。

javascript 复制代码
//球缓冲几何体
const sphereGeometry = new THREE.SphereGeometry(1,30,30);
const material = new THREE.MeshStandardMaterial({
    metalness:0.9,  // 金属材质 1 黑
    roughness:0.1   //光滑
});
//新建物体
const sphere = new THREE.Mesh(sphereGeometry,material);
//将绑定的物体添加到场景中
scene.add(sphere);

设置three渲染器并初始化渲染器大小并把渲染器添加到场景中!

javascript 复制代码
//初始化渲染器
const render = new THREE.WebGLRenderer();
//设置渲染尺寸大小
render.setSize(window.innerWidth,window.innerHeight);

//将webgl渲染的canvas内容添加到body
document.body.appendChild(render.domElement)

最后我们添加坐标轴辅助器,并加入场景中!以及我们的控制器可以使得鼠标能够转动场景内容!

javascript 复制代码
//创建坐标轴辅助器
const axes = new THREE.AxesHelper(5);
scene.add(axes);

//添加控制器
const control = new OrbitControls(camera,render.domElement)
control.update();

//设置时钟
render.render(scene,camera);
function animate(){
    requestAnimationFrame(animate)
    //使用渲染器  通过相机将场景渲染
    render.render(scene,camera);
}
animate()

以上就在页面可以看到一个黑色的球了!

下面我们添加环境纹理贴图这里使用到Three里面的rgb加载器RGBELoader

首先我们在最上方引入RGBELoader

javascript 复制代码
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader'

然后我们再main.js中创建加载器对象

javascript 复制代码
const rgbeLoader = new RGBELoader();

接下来就是加载hdr文件并设置贴图模式和场景的背景贴图为加载器参数的纹理,以及场景的环境贴图为加载器参数的纹理,这里接可以在页面看到效果了!!

注意:这里的hdr路径是放在dist下面的image,也就是说代码运行的是dist下面的路径,自己需要放在其他路径的可以自己改一下

javascript 复制代码
rgbeLoader.loadAsync("/image/001.hdr").then((texture)=>{
    //贴图模式 经纬线映射贴图
    texture.mapping = THREE.EquirectangularReflectionMapping;
    //背景贴图
    scene.background = texture;
    //环境贴图
    scene.environment = texture;
});

在上一章介绍中主要就是加了一个环境RGB加载器!!也就是多加了几行代码!

效果:

小demo完成!!有点小意思!!

完整代码如下:

javascript 复制代码
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
//加载
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader'

//了解thres最基本用法
const camera = new THREE.PerspectiveCamera(90,window.innerWidth/window.innerHeight,1,1000);

//1.创建一个场景
const  scene = new THREE.Scene();

//设置相机对象 x y z
camera.position.set(0,0,10); 
//相机加入场景中
scene.add(camera);
//球缓冲几何体
const sphereGeometry = new THREE.SphereGeometry(1,30,30);
const material = new THREE.MeshStandardMaterial({
    metalness:0.9,  // 金属材质 1 黑
    roughness:0.1   //光滑
});
//新建物体
const sphere = new THREE.Mesh(sphereGeometry,material);
//将绑定的物体添加到场景中
scene.add(sphere);

//初始化渲染器
const render = new THREE.WebGLRenderer();
//设置渲染尺寸大小
render.setSize(window.innerWidth,window.innerHeight);

//将webgl渲染的canvas内容添加到body
document.body.appendChild(render.domElement)

//创建坐标轴辅助器
const axes = new THREE.AxesHelper(5);
scene.add(axes);

//添加控制器
const control = new OrbitControls(camera,render.domElement)
control.update();

//设置时钟
render.render(scene,camera);
function animate(){
    requestAnimationFrame(animate)
    //使用渲染器  通过相机将场景渲染
    render.render(scene,camera);
}
animate()

//加载环境图
const rgbeLoader = new RGBELoader();

rgbeLoader.loadAsync("/image/001.hdr").then((texture)=>{
    //贴图模式 经纬线映射贴图
    texture.mapping = THREE.EquirectangularReflectionMapping;
    //背景贴图
    scene.background = texture;
    //环境贴图
    scene.environment = texture;
});

目前还在学习threejs,有写错误的地方请指出!!现在只是一个菜鸟,不喜勿喷!!

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习