马黑黑 发表于 2025-6-26 13:07

中国史诗

<style>
    #tz {margin: 30px 0; left: calc(50% - 81px); transform: translateX(-50%);width: clamp(600px, 90vw, 1400px); height: auto; aspect-ratio: 16/9; background: url('https://638183.freep.cn/638183/t24/w4/jg.webp') no-repeat center/cover; box-shadow: 2px 2px 8px #000; display: grid; place-items: center; z-index: 1; position: relative; }
    #btnFs { bottom: 30px; color: #eee; }
    #player { position: absolute; left: -1000px; }
    #vid {position: absolute; width: 100%; height: 100%; object-fit: cover; mask: radial-gradient(transparent 20%, red); -webkit-mask: radial-gradient(transparent 20%, red); pointer-events: none; }
</style>

<div id="tz">
    <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1313052443" autoplay loop></audio>
    <video id="vid" src="https://bpic.588ku.com/video_listen/588ku_video/22/11/03/14/51/00/video636364d43e50d.mp4" autoplay loop muted></video>
    <div id="player"></div>
</div>

<script type="module">
    import { THREE, scene, camera, renderer, clock, basic3, click3 } from 'https://638183.freep.cn/638183/3dev/3/3basic.js';
    import { FS } from 'https://638183.freep.cn/638183/web/ku/FS.js';
    basic3(tz);

    const sphereGeometry = new THREE.SphereGeometry();
    const pointsMaterial = new THREE.PointsMaterial({ size: 0.05, color: 0x90ee90 });
    const points = new THREE.Points(sphereGeometry, pointsMaterial);
    points.rotateX(Math.PI / 5);
    scene.add(points);

    let angle = 0;
    const animate = () => {
      const delta = clock.getDelta();
      angle += delta * 10;
      const scale = 1.6 - Math.sin(angle * Math.PI / 180);
      points.scale.set(scale, scale / 1.5, scale);
      points.rotation.y += delta;
      renderer.render(scene, camera);
      requestAnimationFrame(animate);
    };

    tz.onclick = (e) => { if (click3(points, e)) player.click() };

    tz.onmousemove = (e) => {
      tz.title = click3(points, e) ? '播放/暂停(Alt+X)' : '';
      tz.style.cursor = click3(points, e) ? 'pointer' : 'default';
    };

    aud.onplaying = aud.onpause = () => aud.paused ? clock.stop() : clock.start();

    animate();
    FS(tz, player);
</script>

马黑黑 发表于 2025-6-26 13:07

帖子代码

<style>
    #tz {margin: 30px 0; left: calc(50% - 81px); transform: translateX(-50%);width: clamp(600px, 90vw, 1400px); height: auto; aspect-ratio: 16/9; background: url('https://638183.freep.cn/638183/t24/w4/jg.webp') no-repeat center/cover; box-shadow: 2px 2px 8px #000; display: grid; place-items: center; z-index: 1; position: relative; }
    #btnFs { bottom: 30px; color: #eee; }
    #player { position: absolute; left: -1000px; }
    #vid {position: absolute; width: 100%; height: 100%; object-fit: cover; mask: radial-gradient(transparent 20%, red); -webkit-mask: radial-gradient(transparent 20%, red); pointer-events: none; }
</style>

<div id="tz">
    <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1313052443" autoplay loop></audio>
    <video id="vid" src="https://bpic.588ku.com/video_listen/588ku_video/22/11/03/14/51/00/video636364d43e50d.mp4" autoplay loop muted></video>
    <div id="player"></div>
</div>

<script type="module">
    import { THREE, scene, camera, renderer, clock, basic3, click3 } from 'https://638183.freep.cn/638183/3dev/3/3basic.js';
    import { FS } from 'https://638183.freep.cn/638183/web/ku/FS.js';
    basic3(tz);

    const sphereGeometry = new THREE.SphereGeometry();
    const pointsMaterial = new THREE.PointsMaterial({ size: 0.05, color: 0x90ee90 });
    const points = new THREE.Points(sphereGeometry, pointsMaterial);
    points.rotateX(Math.PI / 5);
    scene.add(points);

    let angle = 0;
    const animate = () => {
      const delta = clock.getDelta();
      angle += delta * 10;
      const scale = 1.6 - Math.sin(angle * Math.PI / 180);
      points.scale.set(scale, scale / 1.5, scale);
      points.rotation.y += delta;
      renderer.render(scene, camera);
      requestAnimationFrame(animate);
    };

    tz.onclick = (e) => { if (click3(points, e)) player.click() };

    tz.onmousemove = (e) => {
      tz.title = click3(points, e) ? '播放/暂停(Alt+X)' : '';
      tz.style.cursor = click3(points, e) ? 'pointer' : 'default';
    };

    aud.onplaying = aud.onpause = () => aud.paused ? clock.stop() : clock.start();

    animate();
    FS(tz, player);
