WEB 3D技术 three.js 光照与阴影

本文 我们来说 灯光与阴影

之前 我们有接触到光照类的知识 但是阴影应该都是第一次接触
那么 我们先来看光
首先是 AmbientLight 环境光 你在官网中搜索 AmbientLight 官方是就写明了 环境光是不会产生阴影的
因为 它没有反向
在这里插入图片描述
然后是 DirectionalLight 平行光 它是可以投射阴影的
因为它是类似于太阳 那 太阳照下来 自然是有阴影的
在这里插入图片描述
还有就是 PointLight 点光源
点光源也是可以产生阴影 但 它是自身为中心 四处发光的
就好像一颗光球 会照向四周
在这里插入图片描述
SpotLight 聚光灯
在这里插入图片描述
这个就像舞台聚关灯的一个效果 中心点光很聚集 照向一个放心 越远光越分散 范围越大
在这里插入图片描述
RectAreaLight 平面光源
比较像 从窗户外面照进来的光
但官网也说明白了 平面光是不支持阴影的
在这里插入图片描述
大体可以总结为 环境光和平面光是无法产生阴影的
那么 还有一些材质 也是不支持阴影的

首当其冲的就是 MeshBasicMaterial 基础网格材质
官网会告诉你 它有没有光照都是一样的 自然不会有阴影类的反应
在这里插入图片描述
MeshStandardMaterial 标准网格材质
这种就是 使用Metallic-Roughness工作流程
和光照息息相关的 它就可以产生出阴影
在这里插入图片描述
MeshLambertMaterial 的话 也有光的效果 但是 这种比较粗糙 不光滑
比较适合做木材等表面粗糙的物体的反射效果
在这里插入图片描述
MeshPhongMaterial 则相反 它适合做一些表面光滑的物体
在这里插入图片描述
MeshLambertMaterial 和 MeshPhongMaterial,都是以性能好作为优势的 相对逼真的程度会弱一些

通常情况下 选择 MeshStandardMaterial 标准网格材质 就够了
那么 还有 MeshPhysicalMaterial 物理网格材质
它内部是更高级的渲染引擎 效果会比基础网格材质更加逼真
但是 会消耗更多的性能
他也是能够更光照发生作用的
在这里插入图片描述
OK 那 我们想在就代码搞起喽

我们先把代码搞成这样

import './style.css'
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

//创建相机
const camera = new THREE.PerspectiveCamera(
    45, //视角 视角越大  能看到的范围就越大
    window.innerWidth / window.innerHeight,//相机的宽高比  一般和画布一样大最好
    0.1,
    1000
);
const scene = new THREE.Scene();

//c创建一个canvas容器  并追加到 body上
const renderer = new THREE.WebGLRenderer(0);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

//设置相机位置   这里 我们设置Z轴  大家可以试试  S Y 和 Z  都是可以的
camera.position.z = 5;
//设置相机默认看向哪里   三个 0  代表 默认看向原点
camera.lookAt(0, 0, 0);
//将内容渲染到元素上
renderer.render(scene, camera);
const controls = new OrbitControls(camera, renderer.domElement);

function animate() {
    controls.update();
    requestAnimationFrame(animate);
    /*cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;*/
    renderer.render(scene, camera);
}
animate();

运行起来 就是 一片黑 暂时什么都没有
在这里插入图片描述
我们加入如下代码

// 环境光
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);
//创建球形几何体
const sphere1 = new THREE .Mesh(
new THREE.SphereGeometry(0.7, 32, 32),
new THREE.MeshStandardMaterial({
}))
scene.add(sphere1);

这里 我们设置了 环境光 然后创建了一个球形的几何体
球体材质是 普通的 MeshStandardMaterial
在这里插入图片描述
我们拖动一下 会发现 这个球还是有一个反光的效果
我们在他下面加一个平面

//添加平面
const plane = new THREE.Mesh(
  new THREE.PlaneGeometry(3, 3),
  new THREE.MeshStandardMaterial({})
);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;
scene.add(plane);

也是最普通的材质 然后 position y下移 到 负1的位置 然后 旋转rotation 负90度
在这里插入图片描述
我们转动一下平面
在这里插入图片描述
这里 虽然我们有灯光反射的一个效果 但是 显然没有出现阴影的效果

那么 想要有阴影 首先 你要有能达到阴影要求的光照
然后 我们渲染器 要开启这个渲染的计算

