3D词云图

发布于:2025-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

一:球体词云图

1.效果展示

在这里插入图片描述

2.HTML完整代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <title>3D球体词云图</title>
    <style>
        html,
        body {
            height: 100%;
            margin: 0;
            overflow: hidden;
        }

        body {
            font-family: Helvetica, sans-serif;
            position: relative;
            margin: 0;
            overflow: hidden;
            background-color: #000000;
        }

        body::before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: #000000;
        }

        #container {
            width: 100%;
            height: 100%;
        }

        .word {
            width: auto;
            height: auto;
            text-align: center;
            cursor: default;
            font-size: 24px;
            font-weight: bold;
            padding: 10px;
            box-sizing: border-box;
            display: flex;
            flex-direction: column;
            justify-content: center;
            transition: all 0.5s ease;
        }
    </style>
</head>
<body>
<div id="container"></div>
<script src="js/three.min.js"></script>
<script src="js/tween.min.js"></script>
<script src="js/TrackballControls.js"></script>
<script src="js/CSS3DRenderer.js"></script>
<script>
    var words = [
        "仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
        "能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
        "生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
        "科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
        "工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
        "仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
        "团队协作", "未来导向", "持续优化", "精准设计", "动态调整", "知识传承", "智能机器人", "历史传承", "水陆一体化",
        "自主维护", "低维护成本", "自然保护区", "应急救援", "智能部署", "环境治理", "生态监测", "驱动模块", "摄像头模块"
    ];

    var camera, scene, renderer;
    var controls;
    var objects = [];
    var targets = { sphere: [] };

    function createSphereLayout(objectsCount) {
        var vector = new THREE.Vector3();
        var targets = [];

        for (var i = 0; i < objectsCount; i++) {
            var phi = Math.acos(-1 + (2 * i) / objectsCount);
            var theta = Math.sqrt(objectsCount * Math.PI) * phi;
            var object = new THREE.Object3D();

            object.position.x = 800 * Math.cos(theta) * Math.sin(phi);
            object.position.y = 800 * Math.sin(theta) * Math.sin(phi);
            object.position.z = 800 * Math.cos(phi);

            vector.copy(object.position).multiplyScalar(2);
            object.lookAt(vector);

            targets.push(object);
        }

        return targets;
    }

    function getRandomColor() {
        const letters = '0123456789ABCDEF';
        let color = '#';
        for (let i = 0; i < 6; i++) {
            color += letters[Math.floor(Math.random() * 16)];
        }
        return color;
    }

    init();
    animate();

    function init() {
        camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
        camera.position.z = 3000;
        scene = new THREE.Scene();
        var vector = new THREE.Vector3();

        for (var i = 0; i < words.length; i++) {
            var element = document.createElement('div');
            element.className = 'word';
            element.style.color = getRandomColor();
            element.textContent = words[i];

            element.style.backgroundColor = 'rgba(0, 0, 0, 0.1)';
            element.style.textShadow = '0 0 10px ' + getRandomColor();

            var object = new THREE.CSS3DObject(element);
            var radius = 2000;
            var theta = Math.random() * Math.PI * 2;
            var phi = Math.acos(2 * Math.random() - 1);
            object.position.x = radius * Math.sin(phi) * Math.cos(theta);
            object.position.y = radius * Math.sin(phi) * Math.sin(theta);
            object.position.z = radius * Math.cos(phi);
            object.rotation.x = Math.random() * Math.PI * 2;
            object.rotation.y = Math.random() * Math.PI * 2;
            object.rotation.z = Math.random() * Math.PI * 2;

            vector.copy(object.position).multiplyScalar(2);
            object.lookAt(vector);

            scene.add(object);
            objects.push(object);
        }

        targets.sphere = createSphereLayout(objects.length);
        transform(targets.sphere, 5000);

        renderer = new THREE.CSS3DRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.domElement.style.position = 'absolute';
        document.getElementById('container').appendChild(renderer.domElement);

        controls = new THREE.TrackballControls(camera, renderer.domElement);
        controls.rotateSpeed = 0.5;
        controls.minDistance = 500;
        controls.maxDistance = 6000;
        controls.addEventListener('change', render);

        window.addEventListener('resize', onWindowResize, false);
    }

    function transform(targets, duration) {
        TWEEN.removeAll();
        for (var i = 0; i < objects.length; i++) {
            var object = objects[i];
            var target = targets[i];

            new TWEEN.Tween(object.position)
                .to({
                    x: target.position.x,
                    y: target.position.y,
                    z: target.position.z
                }, duration)
                .easing(TWEEN.Easing.Quadratic.InOut)
                .start();

            new TWEEN.Tween(object.rotation)
                .to({
                    x: target.rotation.x,
                    y: target.rotation.y,
                    z: target.rotation.z
                }, duration)
                .easing(TWEEN.Easing.Quadratic.InOut)
                .start();
        }

        new TWEEN.Tween(this)
            .to({}, duration * 1.5)
            .onUpdate(render)
            .start();
    }

    function onWindowResize() {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
        render();
    }

    function animate() {
        requestAnimationFrame(animate);
        TWEEN.update();
        controls.update();

        objects.forEach(function (object) {
            var distance = camera.position.distanceTo(object.position);
            var element = object.element;
            var fontSize = Math.max(12, 72 - distance / 100);
            element.style.fontSize = fontSize + 'px';
        });
    }

    function render() {
        renderer.render(scene, camera);
    }
