three+cannon实现一个三维文字菜单点击重力推拉效果代码
代码语言:html
所属分类:三维
代码描述:three+cannon实现一个三维文字菜单点击重力推拉效果代码
代码标签: three cannon 三维 文字 菜单 重力
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/aqua-1.5.5.css"> <style> body { display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #f7f7fd; } :root { --blue-color-1: #2c3e50; } .bg-blue-1 { background: var(--blue-color-1); } </style> </head> <body> <div class="relative w-screen h-screen"> <nav class="menu fixed hv-center z-5 pointer-events-none"> <ul class="menu-list text-center space-y-12 text-9xl opacity-0"> <li class="menu-list-item"><a href="#">Home</a></li> <li class="menu-list-item"><a href="#">Archives</a></li> <li class="menu-list-item"><a href="#">About</a></li> </ul> </nav> <div class="stage w-full h-full bg-blue-1"></div> </div> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.123.js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/cannon.js"></script> <script> const calcAspect = (el) => el.clientWidth / el.clientHeight; const getNormalizedMousePos = (e) => { return { x: (e.clientX / window.innerWidth) * 2 - 1, y: -(e.clientY / window.innerHeight) * 2 + 1 }; }; // 创建文本 const createText = (text = "", config, material = new THREE.MeshStandardMaterial({ color: "#ffffff" })) => { const geo = new THREE.TextGeometry(text, config); const mesh = new THREE.Mesh(geo, material); return mesh; }; // 加载字体 const loadFont = (url) => { const loader = new THREE.FontLoader(); return new Promise((resolve) => { loader.load(url, (font) => { resolve(font); }); }); }; const menuFontUrl = "//repo.bfw.wiki/bfwrepo/fonts/helvetiker_regular.typeface.json"; const menuFontConfig = { size: 3, height: 0.4, curveSegments: 24, bevelEnabled: true, bevelThickness: 0.9, bevelSize: 0.3, bevelSegments: 10 }; class MouseTracker { constructor() { this.mousePos = new THREE.Vector2(0, 0); this.mouseSpeed = 0; } // 追踪鼠标位置 trackMousePos() { window.addEventListener("mousemove", (e) => { this.setMousePos(e); }); window.addEventListener("touchstart", (e) => { this.setMousePos(e.touches[0]); }, { passive: false }); window.addEventListener("touchmove", (e) => { this.setMousePos(e.touches[0]); }); } // 设置鼠标位置 setMousePos(e) { const { x, y } = getNormalizedMousePos(e); this.mousePos.x = x; this.mousePos.y = y; } // 追踪鼠标速度 trackMouseSpeed() { // https://stackoverflow.com/questions/6417036/track-mouse-speed-with-js let lastMouseX = -1; let lastMouseY = -1; let mouseSpeed = 0; window.addEventListener("mousemove", (e) => { const mousex = e.pageX; const mousey = e.pageY; if (lastMouseX > -1) { mouseSpeed = Math.max(Math.abs(mousex - lastMouseX), Math.abs(mousey - lastMouseY)); this.mouseSpeed = mouseSpeed / 100; } lastMouseX = mousex; lastMouseY = mousey; }); document.addEventListener("mouseleave", () => { this.mouseSpeed = 0; }); } } class RaycastSelector { constructor(scene, camera) { this.scene = scene; this.camera = camera; this.raycaster = new THREE.Raycaster(); this.mouseTracker = n.........完整代码请登录后点击上方下载按钮下载查看
网友评论0