Threejs_12 物体阴影的实现

所以在Threejs的画布世界之中,一个物体有自己的影子呢?

阴影效果的实现

你需要先知道在threejs世界中,有哪些灯光或者材质是可以产生阴影效果的

环境光没有阴影 平行光有阴影(太阳) 点光源有阴影(灯泡) 聚光灯有阴影(手电筒) 平面光源没有阴影(明亮的窗户)

基础网格材质不支持阴影 标准网格材质支持阴影 并且很逼真 代价是性能牺牲 Lambert网格材质(非光泽表面) 支持 Phong网格材质(光泽表面) 支持  物理网格材质 支持 比标准网格更逼真 代价是性能牺牲 MeshToon 支持

1.做一个平面,一个球体

// 做一个球体
const SphereGeometry = new THREE.SphereGeometry(1, 20, 20);
// 材质
const material = new THREE.MeshStandardMaterial({});
const sphere = new THREE.Mesh(SphereGeometry, material);
scene.add(sphere);

// 创建平面
const planeGeometry = new THREE.PlaneGeometry(10, 10);
const plane = new THREE.Mesh(planeGeometry, material);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;
scene.add(plane);

2.添加光源

小球由于没有光照,所以我们还看不见他,所以给他添加一个光照。添加一个环境光和一个直线光源。

// 灯光
// 环境光
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);

 

我们的平面和小球就能看到了

3.渲染器设置开启阴影效果

我们的渲染器是默认关闭阴影效果的,主要是为了性能考虑,所以在我们需要使用阴影效果的时候需要给他开启。

// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true;

4.各种阴影效果开启

在实现阴影效果的时候,所有有关的参数都是需要打开的,比如说我们需要设置平面接受阴影,然后小球开启产生阴影,然后光源开启产生阴影。

// 小球投射阴影
sphere.castShadow = true;

// 平面接收阴影
plane.receiveShadow = true;

//设置直线光源产生阴影
directionalLight.castShadow = true;

这时候,我们的阴影效果就产生了。

全部代码

// 环境光没有阴影 平行光有阴影(太阳) 点光源有阴影(灯泡) 聚光灯有阴影(手电筒) 平面光源没有阴影(明亮的窗户)

// 基础网格材质不支持阴影 标准网格材质支持阴影 并且很逼真 代价是性能牺牲 Lambert网格材质(非光泽表面) 支持 Phong网格材质(光泽表面) 支持  物理网格材质 支持 比标准网格更逼真 代价是性能牺牲 MeshToon 支持

//导入 threejs
import * as THREE from "three";
//导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
//导入补时动画库
import * as TWEEN from "three/examples/jsm/libs/tween.module.js";

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

// 创建相机
const camera = new THREE.PerspectiveCamera(
  45, // 视角
  window.innerWidth / window.innerHeight, // 宽高比 窗口的宽高进行设置的
  0.1, // 近平面   相机最近最近能看到的物体
  1000 // 远平面   相机最远能看到的物体
);

//设置相机位置
camera.position.set(0, 0, 10);

scene.add(camera);

// 创建渲染器
const renderer = new THREE.WebGLRenderer();

// 设置渲染器的大小  (窗口大小)
renderer.setSize(window.innerWidth, window.innerHeight);

// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true;

// 将渲染器的dom元素添加到body中
document.body.appendChild(renderer.domElement);

//设置相机的焦点 (相机看向哪个点)
camera.lookAt(0, 0, 0);

//添加世界坐标辅助器  (红色x轴,绿色y轴,蓝色z轴)一个线段 参数为 线段长度
const axesHelper = new THREE.AxesHelper(5);

//添加到场景之中
scene.add(axesHelper);

// 添加轨道控制器 (修改侦听位置)  一般监听画布的事件  不监听document.body
const controls = new OrbitControls(camera, renderer.domElement);

//渲染函数
function animate() {
  controls.update();
  //请求动画帧
  requestAnimationFrame(animate);
  //渲染
  renderer.render(scene, camera);
  //更新补时动画
  TWEEN.update();
}

//渲染
animate();

