three.js 纹理贴图进阶

基础篇:three.js 基础认识与简单应用

纹理贴图:three.js 纹理贴图的使用

一、CubeTextureLoader--添加场景背景

 示例:运行结果如下图

 代码与详解如下:

主要代码:

/**

 * 设置cube纹理加载器--环境贴图

 */

const cubeTextureLoader = new THREE.CubeTextureLoader();

// 参数为6个方向的图片

const envMapTexture = cubeTextureLoader

  .setPath("static/textures/environmentMaps/3/")

  .load(["px.jpg", "nx.jpg", "py.jpg", "ny.jpg", "pz.jpg", "nz.jpg"]);

// 给场景添加背景

scene.background = envMapTexture;

// 给场景中的所有物体添加默认的环境贴图

scene.environment = envMapTexture;

全部代码: 

/*
 * @Description: 详解环境贴图--CubeTextureLoader--添加场景背景
 */
import * as THREE from "three";
// 导入轨道控制器(鼠标控制)
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

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

/*
 * 2.创建相机(这里是 透视摄像机--用来模拟人眼所看到的景象)
 */
const camera = new THREE.PerspectiveCamera(
  75, // 视野角度
  window.innerWidth / window.innerHeight, // 长宽比
  0.1, // 进截面
  1000 // 远截面
);
// 设置相机位置
camera.position.set(7, 7, 7);
scene.add(camera); // 将相机添加到场景中

/**
 * 设置cube纹理加载器--环境贴图
 */
const cubeTextureLoader = new THREE.CubeTextureLoader();
// 参数为6个方向的图片
const envMapTexture = cubeTextureLoader
  .setPath("static/textures/environmentMaps/3/")
  .load(["px.jpg", "nx.jpg", "py.jpg", "ny.jpg", "pz.jpg", "nz.jpg"]);

/*
 *  添加物体
 */
// 创建几何体
const sphereGeometry = new THREE.SphereBufferGeometry(1, 20, 20);
// 设置材质
const material = new THREE.MeshStandardMaterial({
  metalness: 0.7, // 金属材质
  roughness: 0.1, // 光滑度
  // 环境贴图  如果存在scene.environment = envMapTexture;这里可以不写
  // envMap: envMapTexture, 
});
// 生成几何体
const sphere = new THREE.Mesh(sphereGeometry, material);
scene.add(sphere);
// 给场景添加背景
scene.background = envMapTexture;
// 给场景中的所有物体添加默认的环境贴图
scene.environment = envMapTexture;

/**
 * 灯光
 */
// 环境光
const light = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(light);
// 直线光源(平行光)
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
// 设置平行光的位置
directionalLight.position.set(10, 10, 10);
scene.add(directionalLight);

/**
 *  3.初始化渲染器
 */
const renderer = new THREE.WebGL1Renderer();
// 设置渲染器尺寸
renderer.setSize(window.innerWidth, window.innerHeight);
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);

/**
 * 创建轨道控制器(OrbitControls)
 * 可以使得相机围绕目标进行轨道运动
 */
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真是效果,必须在动画循环render()中调用update()
controls.enableDamping = true;
// controls.autoRotate = true;
// controls.autoRotateSpeed = 2; // 自转速度

/**
 * 辅助三维坐标系
 * 红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.
 */
var axesHelper = new THREE.AxesHelper(7);
scene.add(axesHelper);

// 定义循环渲染方法
function render() {
  renderer.render(scene, camera); // 执行渲染操作
  controls.update(); // 加不加都行
  requestAnimationFrame(render); // 渲染下一帧的时候就会调用render函数
}
render();

// 监听尺寸变化实现自适应画面
window.addEventListener("resize", () => {
  // console.log("画面变化了");
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  // 更新摄像机的投影矩阵
  camera.updateProjectionMatrix();
  // 更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
});

 二、经纬线映射贴图与HDR--导入RGBELoader模块

 示例:运行结果如下图

 代码与详解如下:

主要代码:

import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";

// 加载hdr环境图

const rgbeLoader = new RGBELoader();

// 异步加载

rgbeLoader.loadAsync("static/textures/hdr/002.hdr").then((texture) => {

  // 经纬线映射贴图 -- 针对球体 实现周围环境渲染

  texture.mapping = THREE.EquirectangularReflectionMapping;

  scene.background = texture; // 设置场景环境

  scene.environment = texture; // 设置环境贴图

});

全部代码:

/*
 * @Description: 经纬线映射贴图与HDR--导入RGBELoader模块
 */
import * as THREE from "three";
// 导入轨道控制器(鼠标控制)
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";

