35. Three.js案例-创建带阴影的球体与平面
实现效果
知识点
WebGLRenderer
WebGLRenderer
是Three.js中用于渲染场景的主要类之一,它负责将场景中的对象渲染到画布上。
构造器
new THREE.WebGLRenderer(parameters : Object)
参数 | 类型 | 描述 |
---|---|---|
parameters | Object | 可选参数对象,包含多个属性,如 antialias (抗锯齿)、alpha (透明背景)等。 |
方法
setPixelRatio(value : Number)
: 设置设备像素比。setSize(width : Number, height : Number)
: 设置渲染器的尺寸。setClearColor(color : Color, alpha : Number)
: 设置渲染器的背景颜色。render(scene : Scene, camera : Camera)
: 渲染场景。
Scene
Scene
是Three.js中的场景类,用于存储和管理所有可见的对象。
构造器
new THREE.Scene()
PerspectiveCamera
PerspectiveCamera
是Three.js中的透视相机类,用于模拟人眼的透视效果。
构造器
new THREE.PerspectiveCamera(fov : Number, aspect : Number, near : Number, far : Number)
参数 | 类型 | 描述 |
---|---|---|
fov | Number | 视野角度(以度为单位)。 |
aspect | Number | 相机的宽高比。 |
near | Number | 近裁剪面距离。 |
far | Number | 远裁剪面距离。 |
方法
position.set(x : Number, y : Number, z : Number)
: 设置相机的位置。lookAt(vector : Vector3)
: 设置相机的朝向。
DirectionalLight
DirectionalLight
是Three.js中的方向光类,用于模拟太阳光或其他平行光源。
构造器
new THREE.DirectionalLight(color : Color, intensity : Number)
参数 | 类型 | 描述 |
---|---|---|
color | Color | 光源的颜色。 |
intensity | Number | 光源的强度。 |
方法
castShadow = true
: 启用阴影投射。position.set(x : Number, y : Number, z : Number)
: 设置光源的位置。
SphereBufferGeometry
SphereBufferGeometry
是Three.js中的球体几何体类,用于创建球体。
构造器
new THREE.SphereBufferGeometry(radius : Number, widthSegments : Number, heightSegments : Number)
参数 | 类型 | 描述 |
---|---|---|
radius | Number | 球体的半径。 |
widthSegments | Number | 经度方向上的分段数。 |
heightSegments | Number | 纬度方向上的分段数。 |
Mesh
Mesh
是Three.js中的网格类,用于组合几何体和材质。
构造器
new THREE.Mesh(geometry : Geometry, material : Material)
参数 | 类型 | 描述 |
---|---|---|
geometry | Geometry | 几何体对象。 |
material | Material | 材质对象。 |
方法
position.set(x : Number, y : Number, z : Number)
: 设置网格的位置。castShadow = true
: 启用阴影投射。receiveShadow = true
: 启用阴影接收。
PlaneGeometry
PlaneGeometry
是Three.js中的平面几何体类,用于创建平面。
构造器
new THREE.PlaneGeometry(width : Number, height : Number, widthSegments : Number, heightSegments : Number)
参数 | 类型 | 描述 |
---|---|---|
width | Number | 平面的宽度。 |
height | Number | 平面的高度。 |
widthSegments | Number | 宽度方向上的分段数。 |
heightSegments | Number | 高度方向上的分段数。 |
方法
rotateX(angle : Number)
: 绕X轴旋转。rotateZ(angle : Number)
: 绕Z轴旋转。position.set(x : Number, y : Number, z : Number)
: 设置平面的位置。receiveShadow = true
: 启用阴影接收。
代码
html
<!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>