35. Three.js案例-创建带阴影的球体与平面

server/2024/12/23 3:15:41/

35. Three.js案例-创建带阴影球体与平面

实现效果

效果

知识点

WebGLRenderer_8">WebGLRenderer

WebGLRendererThree.js中用于渲染场景的主要类之一,它负责将场景中的对象渲染到画布上。

构造器

new THREE.WebGLRenderer(parameters : Object)

参数类型描述
parametersObject可选参数对象,包含多个属性,如 antialias(抗锯齿)、alpha(透明背景)等。
方法
  • setPixelRatio(value : Number): 设置设备像素比。
  • setSize(width : Number, height : Number): 设置渲染器的尺寸。
  • setClearColor(color : Color, alpha : Number): 设置渲染器的背景颜色。
  • render(scene : Scene, camera : Camera): 渲染场景。

Scene

SceneThree.js中的场景类,用于存储和管理所有可见的对象。

构造器

new THREE.Scene()

PerspectiveCamera

PerspectiveCameraThree.js中的透视相机类,用于模拟人眼的透视效果。

构造器

new THREE.PerspectiveCamera(fov : Number, aspect : Number, near : Number, far : Number)

参数类型描述
fovNumber视野角度(以度为单位)。
aspectNumber相机的宽高比。
nearNumber近裁剪面距离。
farNumber远裁剪面距离。
方法
  • position.set(x : Number, y : Number, z : Number): 设置相机的位置。
  • lookAt(vector : Vector3): 设置相机的朝向。

DirectionalLight

DirectionalLightThree.js中的方向光类,用于模拟太阳光或其他平行光源。

构造器

new THREE.DirectionalLight(color : Color, intensity : Number)

参数类型描述
colorColor光源的颜色。
intensityNumber光源的强度。
方法
  • castShadow = true: 启用阴影投射。
  • position.set(x : Number, y : Number, z : Number): 设置光源的位置。

SphereBufferGeometry

SphereBufferGeometryThree.js中的球体几何体类,用于创建球体

构造器

new THREE.SphereBufferGeometry(radius : Number, widthSegments : Number, heightSegments : Number)

参数类型描述
radiusNumber球体的半径。
widthSegmentsNumber经度方向上的分段数。
heightSegmentsNumber纬度方向上的分段数。

Mesh

MeshThree.js中的网格类,用于组合几何体和材质。

构造器

new THREE.Mesh(geometry : Geometry, material : Material)

参数类型描述
geometryGeometry几何体对象。
materialMaterial材质对象。
方法
  • position.set(x : Number, y : Number, z : Number): 设置网格的位置。
  • castShadow = true: 启用阴影投射。
  • receiveShadow = true: 启用阴影接收。

PlaneGeometry

PlaneGeometryThree.js中的平面几何体类,用于创建平面。

构造器

new THREE.PlaneGeometry(width : Number, height : Number, widthSegments : Number, heightSegments : Number)

参数类型描述
widthNumber平面的宽度。
heightNumber平面的高度。
widthSegmentsNumber宽度方向上的分段数。
heightSegmentsNumber高度方向上的分段数。
方法
  • rotateX(angle : Number): 绕X轴旋转。
  • rotateZ(angle : Number): 绕Z轴旋转。
  • position.set(x : Number, y : Number, z : Number): 设置平面的位置。
  • receiveShadow = true: 启用阴影接收。