</script>
</body>
</html>

二:螺旋管道词云图

1.效果展示

在这里插入图片描述

2.HTML完整代码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
	<title>螺旋管道词云图</title>
	<style>
		html,
		body {
			height: 100%;
			margin: 0;
			overflow: hidden;
		}

		body {
			background-color: #000000;
			font-family: Helvetica, sans-serif;
		}

		#info {
			position: absolute;
			width: 100%;
			color: #ffffff;
			padding: 5px;
			font-family: Monospace;
			font-size: 13px;
			font-weight: bold;
			text-align: center;
			z-index: 1;
		}

		.element {
			width: 120px;
			height: 160px;
			text-align: center;
			cursor: default;
			display: flex;
			flex-direction: column;
			justify-content: center;
			padding: 10px;
			box-sizing: border-box;
		}

		.element .symbol {
			font-size: 20px;
			font-weight: bold;
			margin-bottom: 5px;
			word-break: break-word;
		}

		.element .details {
			font-size: 12px;
			word-break: break-word;
		}
	</style>
</head>

<body>
	<script src="js/three.min.js"></script>
	<script src="js/tween.min.js"></script>
	<script src="js/TrackballControls.js"></script>
	<script src="js/CSS3DRenderer.js"></script>
	<div id="container"></div>
	<script>
		var table = [
			"仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
			"能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
			"生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"团队协作", "未来导向", "持续优化", "精准设计", "动态调整", "知识传承", "智能机器人", "历史传承", "水陆一体化",
			"自主维护", "低维护成本", "自然保护区", "应急救援", "智能部署", "环境治理", "生态监测", "驱动模块", "摄像头模块",
            "仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
			"能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
			"生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"团队协作", "未来导向", "持续优化", "精准设计", "动态调整", "知识传承", "智能机器人", "历史传承", "水陆一体化",
			"自主维护", "低维护成本", "自然保护区", "应急救援", "智能部署", "环境治理", "生态监测", "驱动模块", "摄像头模块"
		];
		var camera, scene, renderer;
		var controls;
		var objects = [];
		var targets = { helix: [] };

		function createHelixLayout(objectsCount) {
			var vector = new THREE.Vector3();
			var targets = [];

			for (var i = 0; i < objectsCount; i++) {
				var phi = i * 0.175 + Math.PI; 
				var object = new THREE.Object3D();

				object.position.x = 900 * Math.sin(phi);
				object.position.y = -(i * 8) + 450; 
				object.position.z = 900 * Math.cos(phi);

				vector.x = object.position.x * 2;
				vector.y = object.position.y;
				vector.z = object.position.z * 2;
				object.lookAt(vector);

				targets.push(object);
			}

			return targets;
		}

		function getRandomColor() {
			var letters = '0123456789ABCDEF';
			var color = '#';
			for (var i = 0; i < 6; i++) {
				color += letters[Math.floor(Math.random() * 16)];
			}
			return color;
		}

		init();
		animate();

		function init() {
			camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
			camera.position.z = 3000;
			scene = new THREE.Scene();
			for (var i = 0; i < table.length; i++) {
				var element = document.createElement('div');
				element.className = 'element';
				element.style.backgroundColor = 'rgba(0, 0, 0, 0.1)';
				var symbol = document.createElement('div');
				symbol.className = 'symbol';
				symbol.textContent = table[i];
				symbol.style.color = getRandomColor();
				symbol.style.textShadow = '0 0 10px ' + getRandomColor();
				element.appendChild(symbol);

				var object = new THREE.CSS3DObject(element);
				object.position.x = Math.random() * 4000 - 2000;
				object.position.y = Math.random() * 4000 - 2000;
				object.position.z = Math.random() * 4000 - 2000;
				scene.add(object);
				objects.push(object);
			}

			targets.helix = createHelixLayout(objects.length);
			transform(targets.helix, 5000);

			renderer = new THREE.CSS3DRenderer();
			renderer.setSize(window.innerWidth, window.innerHeight);
			renderer.domElement.style.position = 'absolute';
			document.getElementById('container').appendChild(renderer.domElement);

			controls = new THREE.TrackballControls(camera, renderer.domElement);
			controls.rotateSpeed = 0.5;
			controls.minDistance = 500;
			controls.maxDistance = 6000;
			controls.addEventListener('change', render);

			window.addEventListener('resize', onWindowResize, false);
		}

		function transform(targets, duration) {
			TWEEN.removeAll();
			for (var i = 0; i < objects.length; i++) {
				var object = objects[i];
				var target = targets[i];
				new TWEEN.Tween(object.position)
					.to({ x: target.position.x, y: target.position.y, z: target.position.z }, Math.random() * duration + duration)
					.easing(TWEEN.Easing.Exponential.InOut)
					.start();

				new TWEEN.Tween(object.rotation)
					.to({ x: target.rotation.x, y: target.rotation.y, z: target.rotation.z }, Math.random() * duration + duration)
					.easing(TWEEN.Easing.Exponential.InOut)
					.start();
			}
			new TWEEN.Tween(this)
				.to({}, duration * 2)
				.onUpdate(render)
				.start();
		}

		function onWindowResize() {
			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();
			renderer.setSize(window.innerWidth, window.innerHeight);
			render();
		}

		function animate() {
			requestAnimationFrame(animate);
			TWEEN.update();
			controls.update();
		}

		function render() {
			renderer.render(scene, camera);
		}
	</script>
