Three阴影指示器实例

基础环境搭建:

在这里插入图片描述

设置灯光和网格模型:

  1. 设置灯光:环境光和聚光灯
    scene.add(new THREE.AmbientLight(0x404040))

    spotLight = new THREE.SpotLight(0xffffff)
    spotLight.name = 'Spot light'
    spotLight.angle = Math.PI / 5
    spotLight.penumbra = 0.3
    spotLight.position.set(10, 10, 5)
    scene.add(spotLight)
  1. 设置环形结

.shininess : Float
.specular高亮的程度,越高的值越闪亮,默认值为 30。
.specular : Color
材质的高光颜色,默认值为0x111111(深灰色)。
这定义了材质的光泽度和光泽的颜色。

.scale ( x : Float, y : Float, z : Float ) : this
缩放几何体。该操作一般在一次处理中完成,不会循环处理。典型的用法是通过调用 Object3D.scale 实时旋转几何体。
.multiplyScalar ( s : Float ) : this
将该向量与所传入的标量s进行相乘。

    let geometry = new THREE.TorusKnotGeometry(25, 8, 75, 20)
    let material = new THREE.MeshPhongMaterial({
        color: 0xff0000,
        shininess: 150,
        specular: 0x222222
    })
    torus_knot = new THREE.Mesh(geometry, material)
    torus_knot.scale.multiplyScalar(1 / 18)
    torus_knot.position.set(0, 3, 0)
    scene.add(torus_knot)

在这里插入图片描述

  1. 与此相同设置平行光和投射面、立方体:

在这里插入图片描述

设置阴影:

  1. 初步设置:

在这里插入图片描述

  1. 可以看到环形结阴影正常,立方体因为阴影范围原因未显示阴影,这里使用cameraHelper调节阴影范围:

.shadow : xxxLightShadow
这个 xxxLightShadow 对象用来计算该平行光产生的阴影。
.camera : Camera
在光的世界里。这用于生成场景的深度图;从光的角度来看,其他物体背后的物体将处于阴影中。
默认值为PerspectiveCamera,近剪裁平面为0.5。 fov将通过更新方法跟踪拥有SpotLight的角度属性。同样,aspect属性将跟踪mapSize的方面。如果设置了灯光的距离属性,则远剪裁平面将跟踪该值,否则默认为500。
.mapSize : Vector2
一个Vector2定义阴影贴图的宽度和高度。较高的值会以计算时间为代价提供更好的阴影质量。值必须是2的幂,直到给定设备的WebGLRenderer.capabilities.maxTextureSize, 宽度和高度不必相同(例如,(512,1024)有效)。 默认值为(512,512)。

CameraHelper( camera : Camera )
camera – 被模拟的相机.
为指定相机创建一个新的相机辅助对象 CameraHelper.

    spotLight.shadow.camera.near = 8
    spotLight.shadow.camera.far = 30
    spotLight.shadow.mapSize.width = 1024
    spotLight.shadow.mapSize.height = 1024
    scene.add(new THREE.CameraHelper(spotLight.shadow.camera))

    dirLight.shadow.camera.near = 1
    dirLight.shadow.camera.far = 10
    dirLight.shadow.camera.left = -15
    dirLight.shadow.camera.right = 15
    dirLight.shadow.camera.top = 15
    dirLight.shadow.camera.bottom = -15
    scene.add(new THREE.CameraHelper(dirLight.shadow.camera))

在这里插入图片描述

在这里插入图片描述

旋转网格模型:

.getDelta () : Float
获取自 .oldTime 设置后到当前的秒数。 同时将 .oldTime 设置为当前时间。
如果 .autoStart 设置为 true 且时钟并未运行,则该方法同时启动时钟。

    let clock=new THREE.Clock()
    ...
    const delta = clock.getDelta()
    torus_knot.rotation.x += 1 * delta
    torus_knot.rotation.y += 2 * delta
    torus_knot.rotation.z += 1.5 * delta
    ...

添加阴影指示器ShadowMapViewer:

源代码中解释:

这是一个可以帮助可视化给定光的阴影图的helper。它适用于阴影投射光:平行光和聚光灯。它渲染出阴影地图,并显示在HUD上。
example:
1)导入ShadowMapViewer到你的应用。
2)创建一个阴影投射光源,并可选命名:
let light = new DirectionalLight( 0xffffff, 1 );
light.castShadow = true;
light.name = ‘Sun’;
3)创建一个阴影查看器的光,并设置其大小和位置可选:
let shadowMapViewer = new ShadowMapViewer( light );
shadowMapViewer.size.set( 128, 128 ); //width, height default: 256, 256 shadowMapViewer.position.set(10, 10 ); //x, y in pixel default: 0, 0 (top left corner)
4)在渲染循环中渲染阴影地图查看器: shadowMapViewer.render( renderer );
5)可选:在窗口调整大小上更新阴影地图指示器: shadowMapViewer.updateForWindowResize();
6)如果你直接设置成员的位置或大小,你需要调用shadowMapViewer.update();

import { ShadowMapViewer } from 'three/examples/jsm/utils/ShadowMapViewer'
...
let spotLightShadowMapViewer, dirLightShadowMapViewer
...
window.addEventListener('resize', function () {
    ...
    initShadowMapViewer()
    spotLightShadowMapViewer.updateForWindowResize()
    dirLightShadowMapViewer.updateForWindowResize()
})
function initShadowMapViewer() {
    spotLightShadowMapViewer = new ShadowMapViewer(spotLight)
    dirLightShadowMapViewer = new ShadowMapViewer(dirLight)

    const size = window.innerWidth * 0.15
    spotLightShadowMapViewer.size.set(size, size)
    spotLightShadowMapViewer.position.set(10, 10)

    dirLightShadowMapViewer.size.set(size, size)
    dirLightShadowMapViewer.position.set(size + 10, 10)
}
function render(){
	...
    spotLightShadowMapViewer.render(renderer)
    dirLightShadowMapViewer.render(renderer)
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
three.js是一个强大的WebGL库,用于创建和渲染3D图形。它提供了许多功能和工具,使开发人员能够轻松创建各种复杂的3D场景和效果。 在一个机房实例中,我们可以利用three.js来模拟一个现代化的机房环境。在这个实例中,我们可以创建一个包含服务器、网络设备和监控系统的机房场景。 首先,我们可以使用three.js创建一个机房的场景,并在其中添加一些基本的元素,比如地板、墙壁和天花板。然后,我们可以使用three.js的几何体对象来创建服务器机柜和网络设备,比如交换机和路由器等。 接下来,我们可以通过使用three.js的材质和纹理来为这些元素添加逼真的外观。我们可以使用合适的纹理和光照效果来模拟金属柜体和亮灯指示灯等细节。 除此之外,我们可以添加一些动画效果来增强机房的真实感。比如,我们可以使用three.js的动画功能来模拟服务器的闪烁指示灯、风扇的旋转以及数据传输的流动等。 最后,我们可以使用three.js的控制器和交互功能来实现机房场景的探索和监控。用户可以使用鼠标或触摸来旋转、缩放和移动场景,以查看不同的角度和元素。同时,我们还可以添加一些交互式的监控图表和数据可视化效果,以展示机房的状态和性能信息。 综上所述,通过使用three.js,我们可以很容易地创建一个逼真的机房场景,并为用户提供交互和监控的功能。这样的实例可以用于展示和教育目的,同时也可以用于实际的机房管理和监控应用中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值