// 监听窗口的变化 重新设置渲染器的大小 画布自适应窗口
window.addEventListener("resize", () => {
  // 重新设置渲染器的大小
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 重新设置相机的宽高比
  camera.aspect = window.innerWidth / window.innerHeight;
  // 重新计算相机的投影矩阵
  camera.updateProjectionMatrix();
});

// 做一个球体
const SphereGeometry = new THREE.SphereGeometry(1, 20, 20);
// 材质
const material = new THREE.MeshStandardMaterial({});
const sphere = new THREE.Mesh(SphereGeometry, material);

// 投射阴影
sphere.castShadow = true;

scene.add(sphere);

// 创建平面
const planeGeometry = new THREE.PlaneGeometry(10, 10);
const plane = new THREE.Mesh(planeGeometry, material);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;

// 接收阴影
plane.receiveShadow = true;

scene.add(plane);

// 灯光
// 环境光
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);

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

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

相关文章

自主创新操作系统KeyarchOS的崛起

自主创新操作系统KeyarchOS的崛起 写在前面 在计算机中,操作系统是其最基本也是最为重要的基础性系统软件。从计算机用户的角度来说,计算机操作系统体现为其提供的各项服务;从程序员的角度来说,其主要是指用户登录的界面或者接口…

qlik为app添加定时调度

1,进入qmc/Apps 2,搜索需要添加调度的APP 3,搜索到后双击点开Tasks 4,新增Tasks---点击Create New 5,添加调度器 6,设置调度,双击新增的调度,注意选择时区

从mysql源码编译出相应的库和可执行文件及搭建mysql服务端

目录 1. 问题的提出 2. 源码下载 3. 升级或安装某些前置软件 3.1. 升级CMake 3.2. 升级gcc、g 4. 安装依赖库 4.1. 安装OpenSSL 4.2. 安装Curses 4.3. 安装pkg-config 5. 编译、安装 6. 编译结果、配置 7. 编译错误处理 7.1. 错误1 7.2. 错误2 8. 搭建mysql数…

解决vue中引入天地图显示不全问题,设置setTimeout即可解决!

index.html中引入天地图api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地图 //初始化天地图 initTMap() {const T window.T;// 3.初始化地图对象this.tMap new…

【Linux】历史发展及安装

目录 1. 前言2. Linux历史背景2.1 发展史2.1.1 UNIX发展的历史2.1.2 Linux发展历史 3. 开源4.Linux系统安装4.1 Linux系统选择4.2 登陆 1. 前言 从今天开始学习一门新课程Linux&#xff0c;会以博客的形式分享自己的学习笔记。如有问题请指出&#xff0c;大家共同进步。 2. L…

wvp-gb28181-pro打包

生成可执行jar cd wvp-GB28181-pro mvn package复制错误已复制 生成war cd wvp-GB28181-pro mvn package -P war 生成的包的路径 wvp-GB28181-pro\target

双12电视盒子推荐:测评员解析目前电视盒子哪个最好

电视盒子不需要每月缴费&#xff0c;只需联网就可以收看海量视频资源&#xff0c;游戏、网课、投屏等功能让电视盒子的使用场景更丰富&#xff0c;我每年都会进行数十次电视盒子测评&#xff0c;本期要分享的是双十二电视盒子推荐&#xff0c;全面解析目前电视盒子哪个最好。 一…

边缘计算多角色智能计量插座 x 资产显示标签:实现资产追踪与能耗管理的无缝结合

越来越多智慧园区、智慧工厂、智慧医院、智慧商业、智慧仓储物流等企业商家对精细化、多元化智能生态应用场景的提升&#xff0c;顺应国家节能减排、环保的时代潮流&#xff0c;设计一款基于融合以太网/WiFi/蓝牙智能控制的智能多角色插座应运而生&#xff0c;赋予智能插座以遥…

Selenium4+python被单独定义<div>的动态输入框和二级下拉框要怎么定位?

