three打造一个聚光灯下的三维画展展厅动态效果代码

代码语言:html

所属分类:三维

代码描述:three打造一个聚光灯下的三维画展展厅动态效果代码,点击按钮可实现开灯关灯不同效果

代码标签: 聚光灯 三维 画展 展厅 动态 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开


<!DOCTYPE html>
<html lang="en" >

<head>

  <meta charset="UTF-8">
  

<link href="https://fonts.googleapis.com/css2?family=Rajdhani&display=swap" rel="stylesheet">
  
  
  
<style>
body {
    height: 100vh;
    width: 100%;
    margin: 0;
    overflow: hidden;
    background-color: #79838b;
    display: flex;
    flex-flow: column;
    position: relative;
}

.bg {
    position: relative;
    width: 100%;
    height: 100vh;
    max-height: 500px;
    background-image: url("//repo.bfw.wiki/bfwrepo/image/5f88dabb9e9a2.png");
    background-size: contain;
    background-repeat: repeat-x;
    background-position: 50% 50%;
}

.pngLights {
    position: absolute;
    z-index: 8;
    width: 100%;
    height: 100vh;
    max-height: 500px;
    background-image: url("//repo.bfw.wiki/bfwrepo/image/5f88dacb2c662.png"), url("//repo.bfw.wiki/bfwrepo/image/5f88daa17dbde.png"), url("//repo.bfw.wiki/bfwrepo/image/5f88daa17dbde.png");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: 50% -22px;
}

.pngLights.active {
    background-image: url("//repo.bfw.wiki/bfwrepo/image/5f88dacb2c662.png"), url("//repo.bfw.wiki/bfwrepo/image/5f88daa17dbde.png"), url("");
}

.cc {
    width: 100%;
    height: 100vh;
    position: absolute;
    top: 0;
    left: 0;
}

#canvas_container1 {
    max-height: 500px;
    z-index: 1;
}

#canvas_container2 {
    height: 100vh;
    z-index: 2;
}

.floor {
    flex: 1 1 auto;
    background-image: url("//repo.bfw.wiki/bfwrepo/image/5f88da81bd562.png");
    background-size: cover;
    background-repeat: no-repeat;
    background-position: 50% 0%;
}


/****   Buttons   *****/
.buttons {
    position: absolute;
    width: 100%;
    height: 100vh;
    max-height: 500px;
}

.btn {
    position: absolute;
    bottom: 5%;
    z-index: 10;
    border: 1px solid white;
    border-radius: 5px;
    padding: 3px 15px;
    background-color: #1f1f1f;
    color: #fdfcfc;
    -webkit-font-smoothing: antialiased;
    font-size: 18px;
    font-family: 'Rajdhani', sans-serif;
    letter-spacing: 1px;
    cursor: pointer;
    user-select: none;
    box-shadow: 5px 3px 12px 0px rgba(0, 0, 0, 0.75);
    transition: color .3s;
}

.btn_Works {
    left: 5%;
    text-decoration: none;
}

.btn_Light {
    left: 50%;
    transform: translateX(-50%);
    transform-origin: 25% 50%;
    color: #feaeae;
}

.btn_Works:hover {
    background-color: #3d3d3d;
    color: #6286f4;
}

.btn_Light:hover {
    background-color: #3d3d3d;
    color: #da1616;
}

.btn_Light.blink {
    animation: blinkAni 500ms;
}

@keyframes blinkAni {
    0% {
        background: #f5f6e4;
        transform: scale(1) translateX(-50%);
    }
    50% {
        transform: scale(1.2) translateX(-50%);
    }
    100% {
        transform: scale(1) translateX(-50%);
    }
}

@media only screen and (max-height: 350px) {
    .btn {
        font-size: 4.5vh;
        bottom: 2%;
        box-shadow: none;
        color: #fdfcfc;
    }
}
</style>


</head>

<body translate="no" >
  <div class="cc" id="canvas_container1"></div> 
<div class="cc" id="canvas_container2"></div> 

<div class="pngLights"></div> 
<div class="bg"></div>  

<div class="buttons">   
    <div class="btn btn_Light">Light OFF</div>

</div>

<div class="floor"></div>
    
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.121.js"></script>
  
      <script >
