这个有问题,有大佬看一下到底是怎么回事吗edit icon

创建者:
Ray_ming
Fork(复制)
下载
嵌入
BUG反馈
index.html
index.html
            
            
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rayism&#26143;&#31995; - &#23436;&#25972;&#29256;</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { 
            font-family: 'Microsoft YaHei', Arial, sans-serif; 
            background: #000; 
            color: #fff; 
            overflow: hidden; 
            line-height: 1.6; 
        }
        #container { 
            position: relative; 
            width: 100vw; 
            height: 100vh; 
        }
        #canvas { 
            display: block; 
            position: absolute; 
            top: 0; 
            left: 0; 
        }
        #ui { 
            position: absolute; 
            top: 0; 
            left: 0; 
            width: 100%; 
            height: 100%; 
            pointer-events: none; 
            z-index: 10; 
        }
        #controls { 
            position: absolute; 
            top: 20px; 
            left: 20px; 
            background: rgba(0, 15, 30, 0.85); 
            padding: 15px; 
            border-radius: 15px; 
            color: white; 
            font-size: 13px; 
            backdrop-filter: blur(10px); 
            border: 1px solid rgba(80, 180, 255, 0.5); 
            width: 220px; 
            pointer-events: auto; 
            box-shadow: 0 0 25px rgba(0, 150, 255, 0.5); 
            transition: all 0.3s ease; 
            max-height: 90vh; 
            overflow-y: auto; 
        }
        #controls.collapsed { 
            height: auto; 
            overflow: hidden; 
            width: 40px; 
            padding: 10px; 
        }
        #controls.collapsed .control-content { 
            display: none; 
        }
        #controls.collapsed .security-id {
            writing-mode: vertical-rl;
            text-orientation: mixed;
            transform: rotate(180deg);
            margin: 10px 0;
            font-size: 8px;
            opacity: 0.7;
            letter-spacing: 1px;
        }
        #controls.collapsed h1 {
            font-size: 0;
            margin: 0;
            position: relative;
        }
        #controls.collapsed h1:after {
            content: "R";
            font-size: 16px;
            color: #6cf;
            text-shadow: 0 0 12px rgba(100, 200, 255, 0.8);
        }
        #controls:hover { 
            box-shadow: 0 0 30px rgba(0, 200, 255, 0.7); 
        }
        .control-content {
            transition: opacity 0.3s ease;
        }
        .control-group { 
            margin-bottom: 12px; 
            padding-bottom: 12px; 
            border-bottom: 1px solid rgba(255, 255, 255, 0.15); 
        }
        .control-group:last-child { 
            border-bottom: none; 
            margin-bottom: 0; 
            padding-bottom: 0; 
        }
        h1 { 
            font-size: 18px; 
            margin-bottom: 12px; 
            color: #6cf; 
            text-align: center; 
            text-shadow: 0 0 12px rgba(100, 200, 255, 0.8); 
            letter-spacing: 1px; 
            position: relative; 
            padding-right: 20px; 
        }
        .security-id { 
            font-size: 10px; 
            color: #9cf; 
            text-align: center; 
            margin-bottom: 10px; 
            opacity: 0.8; 
            user-select: none;
            cursor: default;
            letter-spacing: 1px;
            font-weight: bold;
            text-shadow: 0 0 8px rgba(100, 200, 255, 0.6);
        }
        .security-id::selection {
            background: transparent;
        }
        .toggle-controls { 
            position: absolute; 
            right: 0; 
            top: 0; 
            background: none; 
            border: none; 
            color: #6cf; 
            font-size: 16px; 
            cursor: pointer; 
            width: 20px; 
            height: 20px; 
            display: flex; 
            align-items: center; 
            justify-content: center; 
            z-index: 20; 
        }
        h2 { 
            font-size: 14px; 
            margin-bottom: 8px; 
            color: #8df; 
            padding-left: 5px; 
            border-left: 3px solid #4af; 
        }
        label { 
            display: block; 
            margin-bottom: 4px; 
            color: #aaf; 
            font-size: 12px; 
        }
        input[type="range"] { 
            width: 100%; 
            margin: 4px 0; 
            background: rgba(100, 150, 255, 0.2); 
            border-radius: 10px; 
            height: 6px; 
            -webkit-appearance: none; 
            outline: none; 
        }
        input[type="range"]::-webkit-slider-thumb { 
            -webkit-appearance: none; 
            width: 16px; 
            height: 16px; 
            border-radius: 50%; 
            background: #4af; 
            cursor: pointer; 
            box-shadow: 0 0 10px rgba(100, 200, 255, 0.9); 
            transition: all 0.2s ease; 
        }
        input[type="range"]::-webkit-slider-thumb:hover { 
            transform: scale(1.2); 
            background: #6cf; 
        }
        button { 
            background: linear-gradient(to bottom, #3a7bff, #2a5beb); 
            color: white; 
            border: none; 
            padding: 7px 12px; 
            border-radius: 8px; 
            cursor: pointer; 
            width: 100%; 
            margin: 4px 0; 
            font-size: 12px; 
            transition: all 0.2s ease; 
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); 
        }
        button:hover { 
            background: linear-gradient(to bottom, #4a8bff, #3a6bfb); 
            transform: translateY(-2px); 
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); 
        }
        button:active { 
            transform: translateY(0); 
            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); 
        }
        .slider-value { 
            display: inline-block; 
            width: 35px; 
            text-align: right; 
            color: #6cf; 
            font-size: 11px; 
            font-weight: bold; 
        }
        #info-panel { 
            position: absolute; 
            bottom: 20px; 
            left: 20px; 
            background: rgba(0, 15, 30, 0.85); 
            padding: 15px; 
            border-radius: 15px; 
            color: white; 
            font-size: 13px; 
            backdrop-filter: blur(10px); 
            border: 1px solid rgba(80, 180, 255, 0.5); 
            width: 250px; 
            pointer-events: auto; 
            box-shadow: 0 0 25px rgba(0, 150, 255, 0.5); 
            transition: all 0.3s ease; 
        }
        #selected-object { 
            font-size: 18px; 
            font-weight: bold; 
            color: #6cf; 
            margin-bottom: 10px; 
            text-shadow: 0 0 10px rgba(100, 200, 255, 0.6); 
        }
        #object-info { 
            font-size: 12px; 
            color: #ccf; 
            max-height: 200px; 
            overflow-y: auto; 
            line-height: 1.6; 
        }
        #help { 
            position: absolute; 
            bottom: 20px; 
            right: 20px; 
            background: rgba(0, 15, 30, 0.85); 
            padding: 15px; 
            border-radius: 15px; 
            color: #aaf; 
            font-size: 12px; 
            backdrop-filter: blur(10px); 
            border: 1px solid rgba(80, 180, 255, 0.5); 
            max-width: 280px; 
            pointer-events: auto; 
            box-shadow: 0 0 25px rgba(0, 150, 255, 0.5); 
        }
        #loading { 
            position: absolute; 
            top: 50%; 
            left: 50%; 
            transform: translate(-50%, -50%); 
            color: #6cf; 
            font-size: 24px; 
            text-align: center; 
            background: rgba(0, 15, 30, 0.95); 
            padding: 30px 40px; 
            border-radius: 20px; 
            border: 1px solid rgba(80, 180, 255, 0.5); 
            box-shadow: 0 0 40px rgba(0, 100, 255, 0.6); 
            z-index: 100; 
        }
        .progress-bar { 
            width: 220px; 
            height: 10px; 
            background: rgba(100, 150, 255, 0.2); 
            border-radius: 10px; 
            margin: 15px auto; 
            overflow: hidden; 
        }
        .progress { 
            height: 100%; 
            background: linear-gradient(to right, #3a7bff, #4af); 
            width: 0%; 
            transition: width 0.5s ease; 
            border-radius: 10px; 
        }
        .compact-row { 
            display: flex; 
            justify-content: space-between; 
            align-items: center; 
            margin-bottom: 8px; 
        }
        .compact-row label { 
            margin-bottom: 0; 
            flex: 1; 
        }
        .compact-row .slider-value { 
            text-align: right; 
            flex: 0 0 35px; 
        }
        .nav-buttons { 
            display: grid; 
            grid-template-columns: repeat(2, 1fr); 
            gap: 6px; 
        }
        .nav-buttons button { 
            margin: 3px; 
            padding: 6px; 
            font-size: 11px; 
        }
        .tooltip { 
            position: relative; 
        }
        .tooltip:hover::after { 
            content: attr(data-tooltip); 
            position: absolute; 
            bottom: 100%; 
            left: 50%; 
            transform: translateX(-50%); 
            background: rgba(0, 0, 0, 0.8); 
            color: white; 
            padding: 5px 10px; 
            border-radius: 5px; 
            font-size: 11px; 
            white-space: nowrap; 
            z-index: 100; 
            border: 1px solid rgba(100, 150, 255, 0.3); 
        }
        .icon-btn { 
            display: flex; 
            align-items: center; 
            justify-content: center; 
            gap: 5px; 
        }
        .star-info { 
            margin-top: 10px; 
            padding-top: 10px; 
            border-top: 1px solid rgba(255, 255, 255, 0.1); 
        }
        .planet-list { 
            margin-top: 5px; 
        }
        .planet-item { 
            padding: 5px; 
            margin: 3px 0; 
            background: rgba(50, 100, 180, 0.2); 
            border-radius: 5px; 
            cursor: pointer; 
            transition: all 0.2s ease; 
        }
        .planet-item:hover { 
            background: rgba(70, 130, 220, 0.3); 
            transform: translateX(5px); 
        }
        .nav-section { 
            margin-bottom: 10px; 
        }
        .search-box { 
            width: 100%; 
            padding: 8px; 
            background: rgba(30, 60, 100, 0.5); 
            border: 1px solid rgba(80, 150, 255, 0.3); 
            border-radius: 5px; 
            color: white; 
            margin-bottom: 10px; 
        }
        .category-title { 
            font-size: 13px; 
            color: #6cf; 
            margin: 8px 0 5px; 
            padding-left: 5px; 
            border-left: 2px solid #4af; 
        }
        .star-system-btn { 
            text-align: left; 
            padding: 6px 8px; 
            margin: 2px 0; 
            font-size: 11px; 
            background: rgba(40, 90, 150, 0.4); 
        }
        .star-system-btn:hover { 
            background: rgba(60, 120, 200, 0.6); 
        }
        .collapsible { 
            cursor: pointer; 
        }
        .collapsible-content { 
            max-height: 0; 
            overflow: hidden; 
            transition: max-height 0.3s ease-out; 
        }
        .tab-buttons { 
            display: flex; 
            margin-bottom: 10px; 
        }
        .tab-btn { 
            flex: 1; 
            padding: 5px; 
            text-align: center; 
            background: rgba(40, 80, 140, 0.4); 
            cursor: pointer; 
            border-radius: 3px; 
            margin: 0 2px; 
            font-size: 11px; 
        }
        .tab-btn.active { 
            background: rgba(60, 120, 200, 0.8); 
        }
        @media (max-width: 768px) { 
            #controls { 
                width: 180px; 
                font-size: 12px; 
            } 
            #info-panel, #help { 
                width: 200px; 
                font-size: 11px; 
            } 
            h1 { 
                font-size: 16px; 
            } 
        }
    </style>