// 加载hdr环境图
const rgbeLoader = new RGBELoader();
// 异步加载
rgbeLoader.loadAsync("static/textures/hdr/002.hdr").then((texture) => {
  // 经纬线映射贴图 -- 针对球体 实现周围环境渲染
  texture.mapping = THREE.EquirectangularReflectionMapping;
  scene.background = texture; // 设置场景环境
  scene.environment = texture; // 设置环境贴图
});

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

/*
 * 2.创建相机(这里是 透视摄像机--用来模拟人眼所看到的景象)
 */
const camera = new THREE.PerspectiveCamera(
  75, // 视野角度
  window.innerWidth / window.innerHeight, // 长宽比
  0.1, // 进截面
  1000 // 远截面
);
// 设置相机位置
camera.position.set(7, 7, 7);
scene.add(camera); // 将相机添加到场景中

/**
 * 设置cube纹理加载器--环境贴图
 */
// const cubeTextureLoader = new THREE.CubeTextureLoader();
// const envMapTexture = cubeTextureLoader.load([
//   "static/textures/environmentMaps/1/px.jpg",
//   "static/textures/environmentMaps/1/nx.jpg",
//   "static/textures/environmentMaps/1/py.jpg",
//   "static/textures/environmentMaps/1/ny.jpg",
//   "static/textures/environmentMaps/1/pz.jpg",
//   "static/textures/environmentMaps/1/nz.jpg",
// ]);

/*
 *  添加物体
 */
// 创建几何体
const sphereGeometry = new THREE.SphereBufferGeometry(1, 20, 20);
// 设置材质
const material = new THREE.MeshStandardMaterial({
  metalness: 0.7, // 金属材质
  roughness: 0.1, // 光滑度
  // 环境贴图  如果存在scene.environment = envMapTexture;这里可以不写  
  // envMap: envMapTexture, 
});
// 生成几何体
const sphere = new THREE.Mesh(sphereGeometry, material);
scene.add(sphere);
// 给场景添加背景
// scene.background = envMapTexture;
// // 给场景中的所有物体添加默认的环境贴图
// scene.environment = envMapTexture;

/**
 * 灯光
 */
// 环境光
const light = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(light);
// 直线光源(平行光)
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
// 设置平行光的位置
directionalLight.position.set(10, 10, 10);
scene.add(directionalLight);

/**
 *  3.初始化渲染器
 */
const renderer = new THREE.WebGL1Renderer();
// 设置渲染器尺寸
renderer.setSize(window.innerWidth, window.innerHeight);
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);

/**
 * 创建轨道控制器(OrbitControls)
 * 可以使得相机围绕目标进行轨道运动
 */
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真是效果,必须在动画循环render()中调用update()
controls.enableDamping = true;
// controls.autoRotate = true;
// controls.autoRotateSpeed = 2; // 自转速度

/**
 * 辅助三维坐标系
 * 红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.
 */
var axesHelper = new THREE.AxesHelper(7);
scene.add(axesHelper);

// 定义循环渲染方法
function render() {
  renderer.render(scene, camera); // 执行渲染操作
  controls.update(); // 加不加都行
  requestAnimationFrame(render); // 渲染下一帧的时候就会调用render函数
}
render();

// 监听尺寸变化实现自适应画面
window.addEventListener("resize", () => {
  // console.log("画面变化了");
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  // 更新摄像机的投影矩阵
  camera.updateProjectionMatrix();
  // 更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
three.js中,纹理贴图是用来给物体表面添加图案、颜色或者其他视觉效果的一种技术。你可以使用纹理贴图来增强场景的真实感和细节。在three.js中,你可以使用TextureLoader类来加载纹理图像\[2\]。加载纹理图像后,你可以将其应用到材质中,例如MeshBasicMaterial或者RawShaderMaterial\[2\]。在应用纹理贴图时,你可以使用一些常用的属性来调整纹理的效果。例如,你可以使用offset属性来设置纹理的偏移量,center属性来设置纹理的旋转中心点,rotation属性来设置纹理的旋转角度,repeat属性来设置纹理的重复次数\[3\]。此外,你还可以使用wrapS和wrapT属性来设置纹理在水平和竖直方向的重复方式,magFilter和minFilter属性来设置纹理的显示方式\[3\]。在three.js中,常用的纹理种类包括普通贴图、凹凸贴图、法线贴图、位移贴图、金属光泽度贴图、Alpha贴图、自发光贴图、高光贴图和环境贴图\[1\]。你可以根据需要选择适合的纹理种类来实现你想要的效果。 #### 引用[.reference_title] - *1* *2* *3* [threejs-纹理贴图](https://blog.csdn.net/qq_37987033/article/details/126533553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值