</script>

马黑黑 发表于 2025-6-26 13:19

ThreeJS特效解释:

圆球几何体(THREE.SphereGeometry)+ 点材质(THREE.PointsMaterial)构造出点对象(THREE.Points),最终圆就是有矩形形状的点构建而成。

点对象本质上类似于 THREE.Mesh 网格对象,但是它是一个点的集合,帖子中,这个点集合由点材质+球体几何体构筑而成。

动画部分:points 点对象在y轴旋转,并分别在xyz轴上以指定歩幅来回缩放(scale)。缩放所需数据使用三角函数正弦(Math.sin)计算歩幅值,震荡范围通过式子的设计指定:

1.6 - Math.sin(angle * Math.PI / 180);

1.6 是控制震荡范围的主要依托,其后面的式子的值将在 [-1, 1] 之间。

梦江南 发表于 2025-6-26 13:53

背景色彩漂亮,与球体色彩很般配。球体变化太精彩了!{:4_187:}

红影 发表于 2025-6-26 14:28

“分别在xyz轴上以指定歩幅来回缩放(scale)”

刚开始看到时,还以为是沿着z轴移动造成的大小变化呢。
看那计算方程,缩放是在0.6到2.6之间呗。原来点的缩放能造成球体大小的变化。

红影 发表于 2025-6-26 14:29

这背景和视频以及球体的变化,都很主题很相符{:4_187:}

马黑黑 发表于 2025-6-26 18:01

红影 发表于 2025-6-26 14:29
这背景和视频以及球体的变化,都很主题很相符

谢赞

马黑黑 发表于 2025-6-26 18:02

红影 发表于 2025-6-26 14:28
“分别在xyz轴上以指定歩幅来回缩放(scale)”

刚开始看到时,还以为是沿着z轴移动造成的大小变化呢。
...

不是点的缩放,实际上是球体的缩放,只不过呢,球体以点集合的形态展现出来

马黑黑 发表于 2025-6-26 18:02

梦江南 发表于 2025-6-26 13:53
背景色彩漂亮,与球体色彩很般配。球体变化太精彩了!

变大变小(变远变近)的效果而已

红影 发表于 2025-6-26 20:00

马黑黑 发表于 2025-6-26 18:01
谢赞

这变化很奇妙{:4_187:}

红影 发表于 2025-6-26 20:00

马黑黑 发表于 2025-6-26 18:02
不是点的缩放,实际上是球体的缩放,只不过呢,球体以点集合的形态展现出来

所以作用于点的实际是作用于球体的呗{:4_173:}

杨帆 发表于 2025-6-26 21:21

本帖最后由 杨帆 于 2025-6-26 21:41 编辑

谢谢马老师经典的讲解、到位的示范与精彩的分享

奇妙的构思,神妙的实现,美妙的特效

堪称中国音画帖制作引领发展的践行者、示范者、领航者{:4_176:}

马黑黑 发表于 2025-6-27 13:29

杨帆 发表于 2025-6-26 21:21
谢谢马老师经典的讲解、到位的示范与精彩的分享

奇妙的构思,神妙的实现,美妙的特效


帽子太高了!俺又不是大厨{:4_170:}

马黑黑 发表于 2025-6-27 13:36

红影 发表于 2025-6-26 20:00
所以作用于点的实际是作用于球体的呗

不是,是作用于球体,点是球体的皮肤特征而已

马黑黑 发表于 2025-6-27 13:36

红影 发表于 2025-6-26 20:00
这变化很奇妙

还行

红影 发表于 2025-6-27 20:57

马黑黑 发表于 2025-6-27 13:36
不是,是作用于球体,点是球体的皮肤特征而已

嗯嗯,这样说才是和效果的显示相符呢{:4_187:}

红影 发表于 2025-6-27 20:58

马黑黑 发表于 2025-6-27 13:36
还行

这样的变大变小真的有远近变化的感觉呢。

马黑黑 发表于 2025-6-27 21:12

红影 发表于 2025-6-27 20:58
这样的变大变小真的有远近变化的感觉呢。

是的

马黑黑 发表于 2025-6-27 21:12

红影 发表于 2025-6-27 20:57
嗯嗯,这样说才是和效果的显示相符呢

对对

红影 发表于 2025-6-27 22:11

马黑黑 发表于 2025-6-27 21:12
是的

这样的变化还挺好看的。
页: [1] 2 3 4 5 6
查看完整版本: 中国史诗