中国史诗
<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> 帖子代码
<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>
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] 之间。 背景色彩漂亮,与球体色彩很般配。球体变化太精彩了!{:4_187:} “分别在xyz轴上以指定歩幅来回缩放(scale)”
刚开始看到时,还以为是沿着z轴移动造成的大小变化呢。
看那计算方程,缩放是在0.6到2.6之间呗。原来点的缩放能造成球体大小的变化。 这背景和视频以及球体的变化,都很主题很相符{:4_187:} 红影 发表于 2025-6-26 14:29
这背景和视频以及球体的变化,都很主题很相符
谢赞 红影 发表于 2025-6-26 14:28
“分别在xyz轴上以指定歩幅来回缩放(scale)”
刚开始看到时,还以为是沿着z轴移动造成的大小变化呢。
...
不是点的缩放,实际上是球体的缩放,只不过呢,球体以点集合的形态展现出来 梦江南 发表于 2025-6-26 13:53
背景色彩漂亮,与球体色彩很般配。球体变化太精彩了!
变大变小(变远变近)的效果而已 马黑黑 发表于 2025-6-26 18:01
谢赞
这变化很奇妙{:4_187:} 马黑黑 发表于 2025-6-26 18:02
不是点的缩放,实际上是球体的缩放,只不过呢,球体以点集合的形态展现出来
所以作用于点的实际是作用于球体的呗{:4_173:} 本帖最后由 杨帆 于 2025-6-26 21:41 编辑
谢谢马老师经典的讲解、到位的示范与精彩的分享
奇妙的构思,神妙的实现,美妙的特效
堪称中国音画帖制作引领发展的践行者、示范者、领航者{:4_176:} 杨帆 发表于 2025-6-26 21:21
谢谢马老师经典的讲解、到位的示范与精彩的分享
奇妙的构思,神妙的实现,美妙的特效
帽子太高了!俺又不是大厨{:4_170:} 红影 发表于 2025-6-26 20:00
所以作用于点的实际是作用于球体的呗
不是,是作用于球体,点是球体的皮肤特征而已 红影 发表于 2025-6-26 20:00
这变化很奇妙
还行 马黑黑 发表于 2025-6-27 13:36
不是,是作用于球体,点是球体的皮肤特征而已
嗯嗯,这样说才是和效果的显示相符呢{:4_187:} 马黑黑 发表于 2025-6-27 13:36
还行
这样的变大变小真的有远近变化的感觉呢。 红影 发表于 2025-6-27 20:58
这样的变大变小真的有远近变化的感觉呢。
是的 红影 发表于 2025-6-27 20:57
嗯嗯,这样说才是和效果的显示相符呢
对对 马黑黑 发表于 2025-6-27 21:12
是的
这样的变化还挺好看的。