</body>
</html>

三:五角管道词云图

1.效果展示

在这里插入图片描述

2.HTML完整代码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
	<title>五角管道词云图</title>
	<style>
		html,
		body {
			height: 100%;
			margin: 0;
			overflow: hidden;
		}

		body {
			background-color: #000000;
			font-family: Helvetica, sans-serif;
		}

		#info {
			position: absolute;
			width: 100%;
			color: #ffffff;
			padding: 5px;
			font-family: Monospace;
			font-size: 13px;
			font-weight: bold;
			text-align: center;
			z-index: 1;
		}

		.element {
			width: 120px;
			height: 160px;
			text-align: center;
			cursor: default;
			display: flex;
			flex-direction: column;
			justify-content: center;
			padding: 10px;
			box-sizing: border-box;
			border-radius: 10px;
			transition: all 0.3s ease;
			transform-style: preserve-3d;
		}

		.element .symbol {
			font-size: 20px;
			font-weight: bold;
			margin-bottom: 5px;
			word-break: break-word;
			color: #ffffff;
		}

		.element .details {
			font-size: 12px;
			word-break: break-word;
			color: #ffffff;
		}
	</style>
</head>

<body>
	<script src="js/three.min.js"></script>
	<script src="js/tween.min.js"></script>
	<script src="js/TrackballControls.js"></script>
	<script src="js/CSS3DRenderer.js"></script>
	<div id="container"></div>
	<script>
		var table = [
			"仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
			"能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
			"生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"团队协作", "未来导向", "持续优化", "精准设计", "动态调整", "知识传承", "智能机器人", "历史传承", "水陆一体化",
			"自主维护", "低维护成本", "自然保护区", "应急救援", "智能部署", "环境治理", "生态监测", "驱动模块", "摄像头模块",
                "仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
			"能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
			"生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服"
		];
		var camera, scene, renderer;
		var controls;
		var objects = [];
		var targets = { helix: [] };

		function createTubeHelixLayout(objectsCount) {
			var vector = new THREE.Vector3();
			var targets = [];
			var radius = 600; 
			var thickness = 300;
			var turns = 5; 
			var height = 1000; 

			for (var i = 0; i < objectsCount; i++) {
				var object = new THREE.Object3D();
				var theta = (i / objectsCount) * turns * Math.PI * 2;
				var layer = i % 5; 
				var layerRadius = radius - (layer / 5) * thickness;

				object.position.x = layerRadius * Math.cos(theta);
				object.position.y = (i / objectsCount) * height - height/2;
				object.position.z = layerRadius * Math.sin(theta);

				vector.x = object.position.x * 2;
				vector.y = object.position.y;
				vector.z = object.position.z * 2;
				object.lookAt(vector);
				object.rotation.y = theta + Math.PI/2;
				var sizeFactor = 0.8 + (layer / 5) * 0.4;
				object.scale.set(sizeFactor, sizeFactor, sizeFactor);

				targets.push(object);
			}

			return targets;
		}

		function getRandomColor() {
			var letters = '0123456789ABCDEF';
			var color = '#';
			for (var i = 0; i < 6; i++) {
				color += letters[Math.floor(Math.random() * 16)];
			}
			return color;
		}

		init();
		animate();

		function init() {
			camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
			camera.position.z = 3000;
			scene = new THREE.Scene();

			for (var i = 0; i < table.length; i++) {
				var element = document.createElement('div');
				element.className = 'element';

				var symbol = document.createElement('div');
				symbol.className = 'symbol';
				symbol.textContent = table[i];
				symbol.style.color = getRandomColor();
				symbol.style.textShadow = '0 0 10px ' + getRandomColor();
				element.appendChild(symbol);

				var object = new THREE.CSS3DObject(element);
				object.position.x = Math.random() * 4000 - 2000;
				object.position.y = Math.random() * 4000 - 2000;
				object.position.z = Math.random() * 4000 - 2000;
				scene.add(object);
				objects.push(object);
			}

			targets.helix = createTubeHelixLayout(objects.length);
			transform(targets.helix, 5000);

			renderer = new THREE.CSS3DRenderer();
			renderer.setSize(window.innerWidth, window.innerHeight);
			renderer.domElement.style.position = 'absolute';
			document.getElementById('container').appendChild(renderer.domElement);

			controls = new THREE.TrackballControls(camera, renderer.domElement);
			controls.rotateSpeed = 0.5;
			controls.minDistance = 500;
			controls.maxDistance = 6000;
			controls.addEventListener('change', render);

			window.addEventListener('resize', onWindowResize, false);
		}

		function transform(targets, duration) {
			TWEEN.removeAll();
			for (var i = 0; i < objects.length; i++) {
				var object = objects[i];
				var target = targets[i];
				new TWEEN.Tween(object.position)
					.to({ x: target.position.x, y: target.position.y, z: target.position.z }, duration)
					.easing(TWEEN.Easing.Quadratic.InOut)
					.start();

				new TWEEN.Tween(object.rotation)
					.to({ x: target.rotation.x, y: target.rotation.y, z: target.rotation.z }, duration)
					.easing(TWEEN.Easing.Quadratic.InOut)
					.start();

				new TWEEN.Tween(object.scale)
					.to({ x: target.scale.x, y: target.scale.y, z: target.scale.z }, duration)
					.easing(TWEEN.Easing.Quadratic.InOut)
					.start();
			}
			new TWEEN.Tween(this)
				.to({}, duration * 1.5)
				.onUpdate(render)
				.start();
		}

		function onWindowResize() {
			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();
			renderer.setSize(window.innerWidth, window.innerHeight);
			render();
		}

		function animate() {
			requestAnimationFrame(animate);
			TWEEN.update();
			controls.update();
		}

		function render() {
			renderer.render(scene, camera);
		}
	</script>