今天在做练习题的时候,发现几个问题捣鼓了好久,写下这篇来记录 问题一: 有层级的复选框无法定位到二级目录 对于这种拥有二级框的选项无法定位,也不是<select>属性. 我们查看下HTML,发现它是被单独封装在body内拥有动态属性的独立<div>,当窗口点击的时候才会触发…

为什么要学习 Linux?

为什么要学习 Linux&#xff1f; 用 Linus 本人的话来说&#xff0c;用户不需要接触到操作系统。操作系统的功能是给应用程序提供API&#xff0c;因而&#xff0c;只有开发人员才需要学习操作系统。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资料&#xff0c;然后我根…

云原生正在重塑软件的整个生命周期(内附资料)

随着企业数字化转型进程的发展&#xff0c;企业面临着新旧商业形态的剧变&#xff0c;颠覆和重构时刻都在发生。 企业需要更加快速地感知用户侧的需求变化并做出调整&#xff0c;才有可能在竞争中持续积累优势。业务的个性化、敏捷化、智能化需求日益突显&#xff0c;数字化应…

聚类系列(一)——什么是聚类?

目前在做聚类方面的科研工作, 看了很多相关的论文, 也做了一些工作, 于是想出个聚类系列记录一下, 主要包括聚类的概念和相关定义、现有常用聚类算法、聚类相似性度量指标、聚类评价指标、 聚类的应用场景以及共享一些聚类的开源代码 下面正式进入该系列的第一个部分&#xff…

【性能测试】资深老鸟总结,需求分析开始到性能压测实战...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、产品需求 1&a…

设计一个实用好看的餐边柜或者酒柜需要知道这5点。福州中宅装饰,福州装修

餐厅旁边的餐边柜和酒柜是提升餐厅功能性和美观度的重要元素。它们不仅可以提供额外的储物空间&#xff0c;还可以展示精美的餐具和收纳酒品。下面为大家分享一些布置餐边柜和酒柜的灵感&#xff0c;让你的餐厅更加时尚和实用。 1. 餐边柜与酒柜的组合 将餐边柜和酒柜组合在一…

2023年中国制服需求量、市场规模及行业细分需求现状分析[图]

制服是某一种行业为体现自己的行业特点&#xff0c;并有别于其他行业而特别设计的着装。它具有很明显的功能体现与形象体现的双重含义。这种职业装不仅具有识别的象征意义&#xff0c;还规范了人的行为并使之趋于文明化、秩序化。 职业制服市场可细分为国家统一着装部门&#x…

七牛云产品使用介绍之Kodo篇

前不久刚参加完七牛云举办的第二届1024创作节&#xff08;虽然只是单方面的被各方大佬碾压&#xff09; 赛题是网页短视频应用开发&#xff0c;要求作品中使用七牛云的相关产品&#xff0c;于是我决定分享下七牛云产品的使用&#xff08;这么好用的产品很难忍住分享的心情&…

java项目之木里风景文化管理平台(ssm+vue)

项目简介 木里风景文化管理平台实现了以下功能&#xff1a; 前台功能&#xff1a;用户进入系统可以实现首页&#xff0c;旅游公告&#xff0c;景区&#xff0c;景区商品&#xff0c;景区美食&#xff0c;旅游交通工具&#xff0c;红黑榜&#xff0c;个人中心&#xff0c;后台…

Python生成exe文件

Python如何生成exe文件 在终端执行 pip install pyinstaller 在终端执行pyinstaller E:\fund_data\GetFund.py&#xff0c;运行结束后会在D:\Python\Python311\Scripts\dist\目录下生成GetFund.exe文件 3.双击exe文件运行&#xff0c;如果未出现预期结果&#xff0c;可以把e…

Autoware.universe部署06:使用DBC文件进行UDP的CAN通信代码编写

目录标题 一、安装DBC文件编辑工具VectorCANdb二、编写DBC文件2.1 CAN通信协议2.2 编写DBC文件2.2.1 根据CAN协议设置signals2.2.2 设置报文2.2.3 建立节点 三、根据DBC文件编写ROS2驱动程序四、实际通信调试 根据CAN协议编写DBC文件&#xff0c;通过DBC文件编写ROS2包进行UDP通…