我们官网搜索 WebGLRenderer
下面就有一个 shadowMap 阴影贴图效果
这个属性 默认是false 不使用的
在这里插入图片描述
我们找到 渲染器所在位置 将他的 shadowMap字段下的 enabled 设置为true
在这里插入图片描述
开启了之后 我们要设置光照 投射我们的阴影

我们官网 进入平行直线光
在这里插入图片描述
找到属性中的 castShadow 投射阴影
在这里插入图片描述
他默认 为了避免性能消耗 是关闭的
我们直接在平行光这里 给他 castShadow 设为true即可开启
在这里插入图片描述
然后 物体 我们也要设置 让它能够投射我们的阴影
我们 官网进入 Object3D
它的这个属性也叫 castShadow
是否投射阴影
在这里插入图片描述
我们代码中 将球形几何体的 castShadow 给个true 把它打开
在这里插入图片描述
然后 这个阴影是要映射到我们平面上的
那么 这里 我们平面 要去接受这个阴影效果
Object3D 下的 receiveShadow 属性
在这里插入图片描述
平面这里 我们将 receiveShadow 属性设为true
在这里插入图片描述
这培 我们运行代码
在这里插入图片描述
阴影的效果 就出来啦
在这里插入图片描述
所有的步骤 一个不能少 否则就出不来

好 我们最后的代码就是这样的

import './style.css'
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

//创建相机
const camera = new THREE.PerspectiveCamera(
    45, //视角 视角越大  能看到的范围就越大
    window.innerWidth / window.innerHeight,//相机的宽高比  一般和画布一样大最好
    0.1,
    1000
);
const scene = new THREE.Scene();

// 环境光
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);
directionallight.castShadow = true;
scene.add(directionallight);
//创建球形几何体
const sphere1 = new THREE .Mesh(
  new THREE.SphereGeometry(0.7, 32, 32),
  new THREE.MeshStandardMaterial({})
)
sphere1.castShadow = true;
scene.add(sphere1);
//添加平面
const plane = new THREE.Mesh(
  new THREE.PlaneGeometry(3, 3),
  new THREE.MeshStandardMaterial({})
);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;
plane.receiveShadow = true;
scene.add(plane);


//c创建一个canvas容器  并追加到 body上
const renderer = new THREE.WebGLRenderer(0);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
document.body.appendChild(renderer.domElement);

//设置相机位置   这里 我们设置Z轴  大家可以试试  S Y 和 Z  都是可以的
camera.position.z = 5;
//设置相机默认看向哪里   三个 0  代表 默认看向原点
camera.lookAt(0, 0, 0);
//将内容渲染到元素上
renderer.render(scene, camera);
const controls = new OrbitControls(camera, renderer.domElement);

function animate() {
    controls.update();
    requestAnimationFrame(animate);
    /*cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;*/
    renderer.render(scene, camera);
}
animate();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/308349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java建筑工程建设智慧工地源码

智慧工地管理平台依托物联网、互联网,建立云端大数据管理平台,形成“端云大数据”的业务体系和新的管理模式,从施工现场源头抓起,最大程度的收集人员、安全、环境、材料等关键业务数据,打通从一线操作与远程监管的数据…

代理IP连接不上/网速过慢?如何应对?

当您使用代理时,您可能会遇到不同的代理错误代码显示代理IP连不通、访问失败、网速过慢等种种问题。 在本文中中,我们将讨论您在使用代理IP时可能遇到的常见错误、发生这些错误的原因以及解决方法。 一、常见代理服务器错误 当您尝试访问网站时&#…

MySQL 存储引擎全攻略:选择最适合你的数据库引擎