</body>
</html>

四:爱心词云图(彩蛋)

1.效果展示

在这里插入图片描述

2.HTML完整代码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
	<title>爱心词云图</title>
	<style>
		html,
		body {
			height: 100%;
			margin: 0;
			overflow: hidden;
		}

		body {
			background-color: #000000;
			font-family: Helvetica, sans-serif;
		}

		.element {
			width: 120px;
			height: 160px;
			text-align: center;
			cursor: default;
			display: flex;
			flex-direction: column;
			background-color: rgba(0, 0, 0, 0.3);
			justify-content: center;
			padding: 10px;
			box-sizing: border-box;
		}

		.element .symbol {
			font-size: 20px;
			font-weight: bold;
			margin-bottom: 5px;
			word-break: break-word;
		}

		.element .details {
			font-size: 12px;
			word-break: break-word;
		}
	</style>
</head>
<body>
	<script src="js/three.min.js"></script>
	<script src="js/tween.min.js"></script>
	<script src="js/TrackballControls.js"></script>
	<script src="js/CSS3DRenderer.js"></script>
	<div id="container"></div>
	<script>
		var table = [
			"仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
			"能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
			"生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"团队协作", "未来导向", "持续优化", "精准设计", "动态调整", "知识传承", "智能机器人", "历史传承", "水陆一体化",
			"自主维护", "低维护成本", "自然保护区", "应急救援", "智能部署", "环境治理", "生态监测", "驱动模块", "摄像头模块",
            "仿生设计", "路况监控", "《缀术》", "祖冲之π", "柔性鳍面", "生态友好", "自然观", "文化共鸣", "天人合一", "宋代车船",
			"能量循环", "模块化设计", "远程监控", "机械能转化", "东方智慧", "水下作业", "模块化装配", "水动力推进",
			"生物运动", "哲学内核", "水陆一体化", "人机协作", "低能耗", "低噪音", "生态平衡", "历史对话", "《考工记》", "东方智慧",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"科技美学", "自然观", "鳍面波动", "垃圾清理", "结构修", "河床保护", "生态友好", "低噪音运行", "模块化设计",
			"工程美学", "自主导航", "智能避障", "桥梁修复", "道器合一", "东方哲学", "天人合一", "自然规律", "生态平衡",
			"仿生工程", "跨时空对话", "文化传承", "河流清理", "陆地巡逻", "协作创新", "技术突破", "问题解决", "挑战克服",
			"团队协作", "未来导向", "持续优化", "精准设计", "动态调整", "知识传承", "智能机器人", "历史传承", "水陆一体化",
			"自主维护", "低维护成本", "自然保护区", "应急救援", "智能部署", "环境治理", "生态监测", "驱动模块", "摄像头模块",
		];
		var camera, scene, renderer;
		var controls;
		var objects = [];
		var targets = { heart: [] };

		function createHeartLayout(objectsCount) {
			var vector = new THREE.Vector3();
			var targets = [];
			var scale = 800;

			for (var i = 0; i < objectsCount; i++) {
				var object = new THREE.Object3D();
				var theta = i * (2 * Math.PI) / objectsCount;
				var phi = Math.acos(2 * i / objectsCount - 1);
				var x = scale * Math.pow(Math.sin(theta), 3);
				var y = scale * (13 * Math.cos(theta) - 5 * Math.cos(2*theta) - 2 * Math.cos(3*theta) - Math.cos(4*theta)) / 16;
				var z = scale * Math.sin(phi) * 0.5;

				object.position.x = x;
				object.position.y = y;
				object.position.z = z;

				vector.x = object.position.x * 2;
				vector.y = object.position.y;
				vector.z = object.position.z * 2;
				object.lookAt(vector);

				targets.push(object);
			}

			return targets;
		}

		function getRandomColor() {
			var letters = '0123456789ABCDEF';
			var color = '#';
			for (var i = 0; i < 6; i++) {
				color += letters[Math.floor(Math.random() * 16)];
			}
			return color;
		}

		init();
		animate();

		function init() {
			camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
			camera.position.z = 3000;
			scene = new THREE.Scene();

			for (var i = 0; i < table.length; i++) {
				var element = document.createElement('div');
				element.className = 'element';
				element.style.backgroundColor = 'rgba(0, 0, 0, 0.1)';

				var symbol = document.createElement('div');
				symbol.className = 'symbol';
				symbol.textContent = table[i];
				symbol.style.color = getRandomColor();
				symbol.style.textShadow = '0 0 10px ' + getRandomColor();
				element.appendChild(symbol);

				var object = new THREE.CSS3DObject(element);
				object.position.x = Math.random() * 4000 - 2000;
				object.position.y = Math.random() * 4000 - 2000;
				object.position.z = Math.random() * 4000 - 2000;
				scene.add(object);
				objects.push(object);
			}

			targets.heart = createHeartLayout(objects.length);
			transform(targets.heart, 5000);
			renderer = new THREE.CSS3DRenderer();
			renderer.setSize(window.innerWidth, window.innerHeight);
			renderer.domElement.style.position = 'absolute';
			document.getElementById('container').appendChild(renderer.domElement);

			controls = new THREE.TrackballControls(camera, renderer.domElement);
			controls.rotateSpeed = 0.5;
			controls.minDistance = 500;
			controls.maxDistance = 6000;
			controls.addEventListener('change', render);

			window.addEventListener('resize', onWindowResize, false);
		}

		function transform(targets, duration) {
			TWEEN.removeAll();
			for (var i = 0; i < objects.length; i++) {
				var object = objects[i];
				var target = targets[i];
				new TWEEN.Tween(object.position)
					.to({ x: target.position.x, y: target.position.y, z: target.position.z }, duration)
					.easing(TWEEN.Easing.Quadratic.InOut)
					.start();

				new TWEEN.Tween(object.rotation)
					.to({ x: target.rotation.x, y: target.rotation.y, z: target.rotation.z }, duration)
					.easing(TWEEN.Easing.Quadratic.InOut)
					.start();
			}
			new TWEEN.Tween(this)
				.to({}, duration * 1.5)
				.onUpdate(render)
				.start();
		}

		function onWindowResize() {
			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();
			renderer.setSize(window.innerWidth, window.innerHeight);
			render();
		}

		function animate() {
			requestAnimationFrame(animate);
			TWEEN.update();
			controls.update();
		}

		function render() {
			renderer.render(scene, camera);
		}
	</script>
</body>
</html>

网站公告

今日签到

点亮在社区的每一天
去签到