let camera,
renderer1,
scene,
uniformsBlob,
uniformsPano,
container1 = document.getElementById("canvas_container1"),
bg = document.querySelector(".bg"),
floor = document.querySelector(".floor"),
btn_Light = document.querySelector(".btn_Light"),
timeout_Debounce,
lightOFF = true,
renderer2,
camera2,
scene2,
sprites = new THREE.Group(),
container2 = document.getElementById("canvas_container2"),
mouse = { x: 1 };


init();
animate();


function init() {
  renderer1 = new THREE.WebGLRenderer({ antialias: true, alpha: true });
  renderer1.setSize(container1.clientWidth, container1.clientHeight);
  renderer1.setPixelRatio(window.devicePixelRatio);
  container1.appendChild(renderer1.domElement);

  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera(75, container1.clientWidth / container1.clientHeight, 0.1, 1000);
  camera.position.set(0, 0, 40);

  const light1 = new THREE.DirectionalLight("#ffffff", 0.7);
  light1.position.set(-10, 30, 20);
  scene.add(light1);

  const light2 = new THREE.DirectionalLight("#ffffff", 0.7);
  light2.position.set(10, 30, 20);
  scene.add(light2);

  const light3 = new THREE.DirectionalLight("#fcfcfc", 0.3);
  light3.position.set(0, -20, 10);
  scene.add(light3);

  const textureLoader = new THREE.TextureLoader();
  const blobTexture = textureLoader.load("//repo.bfw.wiki/bfwrepo/image/5f88dbb5ecffc.png");
  const panoTexture = textureLoader.load("//repo.bfw.wiki/bfwrepo/image/5f88dbeb95c03.png");



  /***   Blob   ***/
  let blobGeometry = new THREE.IcosahedronBufferGeometry(10, 50);

  uniformsBlob = THREE.UniformsUtils.merge([uniformsBlob, THREE.UniformsLib["lights"]]);
  Object.assign(uniformsBlob, {
    t_texture: { type: "t", value: blobTexture },
    u_time: { type: "f", value: 0.0 },
    u_mouse1: { type: "v2", value: new THREE.Vector2(1, 1) },
    u_mouse2: { type: "v2", value: new THREE.Vector2(20, 20) },
    u_lightOFF: { type: "b", value: lightOFF },
    u_effect_Switch: { type: "f", value: 0.0 },
    u_textura_Zoom: { type: "f", value: 1.0 } });


  uniformsBlob.t_texture.value.anisotropy = 16;
  uniformsBlob.t_texture.value.wrapS = THREE.MirroredRepeatWrapping;
  uniformsBlob.t_texture.value.wrapT = THREE.ClampToEdgeWrapping;

  let shaderMaterialBlob = new THREE.ShaderMaterial({
    uniforms: uniformsBlob,
    fragmentShader: blobFragmentShader(),
    vertexShader: blobVertexShader(),
    lights: true });

  blob = new THREE.Mesh(blobGeometry, shaderMaterialBlob);
  blob.position.set(2, -2.2, 10);
  scene.add(blob);



  /***     Pano     ****/
  let panoGeometry = new THREE.PlaneBufferGeometry(54.5, 27.3);

  uniformsPano = {
    t_texture: { type: "t", value: panoTexture },
    u_resolution: { type: "v2", value: new THREE.Vector2() },
    u_time: { type: 'f', value: 0 },
    u_mouse: { type: "v2", value: new THREE.Vector2() },
    u_lightOFF: { type: "b", value: lightOFF },
    u_randomColor: { type: "v3", value: new THREE.Vector3(0.2, 0.2, 0.2) },
    u_panoScale: { type: "v2", value: new THREE.Vector2(10.1, 0.2) } };


  uniformsPano.u_resolution.value.x = renderer1.domElement.width;
  uniformsPano.u_resolution.value.y = renderer1.domElement.height;

  uniformsPano.t_texture.value.wrapS = THREE.ClampToEdgeWrapping;
  uniformsPano.t_texture.value.wrapT = THREE.ClampToEdgeWrapping;

  let shaderMaterialPano = new THREE.ShaderMaterial({
    uniforms: uniformsPano,
    fragmentShader: panoFragmentShader(),
    vertexShader: panoVertexShader() });

  pano = new THREE.Mesh(panoGeomet.........完整代码请登录后点击上方下载按钮下载查看

网友评论0