1. MySQL的支持的存储引擎有哪些 官方文档给出的有以下几种: 我们也可以通过SHOW ENGINES命令来查看: 还可以通过ENGINES表查看 2. 存储引擎比较 我们通过存储引擎表来看各自的优点: InnoDB 默认的存储引擎(SUPPORT字段为D…

LeetCode 36 有效的数独

题目描述 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考…

[openGL]在ubuntu20.06上搭建openGL环境

就在刚刚, 我跑上了一个6小时后出结果的测试程序. 离下班还有很久, 于是我打开了接单群 , 发现了很多可以写的openGL项目. 但是!!我的电脑现在是ubuntu呀, 但是不要慌!!!接下来我一步一步教你如何完美搭建一个ubuntu上的openGL环境. 保证一个坑也不会踩! 文章目录 创建项目工作…

借助Gitee将typora图片上传CSDN

概述 前面已经发了一个如何借助Github将typora上的图片上传到csdn上,但这有个缺陷:需要科学上网才能加速查看已经上传到github上的图片,否则就会出现已经上传的图片,无法正常查看的问题 如何解决? 那就可以使用Gite…

前端(angular)在谷歌(chrome)浏览器使用高德地图api定位报错超时geolocation time out ,能定位但不安全的方法

已知信息整合 正如大家搜到的大佬说的原因是chrome浏览器本身的问题。我换成edge就可以。高德地图给出的地图定位api的常见问题,这是另外还有个别浏览器(如google Chrome浏览器等)本身的定位接口是黑洞 以下是能定位但不安全的方法 连接上…

Java面试之集合篇

前言 本篇主要总结JAVA面试中关于集合相关的高频面试题。本篇的面试题基于网络整理以及自己的总结编辑。在不断的完善补充哦。欢迎小伙伴们在评论区发表留言哦! 1、基础 1.1、Java 集合框架有哪些? Java 集合框架,大家可以看看 《Java 集…

Excel·VBA按指定顺序排序函数

与之前写过的《ExcelVBA数组冒泡排序函数》不同,不是按照数值大小的升序/降序对数组进行排序,而是按照指定数组的顺序,对另一个数组进行排序 以下代码调用了《ExcelVBA数组冒泡排序函数》bubble_sort_arr函数(如需使用代码需复制…

18张AI电脑动漫超清壁纸免费分享

18张AI电脑动漫壁纸,紫色系和暗黑系,都很不错,喜欢的朋友可以拿去 CSDN免积分下载

【云计算】云计算概述

1. 云计算概述 1.1 云计算的定义 美国国家标准与技术研究院(NIST)定义 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件…

AI墨墨交流群正式成立:探索科技前沿,共建智能未来

在这个充满变革的时代,AI技术正如涌泉般迸发,带来无限可能。我们深感,唯有汇聚智慧,方能更好地驾驭这股前沿科技的潮流。因此,我们自豪地宣布:AI墨墨交流群正式成立了!这不仅是一个交流群&#…

小白苦恼:电脑那么多USB口,怎么知道哪个读写更快?

前言 最近有个朋友和小白抱怨:电脑那么多USB接口,有些接口在传输文件的时候实在慢的很。 电脑诞生以来,USB接口就一直存在。但是USB接口还是长得几乎一样,不仔细去研究都不知道哪个USB会更快。 许多小伙伴就会直接放弃辨认&…

阿里云服务器新购、续费、升级优惠活动及代金券领取入口汇总

阿里云作为国内领先的云计算服务提供商,一直以来都为广大的用户提供了优质、稳定、高效的服务。为了更好地满足用户的需求,阿里云会不定期地推出各种优惠活动,包括新购、续费、升级优惠活动以及代金券领取等。本文将为大家详细介绍这些优惠活…

软件测试|详解 Pytest 参数化:简化测试用例的编写

简介 Pytest 是一个广泛使用的 Python 测试框架,它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化,它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例,从而减少冗余的代码。本文将详细介绍 Pytest 的参数化功…

文心、讯飞、ChatGPT大模型横向比较

三种大模型的横向比较分析发现,大模型最终的优异表现依赖于模型规模的突破。 通过比较不同规模的大模型,分析发现大模型的强大生成能力主要源自模型的参数量级的飞跃。尽管方法论上大同小异,但参数量的指数级增长是实现质的飞跃的关键所在。“大力出奇迹”可以说是大模型取得辉…

电子学会C/C++编程等级考试2023年12月(一级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…

嵌入式(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统(Embedded System)是一种特定用途的计算机系统,它通常嵌入在更大的产品或系统中,用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成,旨在满足特定的需求&…

Kafka(四)Broker

目录 1 配置Broker1.1 Broker的配置broker.id0listererszookeeper.connectlog.dirslog.dir/tmp/kafka-logsnum.recovery.threads.per.data.dir1auto.create.topics.enabletrueauto.leader.rebalance.enabletrue, leader.imbalance.check.interval.seconds300, leader.imbalance…

JAVA静态引擎企业网站源码带文档

JAVA静态引擎企业网站源码带文档 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站前台采用freemaker静态化模版引擎生成html5 2.因为是生成的html,无需重复读取数据库,所以访问速度快,轻便,对服务器…