科幻风的卡片视频播放

news/2024/7/19 14:11:41 标签: html, 3D, 前端, JS

上一篇博文展示了卡片中的VR展示,那篇主要是卡片的3D转动来展示未显示的部分图片。这篇,我们来点科幻的。

我们在卡片中播放视频的同时来拖动卡片或转动它。像下面那样:
在这里插入图片描述
这个主要依赖了两个库,具体代码如下:

html"><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
     <!--  3D场景库引入-->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/0.148.0/three.min.js"></script>
    <!--动画效果库引入-->
    <script src="https://unpkg.co/gsap@3/dist/gsap.min.js"></script>
    <style>
    body {
      margin: 0;
      overflow: hidden;
      background: #1e2024;
    }

    button {
      width: 100px;
      height: 100px;
      border-radius: 50%;
      background-color: #95a8a6;
      border: 5px solid #0f1515;
      position: absolute;
      left: 50%;
      top: 50%;
      cursor: pointer;
      transform: translate(-50%, -50%) scale(1);
      transition: transform 0.35s ease;
      transform-origin: 50% 50%;
    }
    button:before {
      position: absolute;
      content: "";
      width: 0px;
      height: 0px;
      border-top: 20px solid transparent;
      border-bottom: 20px solid transparent;
      border-left: 30px solid #0f1515;
      left: 50%;
      top: 50%;
      transform: translate(-30%, -50%);
    }
    button:hover {
      transform: translate(-50%, -50%) scale(1.1);
    }

    .lady {
      position: absolute;
      margin: auto;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      width: 525px;
      opacity: 0.4;
    }

    canvas {
      opacity: 0;
    }
  </style>
</head>
<body>
<!--首先图片是要有的,这个是视频中截取的开头图片你也可以换成别的,博文中我没有上传这个-->
<img class="lady" src="img.png" >
</body>
<script>
  //创建一个Three.js场景对象,并设置了背景颜色为黑色。
  var scene = new THREE.Scene();
  scene.background = new THREE.Color( 0x1e2024);
  //创建一个透视摄像机对象
  var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  //创建一个Three.js渲染器对象
  var renderer = new THREE.WebGLRenderer();
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);
  //创建了一个平面几何体对象
  var planeGeometry = new THREE.PlaneGeometry(9.45, 6.3);
  //创建一个视频元素
  var video = document.createElement('video');
  var videoTexture = new THREE.VideoTexture(video);
  //视频在这里
  video.src ="http://vjs.zencdn.net/v/oceans.mp4";
  video.crossOrigin = "anonymous";
  video.muted = 'muted';
  video.preload = "auto";
  //搞一个着色器材质,从video创建一个视频纹理
  var material = new THREE.ShaderMaterial({
    uniforms: {
      u_lightPos: {value: new THREE.Vector3(0, 0, 10)},
      u_texture: {value: videoTexture}
    },
    vertexShader: `
        varying vec3
        v_normal;
        varying vec3 v_position;
        varying vec2 v_uv;

        void main() {
            v_normal = normalMatrix * normal;
            v_position = vec3(modelMatrix * vec4(position, 1.0));
            v_uv = uv;
            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
    `,
    fragmentShader: `
        uniform sampler2D u_texture;
        varying vec2 v_uv;
        varying vec3 v_normal;
        varying vec3 v_position;
        uniform vec3 u_lightPos;

        void main() {
            vec3 normal = normalize(v_normal);
            vec3 lightDir = normalize(u_lightPos - v_position);
            float diffuse = max(dot(lightDir, normal), 0.0);
            gl_FragColor = texture2D(u_texture, v_uv) * diffuse;
        }
    `
  });

  var plane = new THREE.Mesh(planeGeometry, material);
  scene.add(plane);
  var pointLight = new THREE.PointLight(0xff0000, 1, 100);
  pointLight.position.set(0, 0, 60);
  scene.add(pointLight);

  camera.position.z = 7;

  var playButton = document.createElement("button");
  document.body.appendChild(playButton);

  var tl = new gsap.timeline();
  function playVideo(){
    video.play();
    if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {
      video.muted = 'muted';
    } else {
      video.muted = false;
    }
  }

  //搞一个按钮
  playButton.addEventListener("click", function() {
    tl.set('body',{background:'transparent'});
    tl.to('button',1,{opacity:0});
    tl.to('.lady',1,{opacity:0},"-0.5");
    tl.to('canvas',1,{opacity:1},"-0.5");
    tl.call(playVideo);
  });


  video.addEventListener("ended", function() {
    video.currentTime = 0;
    video.pause();
    video.muted = 'muted';
    tl.set('body',{background:'#1e2024'});
    tl.to('canvas',1,{opacity:0});
    tl.to('.lady',1,{opacity:1},"-0.5");
    tl.to('button',1,{opacity:1});
  });

  //添加一个监听事件
  document.addEventListener("mousemove", onMouseMove);

  //鼠标事件
  function onMouseMove(event) {
    var x = (event.clientX / window.innerWidth) * 2 - 1;
    var y = -(event.clientY / window.innerHeight) * 2 + 1;

    plane.position.x = x;
    plane.position.y = y;
    plane.position.z = x * y;
    plane.rotation.x = x * 0.2;
    plane.rotation.y = y * 0.2;
  }

  window.onresize = function() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize( window.innerWidth, window.innerHeight );
  }

  //场景渲染
  function render() {
    requestAnimationFrame(render);
    renderer.render(scene, camera);
  }
  render();
