情没有对错(学习马黑黑Stand With Me效果)
<style>#tz { margin: 30px 0; left: calc(50% - 81px); transform: translateX(-50%); width: clamp(600px, 90vw, 1400px); min-height: 80vh; aspect-ratio: 16/9; background: #eee url('https://cccimg.com/view.php/161e3feb8c7486443dc2e54a61fe4301.png') no-repeat center/cover; box-shadow: 2px 2px 8px #000; display: grid; place-items: center; z-index: 1; position: relative; }
#btnFs { bottom: 20px; color: #eee; text-align: center; }
#btnFs:hover { color: red; }
#player { position: absolute; left: -1000px; }
</style>
<div id="tz">
<audio id="aud" src="https://cccimg.com/view.php/77b2a28ee1759b67a013ee1714baa593.mp3" autoplay="" loop=""></audio>
<div id="player" title="播放/暂停"></div>
</div>
<script type="module">
import * as THREE from 'https://638183.freep.cn/638183/3dev/build/three.module.min.js';
import { FS } from 'https://638183.freep.cn/638183/web/ku/FS.js';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, tz.offsetWidth/tz.offsetHeight, 0.1, 1000);
camera.position.z = 10;
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setClearAlpha(0.0);
renderer.setSize(tz.offsetWidth, tz.offsetHeight);
const clock = new THREE.Clock();
tz.appendChild(renderer.domElement);
const texture1 = new THREE.TextureLoader().load('https://638183.freep.cn/638183/small/texture/wdrop.webp');
const texture2 = new THREE.TextureLoader().load('https://638183.freep.cn/638183/t23/btn/f5.png');
const mesh = new THREE.Mesh(
new THREE.SphereGeometry(1, 64, 64),
new THREE.MeshBasicMaterial({ map: texture1 })
);
mesh.position.set(0.55, 2.15, 0)
scene.add(mesh);
const group = new THREE.Group();
for (let i = 0; i < 300; i++) {
const sprite = new THREE.Sprite(
new THREE.SpriteMaterial({ color: Math.random() * 0xff0000, map: texture2 })
);
sprite.scale.set(0.5, 0.5, 0.5);
sprite.position.set(100 * (Math.random() - 0.5), Math.random() * 20 - 10, Math.random() * 10 - 5);
group.add(sprite);
}
scene.add(group);
const isMess = (event) => {
const raycaster = new THREE.Raycaster();
const pointer = new THREE.Vector2();
let intersects = [];
pointer.x = (event.offsetX / tz.offsetWidth) * 2 - 1;
pointer.y = -(event.offsetY / tz.offsetHeight) * 2 + 1;
raycaster.setFromCamera(pointer, camera);
intersects = raycaster.intersectObjects(, true);
return intersects.length > 0;
}
tz.onmousemove = (e) => {
isMess(e)
? (tz.style.cursor = 'pointer', tz.title = '播放/暂停 Alt+X')
: (tz.style.cursor = 'default', tz.title = '');
};
tz.onclick = (e) => {
if (isMess(e)) player.click();
};
const animate = () => {
requestAnimationFrame(animate);
const delta = clock.getDelta();
mesh.rotation.x += delta;
mesh.rotation.y += delta;
group.children.forEach(sprite => {
sprite.position.x += delta / 10;
sprite.position.y -= delta;
sprite.material.rotation -= delta;
if (sprite.position.y < -10) {
sprite.position.set(Math.random() * 10 - 6, Math.random() * 10 + 10, Math.random() * 10 - 5);
sprite.material.color.set(Math.random() * 0xff0000);
}
});
renderer.render(scene, camera);
};
window.onresize = () => {
camera.aspect = tz.offsetWidth / tz.offsetHeight;
camera.updateProjectionMatrix();
renderer.setSize(tz.offsetWidth, tz.offsetHeight);
};
document.onvisibilitychange = () => {
if (aud.paused) return;
document.visibilityState === 'hidden' ? clock.stop() : clock.start();
};
aud.onplaying = aud.onpause = () => aud.paused ? clock.stop() : clock.start();
animate();
FS(tz, player);
</script> @马黑黑
老师 晚上好,学生交作业,请指正{:4_190:} 优秀99分{:4_187:} 漂亮,欣赏朵宝好帖{:4_187:}
页:
[1]