代码

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><script src="ThreeJS/three.js"></script><script src="ThreeJS/jquery.js"></script>
</head>
<body>
<div id="myContainer"></div>
<script>// 创建渲染器var myRenderer = new THREE.WebGLRenderer();myRenderer.setPixelRatio(window.devicePixelRatio);myRenderer.setSize(480, 320);myRenderer.setClearColor('white', 1);myRenderer.shadowMap.enabled = true;$("#myContainer").append(myRenderer.domElement);// 创建场景var myScene = new THREE.Scene();// 创建相机var myCamera = new THREE.PerspectiveCamera(45, 480 / 320, 0.1, 1000);myCamera.position.set(4, 4, 2);myCamera.position.multiplyScalar(2);myCamera.lookAt(new THREE.Vector3(0, 0, 0));// 创建第一束方向光var myDirectionalLight1 = new THREE.DirectionalLight('white', 1);myDirectionalLight1.castShadow = true;myDirectionalLight1.position.set(-4, 10, 8);myScene.add(myDirectionalLight1);// 创建第二束方向光var myDirectionalLight2 = new THREE.DirectionalLight('white', 0.5);myDirectionalLight2.castShadow = true;myDirectionalLight2.position.set(4, 12, 12);myScene.add(myDirectionalLight2);// 创建用于投射阴影球体var mySphereGeometry = new THREE.SphereBufferGeometry(2, 36, 36);var mySphereMaterial = new THREE.MeshNormalMaterial({wireframe: true, transparent: true});var mySphereMesh = new THREE.Mesh(mySphereGeometry, mySphereMaterial);mySphereMesh.position.set(0, 2.5, 0);mySphereMesh.castShadow = true;myScene.add(mySphereMesh);// 创建投射(白色不可见)平面var myPlaneGeometry = new THREE.PlaneGeometry(120, 120, 1, 1);var myPlaneMaterial = new THREE.MeshStandardMaterial({color: 'white'});var myPlaneMesh = new THREE.Mesh(myPlaneGeometry, myPlaneMaterial);myPlaneMesh.rotateX(-Math.PI / 2);myPlaneMesh.rotateZ(-Math.PI / 7);myPlaneMesh.position.set(0, -4.5, 0);myPlaneMesh.receiveShadow = true;myScene.add(myPlaneMesh);// 渲染球体阴影myRenderer.render(myScene, myCamera);
</script>
</body>
</html>

演示链接

示例链接


http://www.ppmy.cn/server/152390.html

相关文章

STM32, GD32 cubemx CAN 低速率125kbps 报文丢失,解决了

用STM32 CUBEMX生成的GD32的 can程序&#xff0c;在500K波特率时可以正常使用&#xff0c;没有发现丢包&#xff0c;但速率降到250k和125k时&#xff0c;发送138帧数据&#xff0c;会丢失5个包。&#xff08;系统时钟168M&#xff0c;APB1的时钟42M&#xff09; 试了各种方法无…

华为DHCP高级配置学习笔记

1.基于接口的DHCP配置 1.1配置R1 sys sysname R1 undo info-center enable dhcp enable 全局下开启DHCP功能 interface Ethernet0/0/0 ip address 192.168.1.1 255.255.255.0 dhcp select interface 在e0/0/0接口上启用基于接口的 DHCP服务 dhcp server dns-list 114.11…

基于Python Scrapy的豆瓣Top250电影爬虫程序

Scrapy安装 Python实现一个简单的爬虫程序&#xff08;爬取图片&#xff09;_python简单扒图脚本-CSDN博客 创建爬虫项目 创建爬虫项目&#xff1a; scrapy startproject test_spider 创建爬虫程序文件&#xff1a; >cd test_spider\test_spider\spiders >scrapy g…

【守护进程 】【序列化与反序列化】

目录 1. 前后台任务2. 守护进程3. TCP的其它概念4. 序列化与反序列化 1. 前后台任务 我们之前在 信号&#xff08;一&#xff09;【概念篇】 介绍过 Crtl c 的本质就是给前台进程发送一个信号&#xff0c;进程执行该信号的默认处理动作&#xff0c;进而终止进程&#xff0c;随…

文献研读|基于像素语义层面图像重建的AI生成图像检测

前言&#xff1a;本篇文章主要对基于重建的AI生成图像检测的四篇相关工作进行介绍&#xff0c;分别为基于像素层面重建的检测方法 DIRE 和 Aeroblade&#xff0c;以及基于语义层面重建的检测方法 SimGIR 和 Zerofake&#xff1b;并对相应方法进行比较。 相关文章&#xff1a;论…

重生之我在异世界学编程之算法与数据结构:深入静态顺序表篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、顺序表的概念及结构1. 顺序表…

ELK部署

背景 很多公司还是在单体项目中苦苦挣扎&#xff0c;没有必要上elk系统&#xff0c;大家都懂的一个原则系统的技术栈越多系统越复杂&#xff0c;维护起来也越麻烦&#xff0c;在没有大流量高并发的情况下我们就用单体服务挺舒服。我们行业的特殊性做的都是BTB的项目&#xff0…

Bootstrap Blazor中使用PuppeteerSharp对HTML截图

PuppeteerSharp是一个基于.NET的库&#xff0c;提供了对Puppeteer的C#支持&#xff0c;用于自动化&#xff0c;可用于测试、截图、爬虫等任务。 官网&#xff1a;Puppeteer Sharp&#xff08;感觉文章中有些代码段没有更新&#xff0c;直接用会有报错&#xff09;。 本篇文章…