</script>
</html>

http://www.niftyadmin.cn/n/334667.html

相关文章

提问超时~Zabbix Meetup成都站棒在哪里?

图片 2023年5月13日&#xff0c;迎着初夏灿烂的阳光&#xff0c;Zabbix Meetup首次在成都举办。本次活动吸引了来自Zabbix社区用户、合作伙伴等约50余位伙伴热情参与&#xff0c;倾听来自原厂培训师、社区资深用户们关于Zabbix的精彩内容分享。还有定制周边礼品和晚宴深入交流…

Mybatis是什么?Mybatis中动态sql常用标签有哪些?

Mybatis是什么&#xff1f; Mybatis是一种开源的Java持久层框架&#xff0c;它可以将SQL语句和Java代码进行分离&#xff0c;使得开发人员可以更加专注于业务逻辑的实现。与Hibernate等ORM框架不同的是&#xff0c;Mybatis使用XML或注解的方式来描述SQL语句&#xff0c;这种方式…

Kali-linux使用假冒令牌

使用假冒令牌可以假冒一个网络中的另一个用户进行各种操作&#xff0c;如提升用户权限、创建用户和组等。令牌包括登录会话的安全信息&#xff0c;如用户身份识别、用户组和用户权限。当一个用户登录Windows系统时&#xff0c;它被给定一个访问令牌作为它认证会话的一部分。例如…

探究ChatGPT与GPT-4的缺陷不足,揭示大预言LLM模型的局限性——没有完美的工具

目录 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的1. 引言2. 事实性错误2.1 问题示例2.2 原因分析2.3 解决方法 3. 实时更新3.1 问题示例3.2 原因分析3.3 解决方法 4. 总结 参考资料其它资料下载 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的 1. 引言 2022 年末 C…

如何在THREE.JS 中编写shader

如何在THREE.JS 中编写shader 要在three.js中编写底层着色器&#xff0c;我们需要借助 THREE.ShaderMaterial来实现 const material new THREE.ShaderMaterial( {uniforms: {time: { value: 1.0 },resolution: { value: new THREE.Vector2() }},vertexShader: , // 顶点着色…

遇到系统无法访问此文件问题怎么办?

昨天我整理了一下自己喜欢的照片&#xff0c;然后将其分门别类地归纳起来&#xff0c;然后将其复制到了另一个硬盘做了一下简单的备份。后面又想到了之前在某篇文章中貌似提到过什么异地备份的说法&#xff0c;一想到自己的OneDrive中还有点空间&#xff0c;所以就想把它们存到…

开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门

► 相关链接&#xff1a; ① MobileIMSDK-Uniapp端的详细介绍② MobileIMSDK-Uniapp端的开发手册new&#xff08;* 精编PDF版&#xff09; 一、理论知识准备 您需要对Uniapp和Vue开发有所了解&#xff1a; 1&#xff09;Uniapp 官方入门教程2&#xff09;可能是最好的 unia…

国产仪器 4945B/4945C 无线电通信综合测试仪

4945系列无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器&#xff0c;基于软件无线电架构&#xff0c;集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与分析、音频示波器、自动测试等功能&#xff0c;它可完成无线通…