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

devtools/2024/12/22 13:54:51/

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/devtools/144391.html

相关文章

CPU性能优化-磁盘空间和解析时间

即使考虑了跟踪文件的压缩格式&#xff0c;编码后的数据仍然会占用很大的磁盘空间。通常&#xff0c;每条指令不超过1字节&#xff0c;但是考虑到CPU执行指令的速度&#xff0c;数据仍然非常多。根据负载&#xff0c;CPU编码以100MB/s的速度处理PT跟踪文件的情况是很常见的&…

怎么给视频加上背景音乐和文字?适合新手

在当今的视频创作领域&#xff0c;给视频添加背景音乐和文字能够极大地提升视频的吸引力与表现力。下面就为大家详细介绍如何借助便捷的剪辑工具&#xff0c;完成视频的背景音乐与文字添加工作。 工具&#xff1a;影忆 1.前期筹备要点 1.1背景音乐的筛选 背景音乐与视频主题及情…

机器学习经典算法(scikit-learn)

安装库&#xff1a;pip install scikit-learn numpy 线性回归 (Linear Regression) import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.datasets impor…

CLION中运行远程的GUI程序

在CLION中运行远程GUI程序&#xff0c;很有可能会遇到下面错误 Gtk-WARNING **: cannot open display: 这是因为远程的GUI程序不能再本地机器上显示。这个问题一般有两种解决方法 通过SSH的ForwardX11的方法&#xff0c;就是将远程的GUI程序显示到本地机器上&#xff0c;一般在…

前端配置跨域的详细指南

在现代Web开发中&#xff0c;跨域资源共享&#xff08;CORS, Cross-Origin Resource Sharing&#xff09;是一个非常重要的概念。浏览器出于安全考虑&#xff0c;默认情况下不允许跨域请求。如果你需要在前端与不同源的服务器进行通信&#xff0c;就必须配置跨域支持。本文将介…

redis 在 win10中的使用

执行以下命令安装redis服务 redis-server.exe --service-install redis.windows.conf --loglevel verbose

HTMLCSS:酷炫的3D开关控件

这段代码创建了一个具有 3D 效果的开关控件&#xff0c;当用户点击滑块时&#xff0c;滑块会移动到开关的另一侧&#xff0c;同时改变背景颜色&#xff0c;模拟开关的开启和关闭状态。动画效果增加了页面的互动性和视觉吸引力。 演示效果 HTML&CSS <!DOCTYPE html>…

html中实用标签dl dt dd(有些小众的标签 但是很好用)

背景描述 html <dl> <dt> <dd>是一组合标签&#xff0c;他们与ol li、ul li标签很相似 但是他却是没有默认前缀并且有缩进的标签 使用方式与table表格的标签一致 使用方式 dt和dd是放于dl标签内&#xff0c;dt与dd处于dl下相同级。就是dt不能放入dd内&am…