</head>

<body>
    <div id="container">
        <canvas id="canvas"></canvas>

        <div id="ui">
            <div id="controls">
                <div class="control-header">
                    <h1>Rayism&#26143;&#31995;</h1>
                    <button class="toggle-controls" title="&#25240;&#21472;/&#23637;&#24320;">&#9660;</button>
                </div>
                <div class="security-id">QID:limit306</div>

                <div class="control-content">
                    <div class="control-group">
                        <div class="compact-row">
                            <label>&#32553;&#25918;:</label>
                            <span id="zoom-value" class="slider-value">1.0</span>
                        </div>
                        <input type="range" id="zoom" min="0.1" max="3" step="0.1" value="1">

                        <div class="compact-row">
                            <label>&#36895;&#24230;:</label>
                            <span id="speed-value" class="slider-value">1.0</span>
                        </div>
                        <input type="range" id="speed" min="0.1" max="5" step="0.1" value="1">

                        <div class="compact-row">
                            <label>&#22823;&#23567;:</label>
                            <span id="size-value" class="slider-value">1.0</span>
                        </div>
                        <input type="range" id="size" min="0.5" max="3" step="0.1" value="1">
                    </div>

                    <div class="control-group">
                        <div class="nav-buttons">
                            <button id="toggle-names" class="icon-btn" data-tooltip="&#26174;&#31034;/&#38544;&#34255;&#22825;&#20307;&#21517;&#31216;">&#21517;&#31216;</button>
                            <button id="toggle-orbits" class="icon-btn" data-tooltip="&#26174;&#31034;/&#38544;&#34255;&#34892;&#26143;&#36712;&#36947;">&#36712;&#36947;</button>
                            <button id="toggle-labels" class="icon-btn" data-tooltip="&#26174;&#31034;/&#38544;&#34255;&#36317;&#31163;&#26631;&#31614;">&#36317;&#31163;</button>
                            <button id="toggle-asteroids" class="icon-btn" data-tooltip="&#26174;&#31034;/&#38544;&#34255;&#23567;&#34892;&#26143;&#24102;">&#23567;&#34892;&#26143;</button>
                            <button id="reset-view" class="icon-btn" data-tooltip="&#24674;&#22797;&#40664;&#35748;&#35270;&#35282;">&#37325;&#32622;</button>
                        </div>
                    </div>

                    <div class="control-group">
                        <h2>&#23548;&#33322;</h2>
                        <input type="text" id="search-system" class="search-box" placeholder="&#25628;&#32034;&#24658;&#26143;&#31995;&#32479;">

                        <div class="tab-buttons">
                            <div class="tab-btn active" data-category="all">&#20840;&#37096;</div>
                            <div class="tab-btn" data-category="nearby">&#36817;&#36317;&#31163;</div>
                            <div class="tab-btn" data-category="habitable">&#23452;&#23621;</div>
                        </div>

                        <div class="nav-section">
                            <div class="category-title">&#22826;&#38451;&#31995;</div>
                            <button class="star-system-btn" data-star="sun">&#22826;&#38451;&#31995;</button>
                        </div>

                        <div class="nav-section">
                            <div class="category-title">&#36817;&#36317;&#31163;&#24658;&#26143;</div>
                            <button class="star-system-btn" data-star="alphaCentauri">&#21322;&#20154;&#39532;&#24231;&#945;</button>
                            <button class="star-system-btn" data-star="sirius">&#22825;&#29436;&#26143;</button>
                            <button class="star-system-btn" data-star="barnard">&#24052;&#32435;&#24503;&#26143;</button>
                            <button class="star-system-btn" data-star="wolf359">&#27773;&#22827;359</button>
                            <button class="star-system-btn" data-star="lalande21185">&#25289;&#20848;&#24503;21185</button>
                            <button class="star-system-btn" data-star="proximaCentauri">&#27604;&#37051;&#26143;</button>
                            <button class="star-system-btn" data-star="tauCeti">&#22825;&#20179;&#20105;</button>
                            <button class="star-system-btn" data-star="epsilonEridani">&#27874;&#27743;&#24231;&#949;</button>
                            <button class="star-system-btn" data-star="gliese581">&#26684;&#21033;&#27874;581</button>
                        </div>

                        <div class="nav-section">
                            <div class="category-title">&#36828;&#36317;&#31163;&#24658;&#26143;</div>
                            <button class="star-system-btn" data-star="trappist">&#21644;&#24179;&#26143;</button>
                            <button class="star-system-btn" data-star="kepler22">&#24320;&#26222;&#21202;22</button>
                            <button class="star-system-btn" data-star="gliese667">&#26684;&#21033;&#27874;667</button>
                            <button class="star-system-btn" data-star="hd40307">HD 40307</button>
                            <button class="star-system-btn" data-star="kepler186">&#24320;&#26222;&#21202;186</button>
                            <button class="star-system-btn" data-star="kepler452">&#24320;&#26222;&#21202;452</button>
                            <button class="star-system-btn" data-star="kepler62">&#24320;&#26222;&#21202;62</button>
                            <button class="star-system-btn" data-star="vega">&#32455;&#22899;&#26143;</button>
                            <button class="star-system-btn" data-star="arcturus">&#22823;&#35282;&#26143;</button>
                            <button class="star-system-btn" data-star="altair">&#29275;&#37070;&#26143;</button>
                            <button class="star-system-btn" data-star="betelgeuse">&#21442;&#23487;&#22235;</button>
                            <button class="star-system-btn" data-star="rigel">&#21442;&#23487;&#19971;</button>
                            <!-- 新增的5个星系 -->
                            <button class="star-system-btn" data-star="pollux">&#21271;&#27827;&#19977;</button>
                            <button class="star-system-btn" data-star="procyon">&#21335;&#27827;&#19977;</button>
                            <button class="star-system-btn" data-star="aldebaran">&#27605;&#23487;&#20116;</button>
                            <button class="star-system-btn" data-star="spica">&#35282;&#23487;&#19968;</button>
                            <button class="star-system-btn" data-star="antares">&#24515;&#23487;&#20108;</button>
                        </div>
                    </div>
                </div>
            </div>

            <div id="info-panel">
                <div id="selected-object">&#36873;&#25321;&#22825;&#20307;&#26597;&#30475;&#20449;&#24687;</div>
                <div id="object-info">&#28857;&#20987;&#20219;&#20309;&#24658;&#26143;&#25110;&#34892;&#26143;&#26597;&#30475;&#35814;&#32454;&#20449;&#24687;</div>
            </div>

            <div id="help">
                <strong>&#25511;&#21046;&#35828;&#26126;:</strong><br>
                &#40736;&#26631;&#24038;&#38190; - &#26059;&#36716;&#35270;&#22270;<br>
                &#40736;&#26631;&#21491;&#38190; - &#24179;&#31227;&#35270;&#22270;<br>
                &#40736;&#26631;&#28378;&#36718; - &#32553;&#25918;<br>
                &#21452;&#20987;&#22825;&#20307; - &#32858;&#28966;&#26597;&#30475;<br>
                W/A/S/D - &#31227;&#21160;&#25668;&#20687;&#26426;<br>
                Q/E - &#19978;&#21319;/&#19979;&#38477;
            </div>
        </div>

        <div id="loading">
            <div>&#21152;&#36733;&#24658;&#26143;&#31995;&#32479;&#27169;&#22411;</div>
            <div class="progress-bar">
                <div class="progress" id="progress"></div>
            </div>
            <div>&#21021;&#22987;&#21270;3D&#29615;&#22659;&#19982;&#24658;&#26143;&#25968;&#25454;</div>
        </div>
    </div>

    <!-- 引入Three.js库 -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/build/three.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/controls/OrbitControls.js"></script>

    <script>
        // 主变量
        let scene, camera, renderer, controls;
        let stars = {};
        let starMeshes = {};
        let planets = {};
        let orbits = {};
        let labels = {};
        let asteroidBelts = {};
        let distanceLabels = {};
        let loadingComplete = false;
        
        // 配置参数
        const config = {
            showNames: true,
            showOrbits: true,
            showDistanceLabels: true,
            showAsteroids: true,
            simulationSpeed: 1.0,
            objectSize: 1.0,
            zoomLevel: 1.0,
            currentView: 'solar-system'
        };
        
        // 默认信息文本
        const DEFAULT_SELECTED_OBJECT_TEXT = "&#36873;&#25321;&#22825;&#20307;&#26597;&#30475;&#20449;&#24687;";
        const DEFAULT_OBJECT_INFO_TEXT = "&#28857;&#20987;&#20219;&#20309;&#24658;&#26143;&#25110;&#34892;&#26143;&#26597;&#30475;&#35814;&#32454;&#20449;&#24687;";
        
        // HTML实体解码函数
        function decodeHTML(html) {
            const txt = document.createElement("textarea");
            txt.innerHTML = html;
            return txt.value;
        }
        
        // 恒星数据 (距离单位: 光年,按比例缩小)
        const starData = {
            sun: {
                name: "&#22826;&#38451;",
                type: "G&#22411;&#20027;&#24207;&#26143;",
                mass: "1.989 &#215; 10^30 kg",
                diameter: "1,391,000 km",
                temperature: "5,772 K",
                luminosity: "1 L&#9730;",
                distance: 0,
                position: { x: 0, y: 0, z: 0 },
                color: 0xffddaa,
                size: 10,
                glowColor: 0xffaa33,
                glowSize: 2.5,
                planets: {
                    mercury: {
                        name: "&#27700;&#26143;",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "4,879 km",
                        distance: 20,
                        period: 0.24,
                        color: 0x888888,
                        size: 0.8
                    },
                    venus: {
                        name: "&#37329;&#26143;",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "12,104 km",
                        distance: 35,
                        period: 0.62,
                        color: 0xeeeeaa,
                        size: 1.5
                    },
                    earth: {
                        name: "&#22320;&#29699;",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "12,742 km",
                        distance: 50,
                        period: 1,
                        color: 0x2277ff,
                        size: 1.6,
                        moons: [
                            {
                                name: "&#26376;&#29699;",
                                distance: 5,
                                period: 0.074,
                                color: 0xcccccc,
                                size: 0.4
                            }
                        ]
                    },
                    mars: {
                        name: "&#28779;&#26143;",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "6,779 km",
                        distance: 70,
                        period: 1.88,
                        color: 0xff6633,
                        size: 1.2
                    },
                    jupiter: {
                        name: "&#26408;&#26143;",
                        type: "&#27668;&#24577;&#24040;&#34892;&#26143;",
                        diameter: "139,820 km",
                        distance: 120,
                        period: 11.86,
                        color: 0xffaa66,
                        size: 4.8
                    },
                    saturn: {
                        name: "&#22303;&#26143;",
                        type: "&#27668;&#24577;&#24040;&#34892;&#26143;",
                        diameter: "116,460 km",
                        distance: 160,
                        period: 29.46,
                        color: 0xffff99,
                        size: 4.0,
                        rings: {
                            innerRadius: 5,
                            outerRadius: 8,
                            color: 0xffeeaa
                        }
                    },
                    uranus: {
                        name: "&#22825;&#29579;&#26143;",
                        type: "&#20912;&#24040;&#34892;&#26143;",
                        diameter: "50,724 km",
                        distance: 200,
                        period: 84.01,
                        color: 0xaaffff,
                        size: 2.8
                    },
                    neptune: {
                        name: "&#28023;&#29579;&#26143;",
                        type: "&#20912;&#24040;&#34892;&#26143;",
                        diameter: "49,244 km",
                        distance: 250,
                        period: 164.8,
                        color: 0x4444ff,
                        size: 2.7
                    }
                },
                asteroidBelt: {
                    innerRadius: 85,
                    outerRadius: 105,
                    count: 200,
                    color: 0xaaaaaa
                }
            },
            alphaCentauri: {
                name: "&#21322;&#20154;&#39532;&#24231;&#945;",
                type: "&#19977;&#21512;&#26143;&#31995;&#32479;",
                mass: "1.1 M&#9730;",
                diameter: "1.227 D&#9730;",
                temperature: "5,790 K",
                luminosity: "1.519 L&#9730;",
                distance: 4.37,
                position: { x: 800, y: 100, z: 200 },
                color: 0xffeebb,
                glowColor: 0xffcc66,
                size: 11,
                glowSize: 2.0,
                planets: {
                    proximaCentaurib: {
                        name: "&#27604;&#37051;&#26143;b",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "14,000 km",
                        distance: 25,
                        period: 11.2,
                        color: 0xaa7744,
                        size: 1.7
                    }
                }
            },
            sirius: {
                name: "&#22825;&#29436;&#26143;",
                type: "A&#22411;&#20027;&#24207;&#26143;",
                mass: "2.02 M&#9730;",
                diameter: "1.711 D&#9730;",
                temperature: "9,940 K",
                luminosity: "25.4 L&#9730;",
                distance: 8.6,
                position: { x: -600, y: 400, z: -500 },
                color: 0xffffff,
                glowColor: 0xbbeeff,
                size: 14,
                glowSize: 3.0,
                planets: {
                    siriusb: {
                        name: "&#22825;&#29436;&#26143;b",
                        type: "&#30333;&#30663;&#26143;",
                        diameter: "12,000 km",
                        distance: 40,
                        period: 50,
                        color: 0xaaaaff,
                        size: 1.2
                    }
                }
            },
            barnard: {
                name: "&#24052;&#32435;&#24503;&#26143;",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.144 M&#9730;",
                diameter: "0.196 D&#9730;",
                temperature: "3,134 K",
                luminosity: "0.0035 L&#9730;",
                distance: 5.96,
                position: { x: 400, y: -700, z: 300 },
                color: 0xff4422,
                glowColor: 0xff6600,
                size: 5,
                glowSize: 1.8,
                planets: {
                    barnardb: {
                        name: "&#24052;&#32435;&#24503;&#26143;b",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "18,000 km",
                        distance: 15,
                        period: 233,
                        color: 0xdd6644,
                        size: 2.0
                    }
                }
            },
            wolf359: {
                name: "&#27773;&#22827;359",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.09 M&#9730;",
                diameter: "0.16 D&#9730;",
                temperature: "2,800 K",
                luminosity: "0.0009 L&#9730;",
                distance: 7.86,
                position: { x: -900, y: -300, z: 400 },
                color: 0xff6644,
                glowColor: 0xff5500,
                size: 4,
                glowSize: 1.5,
                planets: {
                    wolf359b: {
                        name: "&#27773;&#22827;359b",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "12,000 km",
                        distance: 10,
                        period: 100,
                        color: 0xbb8866,
                        size: 1.5
                    }
                }
            },
            lalande21185: {
                name: "&#25289;&#20848;&#24503;21185",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.46 M&#9730;",
                diameter: "0.393 D&#9730;",
                temperature: "3,800 K",
                luminosity: "0.025 L&#9730;",
                distance: 8.31,
                position: { x: 700, y: -500, z: -600 },
                color: 0xff8844,
                glowColor: 0xff7700,
                size: 6,
                glowSize: 2.2,
                planets: {
                    lalande21185b: {
                        name: "&#25289;&#20848;&#24503;21185b",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "16,000 km",
                        distance: 20,
                        period: 180,
                        color: 0xcc9966,
                        size: 1.8
                    },
                    lalande21185c: {
                        name: "&#25289;&#20848;&#24503;21185c",
                        type: "&#27668;&#24577;&#34892;&#26143;",
                        diameter: "40,000 km",
                        distance: 35,
                        period: 320,
                        color: 0xaaddff,
                        size: 2.5
                    }
                }
            },
            proximaCentauri: {
                name: "&#27604;&#37051;&#26143;",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.12 M&#9730;",
                diameter: "0.15 D&#9730;",
                temperature: "3,050 K",
                luminosity: "0.0017 L&#9730;",
                distance: 4.24,
                position: { x: 900, y: -200, z: -100 },
                color: 0xff4422,
                glowColor: 0xff3300,
                size: 4,
                glowSize: 1.7,
                planets: {
                    proximaCentaurib: {
                        name: "&#27604;&#37051;&#26143;b",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "14,000 km",
                        distance: 25,
                        period: 11.2,
                        color: 0xaa7744,
                        size: 1.7
                    },
                    proximaCentauric: {
                        name: "&#27604;&#37051;&#26143;c",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "16,000 km",
                        distance: 35,
                        period: 28.0,
                        color: 0xbb8855,
                        size: 1.8
                    }
                }
            },
            tauCeti: {
                name: "&#22825;&#20179;&#20116;",
                type: "G&#22411;&#20027;&#24207;&#26143;",
                mass: "0.78 M&#9730;",
                diameter: "0.79 D&#9730;",
                temperature: "5,344 K",
                luminosity: "0.45 L&#9730;",
                distance: 11.9,
                position: { x: -1100, y: 1300, z: -400 },
                color: 0xffeeaa,
                glowColor: 0xffdd88,
                size: 8,
                glowSize: 2.3,
                planets: {
                    tauCetib: {
                        name: "&#22825;&#20179;&#20116;b",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "16,000 km",
                        distance: 30,
                        period: 160,
                        color: 0xbb9966,
                        size: 1.8
                    },
                    tauCetic: {
                        name: "&#22825;&#20179;&#20116;c",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "15,000 km",
                        distance: 40,
                        period: 210,
                        color: 0xccaa77,
                        size: 1.7
                    },
                    tauCetid: {
                        name: "&#22825;&#20179;&#20116;d",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "12,000 km",
                        distance: 55,
                        period: 320,
                        color: 0xddbb88,
                        size: 1.5
                    }
                }
            },
            epsilonEridani: {
                name: "&#27874;&#27743;&#24231;&#949;",
                type: "K&#22411;&#20027;&#24207;&#26143;",
                mass: "0.82 M&#9730;",
                diameter: "0.74 D&#9730;",
                temperature: "5,084 K",
                luminosity: "0.34 L&#9730;",
                distance: 10.5,
                position: { x: 1300, y: -900, z: 700 },
                color: 0xffbb66,
                glowColor: 0xffaa44,
                size: 8,
                glowSize: 2.3,
                planets: {
                    epsilonEridanib: {
                        name: "&#27874;&#27743;&#24231;&#949;b",
                        type: "&#27668;&#24577;&#24040;&#34892;&#26143;",
                        diameter: "140,000 km",
                        distance: 50,
                        period: 2502,
                        color: 0xddbb88,
                        size: 4.0
                    }
                }
            },
            gliese581: {
                name: "&#26684;&#21033;&#27874;581",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.31 M&#9730;",
                diameter: "0.38 D&#9730;",
                temperature: "3,480 K",
                luminosity: "0.013 L&#9730;",
                distance: 20.3,
                position: { x: -1500, y: 1200, z: 800 },
                color: 0xff5533,
                glowColor: 0xff4400,
                size: 5,
                glowSize: 1.9,
                planets: {
                    gliese581b: {
                        name: "&#26684;&#21033;&#27874;581b",
                        type: "&#28023;&#29579;&#26143;",
                        diameter: "50,000 km",
                        distance: 15,
                        period: 5.4,
                        color: 0x4444ff,
                        size: 2.8
                    },
                    gliese581c: {
                        name: "&#26684;&#21033;&#27874;581c",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "18,000 km",
                        distance: 25,
                        period: 12.9,
                        color: 0x55aa88,
                        size: 1.9
                    },
                    gliese581d: {
                        name: "&#26684;&#21033;&#27874;581d",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "22,000 km",
                        distance: 40,
                        period: 66.6,
                        color: 0x66bb99,
                        size: 2.2
                    }
                }
            },
            trappist: {
                name: "&#21644;&#24179;&#26143;",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.08 M&#9730;",
                diameter: "0.12 D&#9730;",
                temperature: "2,550 K",
                luminosity: "0.0005 L&#9730;",
                distance: 40,
                position: { x: 1200, y: 800, z: 1000 },
                color: 0xff5533,
                glowColor: 0xff4400,
                size: 4,
                glowSize: 1.6,
                planets: {
                    trappist1b: {
                        name: "&#21644;&#24179;&#26143;b",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "11,000 km",
                        distance: 15,
                        period: 1.5,
                        color: 0xaa6644,
                        size: 1.2
                    },
                    trappist1c: {
                        name: "&#21644;&#24179;&#26143;c",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "12,000 km",
                        distance: 22,
                        period: 2.4,
                        color: 0xbb7755,
                        size: 1.3
                    },
                    trappist1d: {
                        name: "&#21644;&#24179;&#26143;d",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "9,000 km",
                        distance: 30,
                        period: 4.0,
                        color: 0xcc8866,
                        size: 1.0
                    }
                }
            },
            kepler22: {
                name: "&#24320;&#26222;&#21202;22",
                type: "G&#22411;&#20027;&#24207;&#26143;",
                mass: "0.97 M&#9730;",
                diameter: "0.98 D&#9730;",
                temperature: "5,518 K",
                luminosity: "0.79 L&#9730;",
                distance: 600,
                position: { x: -1500, y: 1000, z: 800 },
                color: 0xffdd99,
                glowColor: 0xffcc66,
                size: 9,
                glowSize: 2.4,
                planets: {
                    kepler22b: {
                        name: "&#24320;&#26222;&#21202;22b",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "24,000 km",
                        distance: 45,
                        period: 290,
                        color: 0x44aa88,
                        size: 2.2
                    }
                }
            },
            gliese667: {
                name: "&#26684;&#21033;&#27874;667",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.33 M&#9730;",
                diameter: "0.42 D&#9730;",
                temperature: "3,700 K",
                luminosity: "0.013 L&#9730;",
                distance: 22.7,
                position: { x: -1700, y: -1200, z: 900 },
                color: 0xff6633,
                glowColor: 0xff5500,
                size: 5,
                glowSize: 1.9,
                planets: {
                    gliese667cb: {
                        name: "&#26684;&#21033;&#27874;667Cb",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "18,000 km",
                        distance: 18,
                        period: 28,
                        color: 0xbb8866,
                        size: 1.9
                    },
                    gliese667Cc: {
                        name: "&#26684;&#21033;&#27874;667Cc",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "20,000 km",
                        distance: 25,
                        period: 39,
                        color: 0xcc9977,
                        size: 2.1
                    }
                }
            },
            hd40307: {
                name: "HD 40307",
                type: "K&#22411;&#20027;&#24207;&#26143;",
                mass: "0.77 M&#9730;",
                diameter: "0.72 D&#9730;",
                temperature: "4,977 K",
                luminosity: "0.23 L&#9730;",
                distance: 42.4,
                position: { x: 1600, y: 1100, z: -1300 },
                color: 0xffcc66,
                glowColor: 0xffbb55,
                size: 8,
                glowSize: 2.4,
                planets: {
                    hd40307b: {
                        name: "HD 40307b",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "16,000 km",
                        distance: 12,
                        period: 4.3,
                        color: 0xaa8855,
                        size: 1.8
                    },
                    hd40307c: {
                        name: "HD 40307c",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "17,000 km",
                        distance: 20,
                        period: 9.6,
                        color: 0xbb9966,
                        size: 1.9
                    },
                    hd40307d: {
                        name: "HD 40307d",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "19,000 km",
                        distance: 30,
                        period: 20.5,
                        color: 0xccaa77,
                        size: 2.0
                    }
                }
            },
            kepler186: {
                name: "&#24320;&#26222;&#21202;186",
                type: "&#32418;&#30663;&#26143;",
                mass: "0.48 M&#9730;",
                diameter: "0.47 D&#9730;",
                temperature: "3,788 K",
                luminosity: "0.041 L&#9730;",
                distance: 500,
                position: { x: -2000, y: 1500, z: 1800 },
                color: 0xff5533,
                glowColor: 0xff4400,
                size: 6,
                glowSize: 2.0,
                planets: {
                    kepler186f: {
                        name: "&#24320;&#26222;&#21202;186f",
                        type: "&#23721;&#30707;&#34892;&#26143;",
                        diameter: "13,000 km",
                        distance: 35,
                        period: 130,
                        color: 0x44aa88,
                        size: 1.5
                    }
                }
            },
            kepler452: {
                name: "&#24320;&#26222;&#21202;452",
                type: "G&#22411;&#20027;&#24207;&#26143;",
                mass: "1.04 M&#9730;",
                diameter: "1.11 D&#9730;",
                temperature: "5,757 K",
                luminosity: "1.2 L&#9730;",
                distance: 1400,
                position: { x: 2200, y: -1800, z: 1600 },
                color: 0xffdd99,
                glowColor: 0xffcc66,
                size: 10,
                glowSize: 2.8,
                planets: {
                    kepler452b: {
                        name: "&#24320;&#26222;&#21202;452b",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "18,000 km",
                        distance: 50,
                        period: 385,
                        color: 0x55bb99,
                        size: 1.9
                    }
                }
            },
            kepler62: {
                name: "&#24320;&#26222;&#21202;62",
                type: "K&#22411;&#20027;&#24207;&#26143;",
                mass: "0.69 M&#9730;",
                diameter: "0.64 D&#9730;",
                temperature: "4,925 K",
                luminosity: "0.21 L&#9730;",
                distance: 990,
                position: { x: -1800, y: -2200, z: 1200 },
                color: 0xffbb66,
                glowColor: 0xffaa44,
                size: 7,
                glowSize: 2.2,
                planets: {
                    kepler62e: {
                        name: "&#24320;&#26222;&#21202;62e",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "17,000 km",
                        distance: 40,
                        period: 122,
                        color: 0x66aa88,
                        size: 1.8
                    },
                    kepler62f: {
                        name: "&#24320;&#26222;&#21202;62f",
                        type: "&#36229;&#32423;&#22320;&#29699;",
                        diameter: "16,000 km",
                        distance: 55,
                        period: 267,
                        color: 0x77bb99,
                        size: 1.7
                    }
                }
            },
            vega: {
                name: "&#32455;&#22899;&#26143;",
                type: "A&#22411;&#20027;&#24207;&#26143;",
                mass: "2.1 M&#9730;",
                diameter: "2.3 D&#9730;",
                temperature: "9,600 K",
                luminosity: "40 L&#9730;",
                distance: 25,
                position: { x: 2500, y: 1200, z: -800 },
                color: 0xbbeeff,
                glowColor: 0x88ccff,
                size: 15,
                glowSize: 3.2
            },
            arcturus: {
                name: "&#22823;&#35282;&#26143;",
                type: "K&#22411;&#24040;&#26143;",
                mass: "1.1 M&#9730;",
                diameter: "25 D&#9730;",
                temperature: "4,300 K",
                luminosity: "170 L&#9730;",
                distance: 37,
                position: { x: -2200, y: 1800, z: 1500 },
                color: 0xffaa66,
                glowColor: 0xff8844,
                size: 20,
                glowSize: 4.0
            },
            altair: {
                name: "&#29275;&#37070;&#26143;",
                type: "A&#22411;&#20027;&#24207;&#26143;",
                mass: "1.8 M&#9730;",
                diameter: "1.8 D&#9730;",
                temperature: "7,700 K",
                luminosity: "11 L&#9730;",
                distance: 17,
                position: { x: 1800, y: -1600, z: 900 },
                color: 0xeeeeff,
                glowColor: 0xccddff,
                size: 13,
                glowSize: 2.8
            },
            betelgeuse: {
                name: "&#21442;&#23487;&#22235;",
                type: "M&#22411;&#36229;&#24040;&#26143;",
                mass: "11 M&#9730;",
                diameter: "1,000 D&#9730;",
                temperature: "3,500 K",
                luminosity: "126,000 L&#9730;",
                distance: 640,
                position: { x: -3000, y: 2500, z: 2000 },
                color: 0xff4422,
                glowColor: 0xff2200,
                size: 30,
                glowSize: 6.0
            },
            rigel: {
                name: "&#21442;&#23487;&#19971;",
                type: "B&#22411;&#36229;&#24040;&#26143;",
                mass: "21 M&#9730;",
                diameter: "78 D&#9730;",
                temperature: "12,100 K",
                luminosity: "120,000 L&#9730;",
                distance: 860,
                position: { x: 2800, y: -2200, z: 1800 },
                color: 0xbbeeff,
                glowColor: 0x88ccff,
                size: 25,
                glowSize: 5.0
            },
            // 新增的5个星系
            pollux: {
                name: "&#21271;&#27827;&#19977;",
                type: "K&#22411;&#24040;&#26143;",
                mass: "1.9 M&#9730;",
                diameter: "8.8 D&#9730;",
                temperature: "4,666 K",
                luminosity: "32 L&#9730;",
                distance: 33.7,
                position: { x: 1000, y: 500, z: -800 },
                color: 0xffaa66,
                glowColor: 0xff8844,
                size: 12,
                glowSize: 2.5
            },
            procyon: {
                name: "&#21335;&#27827;&#19977;",
                type: "F&#22411;&#20027;&#24207;&#26143;",
                mass: "1.5 M&#9730;",
                diameter: "2.0 D&#9730;",
                temperature: "6,530 K",
                luminosity: "6.9 L&#9730;",
                distance: 11.4,
                position: { x: -1200, y: 300, z: 600 },
                color: 0xffffcc,
                glowColor: 0xffff99,
                size: 9,
                glowSize: 2.2
            },
            aldebaran: {
                name: "&#27605;&#23487;&#20116;",
                type: "K&#22411;&#24040;&#26143;",
                mass: "1.2 M&#9730;",
                diameter: "44 D&#9730;",
                temperature: "3,910 K",
                luminosity: "439 L&#9730;",
                distance: 65.3,
                position: { x: 1500, y: -900, z: -1200 },
                color: 0xff6633,
                glowColor: 0xff5522,
                size: 18,
                glowSize: 3.5
            },
            spica: {
                name: "&#35282;&#23487;&#19968;",
                type: "B&#22411;&#20027;&#24207;&#26143;",
                mass: "11.4 M&#9730;",
                diameter: "7.4 D&#9730;",
                temperature: "22,400 K",
                luminosity: "20,500 L&#9730;",
                distance: 250,
                position: { x: -2000, y: 1800, z: -1500 },
                color: 0xbbeeff,
                glowColor: 0x88ccff,
                size: 14,
                glowSize: 3.0
            },
            antares: {
                name: "&#24515;&#23487;&#20108;",
                type: "M&#22411;&#36229;&#24040;&#26143;",
                mass: "12 M&#9730;",
                diameter: "680 D&#9730;",
                temperature: "3,600 K",
                luminosity: "75,900 L&#9730;",
                distance: 550,
                position: { x: 2500, y: -2000, z: 1800 },
                color: 0xff4422,
                glowColor: 0xff2200,
                size: 28,
                glowSize: 5.5
            }
        };
        
        // 初始化Three.js场景
        function initThreeJS() {
            try {
                // 创建场景
                scene = new THREE.Scene();
                
                // 创建相机
                camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100000);
                camera.position.set(0, 500, 1500);
                
                // 创建渲染器
                renderer = new THREE.WebGLRenderer({
                    canvas: document.getElementById('canvas'),
                    antialias: true,
                    alpha: true
                });
                renderer.setSize(window.innerWidth, window.innerHeight);
                renderer.setPixelRatio(window.devicePixelRatio);
                
                // 添加轨道控制
                controls = new THREE.OrbitControls(camera, renderer.domElement);
                controls.enableDamping = true;
                controls.dampingFactor = 0.05;
                controls.screenSpacePanning = false;
                controls.minDistance = 50;
                controls.maxDistance = 10000;
                
                // 创建星空背景
                createStarBackground();
                
                // 创建恒星系统
                createStarSystems();
                
                // 添加环境光
                const ambientLight = new THREE.AmbientLight(0x333333);
                scene.add(ambientLight);
                
                // 监听窗口大小变化
                window.addEventListener('resize', onWindowResize);
                
                // 监听键盘事件
                window.addEventListener('keydown', onKeyDown);
                
                return true;
            } catch (error) {
                console.error("初始化Three.js失败:", error);
                document.getElementById('loading').innerHTML = "<div style='color: #ff6666;'>初始化失败: " + error.message + "</div>" +
                    "<div style='margin-top: 20px; font-size: 14px;'>请检查浏览器控制台获取更多信息</div>";
                return false;
            }
        }
        
        // 创建星空背景
        function createStarBackground() {
            const starGeometry = new THREE.BufferGeometry();
            const starCount = 5000;
            
            const positionArray = new Float32Array(starCount * 3);
            const colorArray = new Float32Array(starCount * 3);
            
            for (let i = 0; i < starCount; i++) {
                const i3 = i * 3;
                const radius = 3000 + Math.random() * 5000;
                const theta = Math.random() * Math.PI * 2;
                const phi = Math.acos((Math.random() * 2) - 1);
                
                positionArray[i3] = radius * Math.sin(phi) * Math.cos(theta);
                positionArray[i3 + 1] = radius * Math.sin(phi) * Math.sin(theta);
                positionArray[i3 + 2] = radius * Math.cos(phi);
                
                const colorVal = 0.7 + Math.random() * 0.3;
                colorArray[i3] = colorVal;
                colorArray[i3 + 1] = colorVal;
                colorArray[i3 + 2] = colorVal + Math.random() * 0.2;
            }
            
            starGeometry.setAttribute('position', new THREE.BufferAttribute(positionArray, 3));
            starGeometry.setAttribute('color', new THREE.BufferAttribute(colorArray, 3));
            
            const starMaterial = new THREE.PointsMaterial({
                color: 0xffffff,
                size: 1.8,
                sizeAttenuation: true,
                vertexColors: true
            });
            
            const stars = new THREE.Points(starGeometry, starMaterial);
            scene.add(stars);
        }
        
        // 创建恒星系统
        function createStarSystems() {
            Object.keys(starData).forEach(function(key) {
                const data = starData[key];
                
                // 创建恒星
                createStar(key, data);
                
                // 创建行星
                if (data.planets) {
                    Object.keys(data.planets).forEach(function(planetKey) {
                        createPlanet(key, planetKey, data.planets[planetKey]);
                    });
                }
                
                // 创建小行星带
                if (data.asteroidBelt) {
                    createAsteroidBelt(key, data.asteroidBelt);
                }
                
                // 创建距离标签
                createDistanceLabel(key, data);
            });
        }
        
        // 创建恒星
        function createStar(key, data) {
            // 创建恒星几何体
            const geometry = new THREE.SphereGeometry(data.size * config.objectSize, 32, 32);
            const material = new THREE.MeshPhongMaterial({
                color: data.color,
                emissive: data.color,
                emissiveIntensity: 0.6,
                shininess: 100
            });
            
            // 创建恒星网格
            const mesh = new THREE.Mesh(geometry, material);
            mesh.position.set(data.position.x, data.position.y, data.position.z);
            mesh.userData = { type: 'star', id: key };
            scene.add(mesh);
            
            // 存储引用
            starMeshes[key] = mesh;
            
            // 创建光晕效果 - 类似参考代码中的太阳光晕
            createAdvancedStarGlow(mesh, data);
            
            // 创建轨道
            createOrbit(key, data);
            
            // 创建标签
            createLabel(key, data);
            
            // 为恒星添加点光源
            const light = new THREE.PointLight(data.glowColor || data.color, 1, 1000);
            light.position.set(data.position.x, data.position.y, data.position.z);
            scene.add(light);
        }
        
        // 创建高级恒星光晕效果(类似参考代码中的太阳光晕)
        function createAdvancedStarGlow(starMesh, data) {
            // 创建多层光晕效果
            const glowLayers = [
                { size: 1.5, opacity: 0.6, color: data.glowColor || data.color },
                { size: 2.0, opacity: 0.4, color: data.glowColor || data.color },
                { size: 2.5, opacity: 0.2, color: data.glowColor || data.color }
            ];
            
            glowLayers.forEach(layer => {
                const glowMaterial = new THREE.MeshBasicMaterial({
                    color: layer.color,
                    transparent: true,
                    opacity: layer.opacity,
                    blending: THREE.AdditiveBlending
                });
                
                const glowGeometry = new THREE.SphereGeometry(
                    data.size * config.objectSize * layer.size, 
                    32, 
                    32
                );
                
                const glow = new THREE.Mesh(glowGeometry, glowMaterial);
                glow.position.set(0, 0, 0);
                glow.userData = { type: 'glow' };
                starMesh.add(glow);
            });
            
            // 添加粒子光晕效果
            createParticleGlow(starMesh, data);
        }
        
        // 创建粒子光晕效果
        function createParticleGlow(starMesh, data) {
            const particleCount = 100;
            const particles = new THREE.BufferGeometry();
            const positions = new Float32Array(particleCount * 3);
            const colors = new Float32Array(particleCount * 3);
            
            const color = new THREE.Color(data.glowColor || data.color);
            
            for (let i = 0; i < particleCount; i++) {
                const i3 = i * 3;
                
                // 随机位置(球体表面)
                const radius = data.size * config.objectSize * (1.5 + Math.random() * 1.5);
                const theta = Math.random() * Math.PI * 2;
                const phi = Math.acos((Math.random() * 2) - 1);
                
                positions[i3] = radius * Math.sin(phi) * Math.cos(theta);
                positions[i3 + 1] = radius * Math.sin(phi) * Math.sin(theta);
                positions[i3 + 2] = radius * Math.cos(phi);
                
                // 随机颜色变化
                colors[i3] = color.r + (Math.random() * 0.2 - 0.1);
                colors[i3 + 1] = color.g + (Math.random() * 0.2 - 0.1);
                colors[i3 + 2] = color.b + (Math.random() * 0.2 - 0.1);
            }
            
            particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));
            particles.setAttribute('color', new THREE.BufferAttribute(colors, 3));
            
            const particleMaterial = new THREE.PointsMaterial({
                size: 2,
                sizeAttenuation: true,
                vertexColors: true,
                transparent: true,
                opacity: 0.6,
                blending: THREE.AdditiveBlending
            });
            
            const particleSystem = new THREE.Points(particles, particleMaterial);
            starMesh.add(particleSystem);
        }
        
        // 创建行星
        function createPlanet(starKey, planetKey, data) {
            const currentStarData = starData[starKey];
            
            // 创建行星几何体
            const geometry = new THREE.SphereGeometry(data.size, 24, 24);
            const material = new THREE.MeshPhongMaterial({
                color: data.color,
                shininess: 30
            });
            
            // 创建行星网格
            const mesh = new THREE.Mesh(geometry, material);
            mesh.position.set(
                currentStarData.position.x + data.distance,
                currentStarData.position.y,
                currentStarData.position.z
            );
            mesh.userData = { type: 'planet', id: planetKey, star: starKey };
            scene.add(mesh);
            
            // 存储引用
            planets[starKey + '_' + planetKey] = mesh;
            
            // 创建行星轨道
            createPlanetOrbit(starKey, planetKey, data);
            
            // 如果有行星环,创建环
            if (data.rings) {
                const ringGeometry = new THREE.RingGeometry(data.rings.innerRadius, data.rings.outerRadius, 32);
                const ringMaterial = new THREE.MeshBasicMaterial({
                    color: data.rings.color,
                    side: THREE.DoubleSide,
                    transparent: true,
                    opacity: 0.7
                });
                const ring = new THREE.Mesh(ringGeometry, ringMaterial);
                ring.rotation.x = Math.PI / 2;
                mesh.add(ring);
            }
        }
        
        // 创建小行星带
        function createAsteroidBelt(starKey, data) {
            const currentStarData = starData[starKey];
            const asteroidGroup = new THREE.Group();
            asteroidGroup.position.set(currentStarData.position.x, currentStarData.position.y, currentStarData.position.z);
            scene.add(asteroidGroup);
            
            // 创建少量小行星
            for (let i = 0; i < data.count/4; i++) {
                const angle = Math.random() * Math.PI * 2;
                const distance = data.innerRadius + Math.random() * (data.outerRadius - data.innerRadius);
                const height = (Math.random() - 0.5) * 5;
                const size = 0.2 + Math.random() * 0.8;
                
                const geometry = new THREE.SphereGeometry(size, 8, 8);
                const material = new THREE.MeshPhongMaterial({
                    color: data.color,
                    shininess: 10
                });
                
                const asteroid = new THREE.Mesh(geometry, material);
                asteroid.position.set(
                    Math.cos(angle) * distance,
                    height,
                    Math.sin(angle) * distance
                );
                asteroidGroup.add(asteroid);
            }
            
            // 存储引用
            asteroidBelts[starKey] = asteroidGroup;
        }
        
        // 创建轨道
        function createOrbit(key, data) {
            // 计算轨道半径
            const radius = Math.sqrt(
                data.position.x * data.position.x +
                data.position.y * data.position.y +
                data.position.z * data.position.z
            );
            
            if (radius > 0) {
                // 创建轨道几何体
                const orbitGeometry = new THREE.RingGeometry(radius - 0.5, radius + 0.5, 64);
                const orbitMaterial = new THREE.MeshBasicMaterial({
                    color: 0x3366cc,
                    side: THREE.DoubleSide,
                    transparent: true,
                    opacity: 0.2
                });
                
                // 创建轨道网格
                const orbit = new THREE.Mesh(orbitGeometry, orbitMaterial);
                orbit.rotation.x = Math.PI / 2;
                scene.add(orbit);
                
                // 存储引用
                orbits[key] = orbit;
            }
        }
        
        // 创建行星轨道
        function createPlanetOrbit(starKey, planetKey, data) {
            const currentStarData = starData[starKey];
            
            // 创建轨道几何体
            const orbitGeometry = new THREE.RingGeometry(data.distance - 0.2, data.distance + 0.2, 64);
            const orbitMaterial = new THREE.MeshBasicMaterial({
                color: 0x4488ff,
                side: THREE.DoubleSide,
                transparent: true,
                opacity: 0.1
            });
            
            // 创建轨道网格
            const orbit = new THREE.Mesh(orbitGeometry, orbitMaterial);
            orbit.rotation.x = Math.PI / 2;
            orbit.position.set(currentStarData.position.x, currentStarData.position.y, currentStarData.position.z);
            scene.add(orbit);
            
            // 存储引用
            orbits[starKey + '_' + planetKey] = orbit;
        }
        
        // 创建标签
        function createLabel(key, data) {
            // 创建画布
            const canvas = document.createElement('canvas');
            const context = canvas.getContext('2d');
            canvas.width = 200;
            canvas.height = 50;
            
            // 绘制标签背景
            context.fillStyle = 'rgba(0, 20, 40, 0.8)';
            context.fillRect(0, 0, canvas.width, canvas.height);
            
            // 解码HTML实体
            const decodedName = decodeHTML(data.name);
            
            // 绘制文字
            context.font = 'bold 20px Arial, Microsoft YaHei, sans-serif';
            context.fillStyle = '#aaffff';
            context.textAlign = 'center';
            context.fillText(decodedName, canvas.width / 2, canvas.height / 2 + 6);
            
            // 创建纹理
            const texture = new THREE.CanvasTexture(canvas);
            
            // 创建精灵材质
            const material = new THREE.SpriteMaterial({
                map: texture,
                transparent: true
            });
            
            // 创建精灵
            const sprite = new THREE.Sprite(material);
            sprite.position.set(
                data.position.x,
                data.position.y + data.size * config.objectSize + 5,
                data.position.z
            );
            sprite.scale.set(16, 4, 1);
            sprite.userData = { type: 'label', id: key };
            scene.add(sprite);
            
            // 存储引用
            labels[key] = sprite;
        }
        
        // 创建距离标签
        function createDistanceLabel(key, data) {
            // 创建画布
            const canvas = document.createElement('canvas');
            const context = canvas.getContext('2d');
            canvas.width = 120;
            canvas.height = 30;
            
            // 绘制标签背景
            context.fillStyle = 'rgba(0, 20, 40, 0.6)';
            context.fillRect(0, 0, canvas.width, canvas.height);
            
            // 绘制文字
            context.font = '14px Arial, Microsoft YaHei, sans-serif';
            context.fillStyle = '#88ddff';
            context.textAlign = 'center';
            context.fillText(data.distance + ' 光年', canvas.width / 2, canvas.height / 2 + 4);
            
            // 创建纹理
            const texture = new THREE.CanvasTexture(canvas);
            
            // 创建精灵材质
            const material = new THREE.SpriteMaterial({
                map: texture,
                transparent: true
            });
            
            // 创建精灵
            const sprite = new THREE.Sprite(material);
            sprite.position.set(
                data.position.x,
                data.position.y - data.size * config.objectSize - 8,
                data.position.z
            );
            sprite.scale.set(12, 3, 1);
            sprite.userData = { type: 'distanceLabel', id: key };
            sprite.visible = config.showDistanceLabels;
            scene.add(sprite);
            
            // 存储引用
            distanceLabels[key] = sprite;
        }
        
        // 动画循环
        function animate() {
            requestAnimationFrame(animate);
            
            // 更新控制
            controls.update();
            
            // 旋转恒星和行星
            Object.keys(starMeshes).forEach(function(key) {
                starMeshes[key].rotation.y += 0.001 * config.simulationSpeed;
            });
            
            Object.keys(planets).forEach(function(key) {
                const parts = key.split('_');
                const starKey = parts[0];
                const planetKey = parts[1];
                const currentStarData = starData[starKey];
                const planetData = currentStarData.planets[planetKey];
                
                // 更新行星位置(绕恒星公转)
                const time = Date.now() * 0.001 * config.simulationSpeed;
                const angle = (time / planetData.period) * Math.PI * 2;
                planets[key].position.set(
                    currentStarData.position.x + Math.cos(angle) * planetData.distance,
                    currentStarData.position.y,
                    currentStarData.position.z + Math.sin(angle) * planetData.distance
                );
                
                // 行星自转
                planets[key].rotation.y += 0.02 * config.simulationSpeed;
            });
            
            // 旋转小行星带
            Object.keys(asteroidBelts).forEach(function(key) {
                asteroidBelts[key].rotation.y += 0.0005 * config.simulationSpeed;
            });
            
            // 隐藏加载界面
            if (!loadingComplete) {
                loadingComplete = true;
                document.getElementById('loading').style.display = 'none';
            }
            
            // 渲染场景
            renderer.render(scene, camera);
        }
        
        // 窗口大小变化处理
        function onWindowResize() {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        }
        
        // 键盘事件处理
        function onKeyDown(event) {
            const moveSpeed = 50;
            switch(event.key) {
                case 'w':
                case 'W':
                    camera.position.z -= moveSpeed;
                    break;
                case 's':
                case 'S':
                    camera.position.z += moveSpeed;
                    break;
                case 'a':
                case 'A':
                    camera.position.x -= moveSpeed;
                    break;
                case 'd':
                case 'D':
                    camera.position.x += moveSpeed;
                    break;
                case 'q':
                case 'Q':
                    camera.position.y -= moveSpeed;
                    break;
                case 'e':
                case 'E':
                    camera.position.y += moveSpeed;
                    break;
            }
        }
        
        // 更新天体信息显示
        function updateObjectInfo(key, type) {
            let data, infoHtml;
            if (type === 'star') {
                data = starData[key];
                const decodedName = decodeHTML(data.name);
                const decodedType = decodeHTML(data.type);
                const decodedMass = decodeHTML(data.mass);
                const decodedDiameter = decodeHTML(data.diameter);
                const decodedTemperature = decodeHTML(data.temperature);
                const decodedLuminosity = decodeHTML(data.luminosity);
                
                infoHtml = `
                    <strong>&#31867;&#22411;:</strong> ${decodedType}<br>
                    <strong>&#36136;&#37327;:</strong> ${decodedMass}<br>
                    <strong>&#30452;&#24452;:</strong> ${decodedDiameter}<br>
                    <strong>&#28201;&#24230;:</strong> ${decodedTemperature}<br>
                    <strong>&#20809;&#24230;:</strong> ${decodedLuminosity}<br>
                    <strong>&#36317;&#31163;:</strong> ${data.distance} &#20809;&#24180;<br>
                    <strong>&#20301;&#32622;:</strong> ${Math.round(data.position.x)}, ${Math.round(data.position.y)}, ${Math.round(data.position.z)}
                `;
                
                // 添加行星列表
                if (data.planets) {
                    infoHtml += `<div class="star-info"><strong>&#34892;&#26143;&#31995;&#32479;:</strong><div class="planet-list">`;
                    Object.keys(data.planets).forEach(function(planetKey) {
                        const planetName = decodeHTML(data.planets[planetKey].name);
                        infoHtml += `<div class="planet-item" data-star="${key}" data-planet="${planetKey}">${planetName}</div>`;
                    });
                    infoHtml += `</div></div>`;
                }
                
                document.getElementById('selected-object').textContent = decodedName;
            } else if (type === 'planet') {
                const parts = key.split('_');
                const starKey = parts[0];
                const planetKey = parts[1];
                data = starData[starKey].planets[planetKey];
                const starName = decodeHTML(starData[starKey].name);
                const planetName = decodeHTML(data.name);
                const planetType = decodeHTML(data.type);
                const planetDiameter = decodeHTML(data.diameter);
                
                infoHtml = `
                    <strong>&#31867;&#22411;:</strong> ${planetType}<br>
                    <strong>&#30452;&#24452;:</strong> ${planetDiameter}<br>
                    <strong>&#36712;&#36947;&#21322;&#24452;:</strong> ${data.distance} &#21333;&#20301;<br>
                    <strong>&#20844;&#36716;&#21608;&#26399;:</strong> ${data.period} &#22825;<br>
                    <strong>&#25152;&#23646;&#24658;&#26143;:</strong> ${starName}
                `;
                
                document.getElementById('selected-object').textContent = planetName;
            }
            
            document.getElementById('object-info').innerHTML = infoHtml;
            
            // 添加行星点击事件
            document.querySelectorAll('.planet-item').forEach(function(item) {
                item.addEventListener('click', function() {
                    const starKey = item.getAttribute('data-star');
                    const planetKey = item.getAttribute('data-planet');
                    focusOnPlanet(starKey, planetKey);
                });
            });
        }
        
        // 聚焦到行星
        function focusOnPlanet(starKey, planetKey) {
            const currentStarData = starData[starKey];
            const planetData = currentStarData.planets[planetKey];
            
            controls.target.set(
                currentStarData.position.x + planetData.distance,
                currentStarData.position.y,
                currentStarData.position.z
            );
            
            camera.position.set(
                currentStarData.position.x + planetData.distance,
                currentStarData.position.y,
                currentStarData.position.z + 15
            );
            
            updateObjectInfo(starKey + '_' + planetKey, 'planet');
        }
        
        // 设置事件监听器
        function setupEventListeners() {
            // 缩放控制
            document.getElementById('zoom').addEventListener('input', function(e) {
                config.zoomLevel = parseFloat(e.target.value);
                document.getElementById('zoom-value').textContent = config.zoomLevel.toFixed(1);
                camera.zoom = config.zoomLevel;
                camera.updateProjectionMatrix();
            });
            
            // 速度控制
            document.getElementById('speed').addEventListener('input', function(e) {
                config.simulationSpeed = parseFloat(e.target.value);
                document.getElementById('speed-value').textContent = config.simulationSpeed.toFixed(1);
            });
            
            // 大小控制
            document.getElementById('size').addEventListener('input', function(e) {
                config.objectSize = parseFloat(e.target.value);
                document.getElementById('size-value').textContent = config.objectSize.toFixed(1);
                
                // 更新所有天体大小
                Object.keys(starMeshes).forEach(function(key) {
                    const data = starData[key];
                    starMeshes[key].scale.setScalar(config.objectSize);
                    
                    // 更新标签位置
                    if (labels[key]) {
                        labels[key].position.set(
                            data.position.x,
                            data.position.y + data.size * config.objectSize + 5,
                            data.position.z
                        );
                    }
                    
                    // 更新距离标签位置
                    if (distanceLabels[key]) {
                        distanceLabels[key].position.set(
                            data.position.x,
                            data.position.y - data.size * config.objectSize - 8,
                            data.position.z
                        );
                    }
                });
            });
            
            // 切换名称显示
            document.getElementById('toggle-names').addEventListener('click', function() {
                config.showNames = !config.showNames;
                Object.keys(labels).forEach(function(key) {
                    labels[key].visible = config.showNames;
                });
                this.innerHTML = config.showNames ? '&#38544;&#34255;&#21517;&#31216;' : '&#26174;&#31034;&#21517;&#31216;';
            });
            
            // 切换轨道显示
            document.getElementById('toggle-orbits').addEventListener('click', function() {
                config.showOrbits = !config.showOrbits;
                Object.keys(orbits).forEach(function(key) {
                    orbits[key].visible = config.showOrbits;
                });
                this.innerHTML = config.showOrbits ? '&#38544;&#34255;&#36712;&#36947;' : '&#26174;&#31034;&#36712;&#36947;';
            });
            
            // 切换距离标签显示
            document.getElementById('toggle-labels').addEventListener('click', function() {
                config.showDistanceLabels = !config.showDistanceLabels;
                Object.keys(distanceLabels).forEach(function(key) {
                    distanceLabels[key].visible = config.showDistanceLabels;
                });
                this.innerHTML = config.showDistanceLabels ? '&#38544;&#34255;&#36317;&#31163;' : '&#26174;&#31034;&#36317;&#31163;';
            });
            
            // 切换小行星带显示
            document.getElementById('toggle-asteroids').addEventListener('click', function() {
                config.showAsteroids = !config.showAsteroids;
                Object.keys(asteroidBelts).forEach(function(key) {
                    asteroidBelts[key].visible = config.showAsteroids;
                });
                this.innerHTML = config.showAsteroids ? '&#38544;&#34255;&#23567;&#34892;&#26143;' : '&#26174;&#31034;&#23567;&#34892;&#26143;';
            });
            
            // 重置视图
            document.getElementById('reset-view').addEventListener('click', function() {
                controls.reset();
                camera.position.set(0, 500, 1500);
                config.zoomLevel = 1.0;
                document.getElementById('zoom').value = config.zoomLevel;
                document.getElementById('zoom-value').textContent = config.zoomLevel.toFixed(1);
                camera.zoom = config.zoomLevel;
                camera.updateProjectionMatrix();
                
                // 修复:使用解码后的文本而不是HTML实体
                document.getElementById('selected-object').textContent = decodeHTML(DEFAULT_SELECTED_OBJECT_TEXT);
                document.getElementById('object-info').textContent = decodeHTML(DEFAULT_OBJECT_INFO_TEXT);
            });
            
            // 为所有恒星系统按钮添加点击事件
            document.querySelectorAll('.star-system-btn').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    const starKey = this.getAttribute('data-star');
                    focusOnStar(starKey);
                });
            });
            
            // 搜索功能
            document.getElementById('search-system').addEventListener('input', function(e) {
                const searchTerm = e.target.value.toLowerCase();
                document.querySelectorAll('.star-system-btn').forEach(function(btn) {
                    const btnText = decodeHTML(btn.textContent).toLowerCase();
                    if (btnText.includes(searchTerm)) {
                        btn.style.display = 'block';
                    } else {
                        btn.style.display = 'none';
                    }
                });
            });
            
            // 分类标签
            document.querySelectorAll('.tab-btn').forEach(function(tab) {
                tab.addEventListener('click', function() {
                    // 移除所有active类
                    document.querySelectorAll('.tab-btn').forEach(function(t) {
                        t.classList.remove('active');
                    });
                    
                    // 添加active类到当前标签
                    this.classList.add('active');
                    
                    const category = this.getAttribute('data-category');
                    
                    // 根据分类显示/隐藏恒星系统
                    document.querySelectorAll('.star-system-btn').forEach(function(btn) {
                        const starKey = btn.getAttribute('data-star');
                        const star = starData[starKey];
                        if (category === 'all') {
                            btn.style.display = 'block';
                        } else if (category === 'nearby' && star.distance <= 20) {
                            btn.style.display = 'block';
                        } else if (category === 'habitable' && star.planets) {
                            btn.style.display = 'block';
                        } else {
                            btn.style.display = 'none';
                        }
                    });
                });
            });
            
            // 点击选择天体
            renderer.domElement.addEventListener('click', function(event) {
                const mouse = new THREE.Vector2();
                const rect = renderer.domElement.getBoundingClientRect();
                
                mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
                mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
                
                const raycaster = new THREE.Raycaster();
                raycaster.setFromCamera(mouse, camera);
                
                const intersects = raycaster.intersectObjects(scene.children, true);
                
                if (intersects.length > 0) {
                    const object = intersects[0].object;
                    if (object.userData) {
                        if (object.userData.type === 'star') {
                            updateObjectInfo(object.userData.id, 'star');
                        } else if (object.userData.type === 'planet') {
                            updateObjectInfo(object.userData.star + '_' + object.userData.id, 'planet');
                        }
                    }
                }
            });
            
            // 双击聚焦天体
            renderer.domElement.addEventListener('dblclick', function(event) {
                const mouse = new THREE.Vector2();
                const rect = renderer.domElement.getBoundingClientRect();
                
                mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
                mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
                
                const raycaster = new THREE.Raycaster();
                raycaster.setFromCamera(mouse, camera);
                
                const intersects = raycaster.intersectObjects(scene.children, true);
                
                if (intersects.length > 0) {
                    const object = intersects[0].object;
                    if (object.userData) {
                        if (object.userData.type === 'star') {
                            focusOnStar(object.userData.id);
                        } else if (object.userData.type === 'planet') {
                            focusOnPlanet(object.userData.star, object.userData.id);
                        }
                    }
                }
            });
            
            // 控制面板折叠功能
            document.querySelector('.toggle-controls').addEventListener('click', function() {
                const controls = document.getElementById('controls');
                controls.classList.toggle('collapsed');
                
                if (controls.classList.contains('collapsed')) {
                    this.innerHTML = '&#9654;';
                    this.title = "&#23637;&#24320;&#25511;&#21046;&#26495;";
                } else {
                    this.innerHTML = '&#9660;';
                    this.title = "&#25240;&#21472;&#25511;&#21046;&#26495;";
                }
            });
        }
        
        // 聚焦到恒星
        function focusOnStar(starKey) {
            const data = starData[starKey];
            
            controls.target.set(data.position.x, data.position.y, data.position.z);
            
            camera.position.set(
                data.position.x,
                data.position.y,
                data.position.z + 30
            );
            
            updateObjectInfo(starKey, 'star');
        }
        
        // 模拟加载进度
        function simulateLoading() {
            let progress = 0;
            const interval = setInterval(function() {
                progress += Math.random() * 10;
                if (progress >= 100) {
                    progress = 100;
                    clearInterval(interval);
                    
                    // 初始化Three.js
                    if (initThreeJS()) {
                        // 设置事件监听器
                        setupEventListeners();
                        
                        // 开始动画
                        animate();
                    }
                }
                
                // 确保进度条元素存在
                const progressBar = document.getElementById('progress');
                if (progressBar) {
                    progressBar.style.width = progress + '%';
                }
            }, 100);
        }
        
        // 启动应用
        window.addEventListener('load', function() {
            // 模拟加载进度
            simulateLoading();
        });
    </script>
</body>

</html>
        
编辑器加载中
预览
控制台