当前位置: 首页 > article >正文

Threejs 材质贴图、光照和投影详解

1. 材质和贴图

材质(Material)定义了物体表面的外观,包括颜色、光泽度、透明度等。贴图(Textures)是应用于材质的图像,它们可以增加物体表面的细节和真实感。

1.1材质类型

  • MeshBasicMaterial:不受光照影响的基础材质。
  • MeshLambertMaterial:考虑漫反射的材质,适合简单的光照场景。
  • MeshPhongMaterial:考虑镜面高光的材质,适合光滑表面的物体。
  • MeshStandardMaterial:基于物理的材质,支持金属度和粗糙度贴图,适用于现代渲染管线。
  • MeshPhysicalMaterial:类似MeshStandardMaterial,但提供更高级的基于物理的渲染特性。

1.2 贴图的作用

  • map(颜色贴图):定义物体的基本颜色。
  • normalMap(法线贴图):通过模拟表面的微小凹凸来增加细节,不增加几何复杂度。
  • aoMap(环境光贴图):模拟物体表面因邻近物体遮挡而产生的暗部效果。
  • displacementMap(位移贴图):实际改变几何形状,创建真实的物理凹凸效果。
  • roughnessMap(粗糙度贴图):控制材质的金属性质和表面粗糙度。

// 贴图
let textureLoader = new THREE.TextureLoader();
let floor = textureLoader.load("./images/base.jpg");
let ambient = textureLoader.load("./images/ambient.jpg");
let height = textureLoader.load("./images/height.jpg");
let normal = textureLoader.load("./images/normal.jpg");
let roughness = textureLoader.load("./images/roughness.jpg");

// 创建一个平面物体
let plane = new THREE.Mesh(
  new THREE.PlaneGeometry(10, 10),
  new THREE.MeshStandardMaterial({
    map: floor, // 基础纹理贴图
    aoMap:ambient, // 环境光贴图
    displacementMap:height, // 位移贴图
    normalMap:normal, // 法线贴图
    roughnessMap:roughness,  // 粗糙度贴图

  }),
);

1.3 效果如下

2. 光照

光照是通过添加光源来实现的,光源类型包括:

  • 环境光(AmbientLight):提供全局照明效果,均匀照亮场景中的所有物体,不会产生阴影。

  • 平行光(DirectionalLight):模拟无限远的光源,如太阳,光线平行,不受距离影响。

  • 点光源(PointLight):从一个点向所有方向发出光线,光线强度随着距离增加而衰减。
  • 半球光(HemisphereLight):光源直接放置于场景之上,光照颜色从天空光线颜色渐变到地面光线颜色。
  • 聚光灯(SpotLight):具有特定方向和圆锥形照射范围的光源,可以产生软边缘或硬边缘的阴影。
// 1. 环境光:均匀的照亮场景中的所有物体。
const ambientLight = new THREE.AmbientLight(0xff0000);
// scene.add( helper );

// 2. 平行光:沿着特定方向发射的光。
const directionalLight = new THREE.DirectionalLight(0x00ffff, 1);
directionalLight.position.set(0, 5, 0)
// 平行光辅助对象
const directionalLighthelper = new THREE.DirectionalLightHelper( directionalLight, 1 );
// scene.add( helper );

// 3. 半球光:光源直接放置于场景之上,光照颜色从天空光线颜色渐变到地面光线颜色。
const hemisphereLight = new THREE.HemisphereLight( 0xff0000, 0x00ff00, 1 );
// scene.add( hemisphereLight );
// 半球光辅助对象
const hemisphereLighthelper = new THREE.HemisphereLightHelper( hemisphereLight, 1 );
// scene.add( hemisphereLighthelper );

// 4. 点光源:从一个点向各个方向发射的光源。
const pointLight = new THREE.PointLight( 0xff0000, 1, 100 ); // 第二个参数1是光照强度,第三个参数100是光源的衰减距离
scene.add( pointLight );
// 点光源辅助对象
const pointLightHelper = new THREE.PointLightHelper( pointLight, 1 );
scene.add( pointLightHelper );

3. 投影

投影需要确保渲染器和光源都支持阴影,并设置物体的castShadowreceiveShadow属性。阴影的质量可以通过调整光源的shadow.mapSize和其他阴影参数来优化。

// 投影: 光源  物体  渲染器

// 平行光:沿着特定方向发射的光。
const directionalLight = new THREE.DirectionalLight(0x00ffff, 1);
directionalLight.position.set(5, 5, 0)
scene.add(directionalLight);
// 平行光辅助对象
const directionalLighthelper = new THREE.DirectionalLightHelper(directionalLight, 1);
scene.add(directionalLighthelper);

// 创建一个平面物体
let plane = new THREE.Mesh(
  new THREE.PlaneGeometry(10, 10),
  new THREE.MeshStandardMaterial({ color: 0xffffff })
);
plane.rotation.x = -Math.PI / 2;

// 创建一个立方体物体
let cube = new THREE.Mesh(
  new THREE.BoxGeometry(2, 2, 2),
  new THREE.MeshStandardMaterial()
);
cube.position.set(0, 2, 0)


// 1.开启渲染器,支持投影
renderer.shadowMap.enabled = true;
// 2.物体开启阴影
cube.castShadow = true;
// 3.接收阴影的物体
plane.receiveShadow = true;
// 4.光照开启阴影
directionalLight.castShadow = true;
// 5.阴影分辨率
directionalLight.shadow.mapSize.width = 2048;
directionalLight.shadow.mapSize.height = 2048;


http://www.kler.cn/a/393189.html

相关文章:

  • 2024-11-13 学习人工智能的Day26 sklearn(2)
  • 计算机网络(3)网络拓扑和IP地址,MAC地址,端口地址详解
  • 前端-同源与跨域
  • 【前端学习指南】Vue computed 计算属性 watch 监听器
  • libcurl.net入门使用
  • pip3 install -e .[stable]讲解
  • Redis增删改查、复杂查询案例分析
  • 【计算机网络】【网络层】【习题】
  • 网络安全——应急响应之Linux入侵排查
  • 2024 年 8 个最佳 API 设计工具图文介绍
  • Java开发人员从零学习ArkTs笔记(二)-函数与类
  • Ubuntu20.04 为脚本文件创建桌面快捷方式 ubuntu
  • Spring Boot框架:电商开发的新趋势
  • #渗透测试#SRC漏洞挖掘#云技术基础03之容器相关
  • 如何用Chrome的Network面板分析HTTP报文
  • 壁仞科技上市前最后一波 校招 社招 内推
  • 基于Java Springboot在线教育学习系统
  • 卫导调零天线功率倒置算法原理及MATLAB仿真
  • 【paper】分布式无人水下航行器围捕智能目标
  • ONLYOFFICE 8.2深度测评:集成PDF编辑、数据可视化与AI功能的强大办公套件
  • Git的使用(基础语句)
  • [AIGC] Python批量处理Excel中的ASR语音文本数据
  • vue项目多入口文件。vue.config.js如何修改配置
  • Python 操作 Excel 表格从简单到高级用法
  • C 语言 数组交换最小值和最大值
  • goframe开发一个企业网站 统一返回响应码 18