{"id":2,"date":"2025-08-13T14:51:17","date_gmt":"2025-08-13T06:51:17","guid":{"rendered":"https:\/\/heyingnian.com\/?page_id=2"},"modified":"2025-08-27T16:03:44","modified_gmt":"2025-08-27T08:03:44","slug":"about","status":"publish","type":"page","link":"https:\/\/heyingnian.com\/index.php\/about\/","title":{"rendered":"\u5173\u4e8e"},"content":{"rendered":"\n<div class=\"wp-block-group has-vivid-green-cyan-color has-black-background-color has-text-color has-background has-link-color wp-elements-bacf9a6efeb54a15f935821adff61262\" style=\"padding: 60px 20px; text-align: center; position: relative; overflow: hidden; font-family: 'Courier New', monospace;\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n\n<!-- \u9ed1\u5ba2\u7834\u89e3\u52a8\u753b -->\n<div id=\"hackIntro\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #000; color: #0f0; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 10; font-family: 'Courier New', monospace; text-align: left;\">\n    <p id=\"hackText\" style=\"font-size: 1.2rem; white-space: pre-line;\"><\/p>\n<\/div>\n\n<!-- Three.js Canvas -->\n<canvas id=\"threeCanvas\" style=\"width: 100%; height: 300px; margin: 40px auto; display: block;\"><\/canvas>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\n<script src=\"https:\/\/heyingnian.com\/wp-content\/themes\/argon\/music\/mobile-detect.js\"><\/script>\n\n<!-- \u97f3\u6548 -->\n<audio id=\"soundHack\" src=\"https:\/\/www.soundjay.com\/misc\/sounds\/computer-keyboard-press-3.mp3\" preload=\"auto\"><\/audio>\n<audio id=\"soundMeditate\" src=\"https:\/\/www.soundjay.com\/nature\/sounds\/wind-chime-01.mp3\" preload=\"auto\"><\/audio>\n<audio id=\"soundGC\" src=\"https:\/\/www.soundjay.com\/buttons\/sounds\/button-09.mp3\" preload=\"auto\"><\/audio>\n\n<!-- \u7ec8\u7aef\u8f93\u51fa -->\n<p id=\"terminalOutput\" style=\"white-space: pre-line; text-align: left; max-width: 600px; margin: 40px auto; padding: 20px; border-left: 4px solid #0f0; background: rgba(0,50,0,0.2); font-family: 'Courier New', monospace; box-shadow: 0 0 15px rgba(0,255,68,0.1);\">\n&gt; \u7cfb\u7edf\u542f\u52a8\u4e2d&#8230;<br>\n&gt; \u535a\u4e3b\u8eab\u4efd\u9a8c\u8bc1\u4e2d&#8230;\n<\/p>\n\n<!-- \u547d\u4ee4\u8f93\u5165 -->\n<div style=\"margin-top: 30px; z-index: 2; position: relative;\">\n    <input \n        id=\"cmdInput\" \n        type=\"text\" \n        placeholder=\"\u8bf7\u8f93\u5165\u547d\u4ee4...\" \n        style=\"background: #000; color: #0f0; border: 1px solid #0f0; padding: 10px; width: 80%; max-width: 400px; font-family: 'Courier New'; outline: none;\"\n        onkeydown=\"if(event.key==='Enter') window.handleCommand &#038;&#038; window.handleCommand()\"\n    \/>\n<\/div>\n\n<script>\n\/\/ \u2705 \u5168\u5c40\u5b9a\u4e49\uff0c\u786e\u4fdd onkeydown \u80fd\u8bbf\u95ee\nwindow.handleCommand = function() {\n    const input = document.getElementById('cmdInput');\n    const cmd = input.value.trim().toLowerCase();\n    if (!cmd) return;\n\n    const terminalOutput = document.getElementById('terminalOutput');\n    let response = '';\n\n    if (window.fightMode) {\n        switch(cmd) {\n            case 'gc':\n                const damage = Math.floor(Math.random() * 30) + 20;\n                window.bossHp = Math.max(0, window.bossHp - damage);\n                document.getElementById('soundGC').currentTime = 0;\n                document.getElementById('soundGC').play().catch(() => {});\n                if (window.bossHp > 0) {\n                    response = `\\n> \ud83d\udca5 \u53d1\u52a8\u300cGC \u6e21\u52ab\u300d\uff01\u5bf9 OOM \u9b3c\u738b\u9020\u6210 ${damage} \u70b9\u4f24\u5bb3\uff01\u5269\u4f59\u8840\u91cf\uff1a${window.bossHp}%`;\n                } else {\n                    response = `\\n> \ud83c\udf89 \u606d\u559c\uff01\u6210\u529f\u6e21\u52ab\uff0cOOM \u9b3c\u738b\u7070\u98de\u70df\u706d\uff01\u4fee\u4e3a+10\uff0c\u53d1\u91cf-2`;\n                    endFightMode();\n                }\n                break;\n            case 'escape':\n                const success = Math.random() > 0.3;\n                if (success) {\n                    response = '\\n> \ud83c\udfc3\u200d\u2642\ufe0f \u6210\u529f\u9003\u8131\uff01\u4f46\u4fee\u4e3a\u53d7\u635f\uff0c\u95ed\u5173\u4e09\u65e5\u3002';\n                    endFightMode();\n                } else {\n                    response = '\\n> \u274c \u9003\u8dd1\u5931\u8d25\uff01OOM \u9b3c\u738b\u8ffd\u51fb\uff0c\u8840\u91cf-10%\uff01';\n                    window.bossHp = Math.max(0, window.bossHp - 10);\n                    if (window.bossHp <= 0) {\n                        response += '\\n> \ud83d\udc80 \u6e21\u52ab\u5931\u8d25\u2026\u9b42\u98de\u9b44\u6563\uff0c\u81ea\u52a8\u91cd\u542f\u4e2d...';\n                        endFightMode();\n                    }\n                }\n                break;\n            case 'debug':\n                response = `\\n> \ud83d\udd0d \u5f53\u524d\u72b6\u6001\uff1a\\n>   - OOM \u9b3c\u738b\u8840\u91cf\uff1a${window.bossHp}%\\n>   - \u53ef\u7528\u6280\u80fd\uff1agc\uff0820~50\u4f24\u5bb3\uff09\uff0cescape\uff0870%\u6210\u529f\u7387\uff09`;\n                break;\n            default:\n                response = '\\n> \u6218\u6597\u4e2d\uff01\u8bf7\u8f93\u5165\uff1agc \/ escape \/ debug';\n        }\n        terminalOutput.innerHTML += '\\n> ' + input.value + response;\n        input.value = '';\n        return;\n    }\n\n    \/\/ \u2705 \u6b63\u5e38\u547d\u4ee4\u5904\u7406\n    switch(cmd) {\n        case 'help':\n            response = '\\n> \u53ef\u7528\u547d\u4ee4\uff1aabout, log, blog, temple, clear, fight, meditate, fly';\n            break;\n        case 'about':\n            response = '\\n> \u6cd5\u53f7\uff1a\u5fb7\u73ed\uff0c\u9053\u53f7\u201c\u79c3\u53d1\u4ed9\u4eba \u00b7 HYN\u201d\uff0c\\n> \u4fee\u884c\u4e8e JVM \u4e4b\u5dc5\uff0c\u4e3b\u4fee\u300aJava\u5fc3\u7ecf\u300b\uff0c\u517c\u4fee Spring \u5927\u6cd5\uff0c\\n> \u6bcf\u65e5\u6253\u5750\u4e8e Tomcat \u83b2\u53f0\uff0c\u70bc\u5e76\u53d1\u771f\u6c14\uff0c\u51dd\u7ebf\u7a0b\u91d1\u4e39\uff0c\\n> \u5076\u5c14\u4e0b\u5c71\u6349\u9b3c\uff08Bug\uff09\uff0c\u4f46\u5e38\u88ab OOM \u9b3c\u738b\u53cd\u6740\uff0c\u9041\u5165 GC \u4e4b\u5883\u95ed\u5173\u7597\u4f24\u3002';\n            break;\n       case '404':\n             response = '\\n> \ud83d\udd75\ufe0f\u200d\u2642\ufe0f \u4f60\u53d1\u73b0\u4e86\u9690\u85cf\u5165\u53e3\uff01\\n> \u795d\u9053\u53cb\u5929\u5929\u5f00\u5fc3\uff0c\u4e8b\u4e8b\u5982\u610f\\n> \u672a\u6765\u6709\u673a\u4f1a\u5e0c\u671b\u53ef\u4ee5\u8ddf\u9053\u53cb\u559d\u8336\u609f\u9053';\n                break;\n        case 'log':\n            response = '\\n> [INFO] 2025-08-26 18:00:00 - \u542f\u52a8\u4fee\u884c\\n> [DEBUG] 2025-08-26 18:05:23 - \u52a0\u8f7d Spring \u4e0a\u4e0b\u6587\\n> [WARN] 2025-08-26 19:30:11 - \u53d1\u73b0\u6f5c\u5728 NPE \u98ce\u9669\\n> [ERROR] 2025-08-26 20:15:44 - OOM \u5f02\u5e38\uff01\u542f\u52a8 GC \u6e21\u52ab\\n> [INFO] 2025-08-26 20:20:00 - \u6e21\u52ab\u6210\u529f\uff0c\u4fee\u4e3a+1\\n> [INFO] 2025-08-26 21:00:00 - \u4eca\u65e5\u4fee\u884c\u7ed3\u675f\uff0c\u53d1\u91cf-1';\n            break;\n        case 'blog':\n            response = '\\n> \u6b63\u5728\u8df3\u8f6c\u535a\u5ba2...';\n            setTimeout(() => { window.open('https:\/\/heyingnian.com', '_blank'); }, 1000);\n            break;\n        case 'temple':\n            response = '\\n> \u3010\u5c71\u95e8\u9053\u573a \u00b7 \u540e\u7aef\u5b97\u3011\\n> \u4e3b\u5cf0\uff1aJava 8 \u5883\uff08\u6c38\u6052\u4e4b\u5dc5\uff09\\n> \u504f\u6bbf\uff1aSpring Boot \u9662\uff08\u81ea\u52a8\u7b51\u57fa\uff09\\n> \u70bc\u4e39\u623f\uff1aMaven \u7089\u9f0e\uff08\u4e00\u952e\u6253\u5305\u6210\u4e39\uff09\\n> \u85cf\u7ecf\u9601\uff1aGit \u4e66\u5e93\uff08\u4e07\u5377\u4ee3\u7801\uff0c\u7686\u53ef\u8ffd\u6eaf\uff09\\n> \\n> \u7981\u5730\uff1a\\n>   - \u751f\u4ea7\u73af\u5883\uff08\u64c5\u5165\u8005\uff0c\u6740\u65e0\u8d66\uff09\\n>   - \u4ea7\u54c1\u7ecf\u7406\u4f1a\u8bae\u5ba4\uff08\u5fc3\u9b54\u52ab\u4e4b\u6e90\uff09';\n            break;\n        case 'clear':\n            terminalOutput.innerHTML = '&gt; \u7cfb\u7edf\u5df2\u6e05\u5c4f...\\n';\n            input.value = '';\n            return;\n        case 'fight':\n            response = '\\n> \u6b63\u5728\u751f\u6210\u6218\u6597\u573a\u666f...';\n            setTimeout(() => {\n                response = '\\n> \ud83c\udfae \u6218\u6597\u6a21\u5f0f\u542f\u52a8\uff01\\n> OOM \u9b3c\u738b\u51fa\u73b0\uff01\u8840\u91cf\uff1a100%\\n> \u8f93\u5165 \"gc\" \u53d1\u52a8\u6280\u80fd\uff0c\"escape\" \u9003\u8dd1\uff0c\"debug\" \u67e5\u770b\u72b6\u6001';\n                terminalOutput.innerHTML += response;\n                startFightMode();\n            }, 1000);\n            break;\n        case 'meditate':\n            response = '\\n> \ud83e\uddd8\u200d\u2642\ufe0f \u79c3\u53d1\u4ed9\u4eba\u8fdb\u5165\u6df1\u5ea6\u6253\u5750...';\n            terminalOutput.innerHTML += '\\n> ' + input.value + response;\n            document.getElementById('soundMeditate').currentTime = 0;\n            document.getElementById('soundMeditate').play().catch(() => {});\n            showMeditationFigure();\n            break;\n        case 'fly':\n            if (window.meditationScene) {\n                response = '\\n> \ud83d\ude80 \u79c3\u53d1\u4ed9\u4eba\u5fa1\u6c14\u98de\u884c\uff0c\u51b2\u5411\u661f\u6cb3\uff01';\n                terminalOutput.innerHTML += '\\n> ' + input.value + response;\n                flyToStars();\n            } else {\n                response = '\\n> \u5148\u8f93\u5165 meditate \u8fdb\u5165\u6253\u5750\u72b6\u6001\uff0c\u518d\u8d77\u98de\uff01';\n                terminalOutput.innerHTML += '\\n> ' + input.value + response;\n            }\n            break;\n        default:\n            response = '\\n> \u672a\u77e5\u547d\u4ee4\u3002\u8f93\u5165 \"help\" \u83b7\u53d6\u5e2e\u52a9\u3002';\n    }\n\n    terminalOutput.innerHTML += '\\n> ' + input.value + response;\n    input.value = '';\n};\n\n\/\/ \u2705 \u6218\u6597\u72b6\u6001\uff08\u5168\u5c40\uff09\nwindow.fightMode = false;\nwindow.bossHp = 100;\n\nfunction startFightMode() {\n    window.fightMode = true;\n    document.getElementById('cmdInput').placeholder = \"\u6218\u6597\u4e2d...\u8f93\u5165\u547d\u4ee4\uff1agc \/ escape \/ debug\";\n}\n\nfunction endFightMode() {\n    window.fightMode = false;\n    window.bossHp = 100;\n    document.getElementById('cmdInput').placeholder = \"\u8bf7\u8f93\u5165\u547d\u4ee4...\";\n}\n\n\/\/ \u2705 \u6253\u5750\u5c0f\u4eba & HYN 3D \u573a\u666f\u521d\u59cb\u5316\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n    const hackIntro = document.getElementById('hackIntro');\n    const hackText = document.getElementById('hackText');\n    const terminalOutput = document.getElementById('terminalOutput');\n    const canvas = document.getElementById(\"threeCanvas\");\n \/\/ \u2705 \u4f7f\u7528\u4f60\u5df2\u6709\u7684 MobileDetect \u5e93\uff08\u786e\u4fdd mobile-detect.js \u5df2\u52a0\u8f7d\uff09\n    if (typeof MobileDetect !== 'undefined') {\n        const md = new MobileDetect(window.navigator.userAgent);\n\n        \/\/ \ud83d\udcf1 \u5982\u679c\u662f\u624b\u673a \u6216 \u5e73\u677f\uff0c\u76f4\u63a5\u663e\u793a\u56fe\u7247\n        if (md.phone() || md.tablet()) {\n            const img = document.createElement('img');\n            img.src = 'https:\/\/heyingnian.com\/wp-content\/uploads\/2025\/08\/\u3010\u54f2\u98ce\u58c1\u7eb8\u3011\u539f\u91ce-\u6708-\u6708\u8272-scaled.png';\n            img.alt = 'HYN \u6548\u679c\u9884\u89c8';\n            img.style.cssText = `\n                width: 100%;\n                height: 300px;\n                object-fit: contain;\n                border: 2px solid #0f0;\n                box-shadow: 0 0 15px rgba(0, 255, 100, 0.3);\n            `;\n\n            img.onload = () => {\n                if (canvas && canvas.parentNode) {\n                    canvas.parentNode.replaceChild(img, canvas);\n                }\n            };\n\n            img.onerror = () => {\n                console.error('\u79fb\u52a8\u7aef\u56fe\u7247\u52a0\u8f7d\u5931\u8d25:', img.src);\n            };\n\n            return; \/\/ \u2705 \u624b\u673a\/\u5e73\u677f\u7aef\u5230\u8fd9\u91cc\u7ed3\u675f\n        }\n    }\n    const hasVisited = localStorage.getItem('hasVisitedHYN');\n\n    if (!hasVisited) {\n        hackIntro.style.display = 'flex';\n        let i = 0;\n        const hackSequence = [\n            '> \u6b63\u5728\u7834\u89e3\u9632\u706b\u5899...\\n',\n            '\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591 60%\\n',\n            '> \u6b63\u5728\u83b7\u53d6\u6743\u9650...\\n',\n            '\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 100%\\n',\n            '> \u7834\u89e3\u6210\u529f\uff01\u6b22\u8fce\u8fdb\u5165\u79c3\u53d1\u4ed9\u4eba\u9886\u57df\u3002\\n'\n        ];\n\n        function typeHack() {\n            if (i < hackSequence.length) {\n                hackText.innerHTML += hackSequence[i];\n                document.getElementById('soundHack').currentTime = 0;\n                document.getElementById('soundHack').play().catch(() => {});\n                i++;\n                setTimeout(typeHack, i === 3 ? 1500 : 800);\n            } else {\n                localStorage.setItem('hasVisitedHYN', 'true');\n                hackIntro.style.display = 'none';\n                initThreeJS();\n\n                const verifyLines = [\n                    \"\\n> \u8eab\u4efd\u9a8c\u8bc1\u901a\u8fc7\u3002\",\n                    \"\\n> \u535a\u4e3b\uff1a\u8d6b\u82f1\u5e74 (HYN)\",\n                    \"\\n> \u610f\u5883\uff1a\u725b\u9a6c\u610f\u5883\",\n                    \"\\n> \u4fe1\u5ff5\uff1a\u6211\u5199\u7684\u4e0d\u662f\u4ee3\u7801\uff0c\u662f\u4f1a\u8fd0\u884c\u7684\u54f2\u5b66\uff08\u548c\u4e00\u5806\u6ce8\u91ca\uff09\",\n                    \"\\n> \u72b6\u6001\uff1a\u6301\u7eed\u8fdb\u5316\u4e2d...\",\n                    \"\\n> \u6b22\u8fce\u8bbf\u95ee\u6211\u7684\u6570\u5b57\u9886\u5730\u3002\",\n                    \"\\n> \u8f93\u5165 'help' \u67e5\u770b\u66f4\u591a\u547d\u4ee4\u3002\"\n                ];\n                let lineIndex = 0;\n                function typeLine() {\n                    if (lineIndex < verifyLines.length) {\n                        terminalOutput.innerHTML += verifyLines[lineIndex];\n                        lineIndex++;\n                        setTimeout(typeLine, 600);\n                    }\n                }\n                setTimeout(typeLine, 800);\n            }\n        }\n        setTimeout(typeHack, 500);\n    } else {\n        hackIntro.remove();\n        initThreeJS();\n\n        const introText = `\n\\n> \u8eab\u4efd\u9a8c\u8bc1\u901a\u8fc7\u3002\n\\n> \u535a\u4e3b\uff1a\u8d6b\u82f1\u5e74 (HYN)\n\\n> \u610f\u5883\uff1a\u725b\u9a6c\u610f\u5883\n\\n> \u4fe1\u5ff5\uff1a\u6211\u5199\u7684\u4e0d\u662f\u4ee3\u7801\uff0c\u662f\u4f1a\u8fd0\u884c\u7684\u54f2\u5b66\uff08\u548c\u4e00\u5806\u6ce8\u91ca\uff09\n\\n> \u72b6\u6001\uff1a\u6301\u7eed\u8fdb\u5316\u4e2d...\n\\n> \u6b22\u8fce\u8bbf\u95ee\u6211\u7684\u6570\u5b57\u9886\u5730\u3002\n\\n> \u8f93\u5165 'help' \u67e5\u770b\u66f4\u591a\u547d\u4ee4\u3002\n`;\n        let i = 0;\n        function typeWriter() {\n            if (i < introText.length) {\n                terminalOutput.innerHTML += introText.charAt(i);\n                i++;\n                setTimeout(typeWriter, 30);\n            }\n        }\n        setTimeout(typeWriter, 500);\n    }\n});\n\n\/\/ \u2705 Three.js \u521d\u59cb\u5316\uff08HYN 3D\uff09\nfunction initThreeJS() {\n    const canvas = document.getElementById(\"threeCanvas\");\n    const renderer = new THREE.WebGLRenderer({ canvas, alpha: true });\n    renderer.setSize(canvas.offsetWidth, canvas.offsetHeight);\n\n    const scene = new THREE.Scene();\n    const camera = new THREE.PerspectiveCamera(75, canvas.offsetWidth \/ canvas.offsetHeight, 0.1, 1000);\n    camera.position.z = 22;\n\n    const material = new THREE.MeshBasicMaterial({ color: 0x00ff44, wireframe: true });\n\n    const groupH = new THREE.Group();\n    const groupY = new THREE.Group();\n    const groupN = new THREE.Group();\n    const particleGroup = new THREE.Group();\n    scene.add(groupH, groupY, groupN, particleGroup);\n\n    function addCubePair(group, x, y, z = 0) {\n        const geometry = new THREE.BoxGeometry(1.0, 1.0, 1.0);\n        const cube1 = new THREE.Mesh(geometry, material);\n        const cube2 = new THREE.Mesh(geometry, material);\n        cube1.position.set(x, y + 0.6, z);\n        cube2.position.set(x, y - 0.6, z);\n        group.add(cube1, cube2);\n    }\n\n    \/\/ \u6784\u5efa H Y N\n    for (let y = -4; y <= 4; y += 2) { addCubePair(groupH, 0, y); addCubePair(groupH, 4, y); }\n    for (let x = 1; x <= 3; x++) { addCubePair(groupH, x, 0); }\n    addCubePair(groupY, 6, 4); addCubePair(groupY, 8, 2); addCubePair(groupY, 10, 4);\n    addCubePair(groupY, 8, 0); addCubePair(groupY, 8, -2); addCubePair(groupY, 8, -4);\n    for (let y = -4; y <= 4; y += 2) { addCubePair(groupN, 12, y); addCubePair(groupN, 18, y); }\n    for (let i = 0; i < 6; i++) { addCubePair(groupN, 12 + i, 4 - i); }\n\n    groupH.position.x = -6;\n    groupN.position.x = 6;\n\n    \/\/ \u7c92\u5b50 &#038; \u626b\u63cf\u7ebf\n    for (let i = 0; i < 15; i++) {\n        const p = new THREE.Mesh(new THREE.SphereGeometry(0.25, 8, 8), new THREE.MeshBasicMaterial({ color: 0x00ff88 }));\n        const r = 14 + Math.random() * 6;\n        const a = Math.random() * Math.PI * 2;\n        p.position.set(Math.cos(a) * r, Math.sin(a) * r, Math.random() * 6 - 3);\n        p.userData = { angle: a, speed: 0.01 + Math.random() * 0.03 };\n        particleGroup.add(p);\n    }\n\n    const scanGeo = new THREE.PlaneGeometry(40, 0.8);\n    const scanMat = new THREE.MeshBasicMaterial({ color: 0x00ff44, transparent: true, opacity: 0.2 });\n    const scanMesh = new THREE.Mesh(scanGeo, scanMat);\n    scanMesh.rotation.x = -Math.PI \/ 2;\n    scene.add(scanMesh);\n\n    \/\/ \u2705 \u9f20\u6807\u62d6\u62fd\n    let isDragging = false;\n    let previousMousePosition = { x: 0, y: 0 };\n    canvas.addEventListener('mousedown', (e) => { isDragging = true; });\n    canvas.addEventListener('mouseup', () => { isDragging = false; });\n    canvas.addEventListener('mousemove', (e) => {\n        if (isDragging) {\n            const deltaMove = { x: e.offsetX - previousMousePosition.x, y: e.offsetY - previousMousePosition.y };\n            scene.rotation.y += deltaMove.x * 0.01;\n            scene.rotation.x += deltaMove.y * 0.01;\n        }\n        previousMousePosition = { x: e.offsetX, y: e.offsetY };\n    });\n\n    \/\/ \u52a8\u753b\n    let angle = 0;\n    function animate() {\n        requestAnimationFrame(animate);\n        angle += 0.02;\n        const swing = Math.sin(angle) * 0.7;\n        groupH.rotation.y = swing; groupN.rotation.y = -swing; groupY.rotation.y = Math.sin(angle * 1.3) * 0.2;\n        particleGroup.children.forEach(p => {\n            p.userData.angle += p.userData.speed;\n            p.position.x = Math.cos(p.userData.angle) * (14 + Math.sin(angle) * 2);\n            p.position.z = Math.sin(p.userData.angle) * (14 + Math.sin(angle) * 2);\n        });\n        scanMesh.position.y = ((scanMesh.position.y + 0.15) % 12) - 6;\n        renderer.render(scene, camera);\n    }\n    animate();\n\n    window.addEventListener('resize', () => {\n        camera.aspect = canvas.offsetWidth \/ canvas.offsetHeight;\n        camera.updateProjectionMatrix();\n        renderer.setSize(canvas.offsetWidth, canvas.offsetHeight);\n    });\n}\n\n\/\/ \u2705 \u6253\u5750\u5c0f\u4eba\uff08\u53ef\u70b9\u51fb\u5173\u95ed\uff09- \u4fee\u590d\u7248\nfunction showMeditationFigure() {\n    \/\/ \u2705 \u4fee\u590d\uff1a\u79fb\u9664\u5df2\u5b58\u5728\u7684\u6253\u5750\u5bb9\u5668\uff0c\u907f\u514d\u91cd\u590d\u521b\u5efa\n    const existing = document.getElementById('meditationContainer');\n    if (existing) {\n        document.body.removeChild(existing);\n    }\n\n    const container = document.createElement('div');\n    container.id = 'meditationContainer';\n    container.style.cssText = `\n        position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n        background: rgba(0,0,0,0.8); display: flex; justify-content: center;\n        align-items: center; z-index: 2000; backdrop-filter: blur(5px);\n    `;\n    document.body.appendChild(container);\n\n    const renderer = new THREE.WebGLRenderer({ alpha: true });\n    renderer.setSize(300, 300);\n    renderer.domElement.style.border = '2px solid #0f0';\n    renderer.domElement.style.boxShadow = '0 0 30px rgba(0,255,68,0.5)';\n    container.appendChild(renderer.domElement);\n\n    const scene = new THREE.Scene();\n    const camera = new THREE.PerspectiveCamera(60, 1, 0.1, 1000);\n    camera.position.z = 10;\n\n    const mat = new THREE.MeshBasicMaterial({ color: 0x00ff88, wireframe: true });\n\n    \/\/ \u2705 \u65b0\u589e\uff1a\u521b\u5efa\u4e00\u4e2a group \u6765\u5305\u88f9\u6574\u4e2a\u5c0f\u4eba\n    const group = new THREE.Group();\n\n    const head = new THREE.Mesh(new THREE.SphereGeometry(0.8, 6, 6), mat);\n    head.position.y = 4;\n    const body = new THREE.Mesh(new THREE.CylinderGeometry(0.4, 0.4, 3, 6), mat);\n    body.position.y = 2;\n    const leftArm = new THREE.Mesh(new THREE.CylinderGeometry(0.2, 0.2, 2, 6), mat);\n    leftArm.position.set(-1.2, 2.5, 0); leftArm.rotation.z = -0.5;\n    const rightArm = new THREE.Mesh(new THREE.CylinderGeometry(0.2, 0.2, 2, 6), mat);\n    rightArm.position.set(1.2, 2.5, 0); rightArm.rotation.z = 0.5;\n    const leftLeg = new THREE.Mesh(new THREE.CylinderGeometry(0.3, 0.3, 2, 6), mat);\n    leftLeg.position.set(-0.8, 0.5, -0.5); leftLeg.rotation.x = 1.2;\n    const rightLeg = new THREE.Mesh(new THREE.CylinderGeometry(0.3, 0.3, 2, 6), mat);\n    rightLeg.position.set(0.8, 0.5, -0.5); rightLeg.rotation.x = 1.2;\n\n    \/\/ \u2705 \u628a\u6240\u6709\u90e8\u4ef6\u6dfb\u52a0\u5230 group\n    group.add(head, body, leftArm, rightArm, leftLeg, rightLeg);\n    scene.add(group); \/\/ \u518d\u628a group \u6dfb\u52a0\u5230\u573a\u666f\n\n    const qiParticles = new THREE.Group();\n    for (let i = 0; i < 8; i++) {\n        const p = new THREE.Mesh(new THREE.SphereGeometry(0.2, 6, 6), new THREE.MeshBasicMaterial({ color: 0x00ffff }));\n        p.position.y = 5 + i * 0.8;\n        p.userData = { speed: 0.02 + i * 0.01 };\n        qiParticles.add(p);\n    }\n    scene.add(qiParticles);\n\n    function animate() {\n        requestAnimationFrame(animate);\n        qiParticles.children.forEach(p => {\n            p.position.y += p.userData.speed;\n            if (p.position.y > 10) p.position.y = 5.5;\n        });\n        renderer.render(scene, camera);\n    }\n    animate();\n\n    \/\/ \u2705 \u65b0\u589e\uff1a\u652f\u6301\u6309 Ctrl + C \u952e\u9000\u51fa\n    function closeContainer() {\n        if (container && document.body.contains(container)) {\n            document.body.removeChild(container);\n            window.meditationScene = null;\n        }\n    }\n    \/\/ \u70b9\u51fb\u4efb\u610f\u5904\u9000\u51fa\n    container.addEventListener('click', closeContainer);\n    \/\/ \u6309 Ctrl + C \u952e\u9000\u51fa\n    document.addEventListener('keydown', function(e) {\n        if (e.ctrlKey && e.key === 'c') {\n            closeContainer();\n        }\n    });\n\n    \/\/ \u6dfb\u52a0\u7ec8\u7aef\u63d0\u793a\n    terminalOutput.innerHTML += '\\n> \ud83e\uddd8\u200d\u2642\ufe0f \u6253\u5750\u6a21\u5f0f\u542f\u52a8\uff01\u8f93\u5165 \"fly\" \u53ef\u4ee5\u8d77\u98de\u3002';\n\n    container.focus();\n    container.tabIndex = 0;\n\n    \/\/ \u2705 \u4fdd\u5b58 group \u5230 meditationScene\n    window.meditationScene = { container, renderer, scene, camera, group, close: closeContainer };\n}\n\n\/\/ \u2705 fly \u547d\u4ee4\uff1a\u98de\u5411\u661f\u7a7a - \u4fee\u590d\u7248\nfunction flyToStars() {\n    const sceneData = window.meditationScene;\n    if (!sceneData || !sceneData.group) {\n        terminalOutput.innerHTML += '\\n> \u274c \u98de\u884c\u5931\u8d25\uff1a\u672a\u627e\u5230\u6253\u5750\u5c0f\u4eba\u3002\u8bf7\u5148\u8f93\u5165 meditate\u3002';\n        return;\n    }\n\n    const { renderer, scene, camera, group } = sceneData;\n    let t = 0;\n\n    function flyAnimate() {\n        if (t < 100) {\n            group.position.y += 0.08; \n            t++;\n            requestAnimationFrame(flyAnimate);\n        } else {\n            \/\/ \u2705 \u98de\u5347\u7ed3\u675f\uff0c\u81ea\u52a8\u5173\u95ed\u56fe\u5c42\uff08\u4f60\u539f\u6765\u5199\u7684 close \u51fd\u6570\uff09\n            sceneData.close();\n        }\n        renderer.render(scene, camera);\n    }\n    flyAnimate();\n\n    terminalOutput.innerHTML += '\\n> \ud83d\ude80 \u79c3\u53d1\u4ed9\u4eba\u5fa1\u6c14\u98de\u884c\uff0c\u51b2\u5411\u661f\u6cb3\uff01';\n}\n<\/script>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>&gt; \u7cfb\u7edf\u542f\u52a8\u4e2d&#8230; &gt; \u535a\u4e3b\u8eab\u4efd\u9a8c\u8bc1\u4e2d&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/pages\/2","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/comments?post=2"}],"version-history":[{"count":72,"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/pages\/2\/revisions"}],"predecessor-version":[{"id":279,"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/pages\/2\/revisions\/279"}],"wp:attachment":[{"href":"https:\/\/heyingnian.com\/index.php\/wp-json\/wp\/v2\/media?parent=2"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}