当前位置:首页 > JavaScript

js实现星球转动

2026-04-07 06:54:17JavaScript

使用Three.js实现3D星球转动

Three.js是一个基于WebGL的JavaScript库,可以轻松创建3D图形效果。以下是实现星球转动的基本代码示例:

import * as THREE from 'three';

// 创建场景
const scene = new THREE.Scene();

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建星球几何体
const geometry = new THREE.SphereGeometry(1, 32, 32);

// 加载纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('path/to/your/texture.jpg');

// 创建材质
const material = new THREE.MeshBasicMaterial({ map: texture });

// 创建星球网格
const sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);

// 动画循环
function animate() {
    requestAnimationFrame(animate);

    // 旋转星球
    sphere.rotation.y += 0.01;

    renderer.render(scene, camera);
}
animate();

使用CSS 3D变换实现简单星球效果

对于简单的2D星球效果,可以使用CSS动画:

<div class="planet"></div>

<style>
.planet {
    width: 200px;
    height: 200px;
    border-radius: 50%;
    background: radial-gradient(circle at 30% 30%, #3498db, #2c3e50);
    animation: rotate 10s linear infinite;
    box-shadow: 0 0 20px rgba(52, 152, 219, 0.6);
}

@keyframes rotate {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
}
</style>

使用Canvas绘制旋转星球

使用Canvas API可以创建更自定义的星球效果:

const canvas = document.getElementById('planetCanvas');
const ctx = canvas.getContext('2d');

let angle = 0;

function drawPlanet() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    // 绘制星球
    const gradient = ctx.createRadialGradient(150, 150, 0, 150, 150, 100);
    gradient.addColorStop(0, '#3498db');
    gradient.addColorStop(1, '#2c3e50');

    ctx.beginPath();
    ctx.arc(150, 150, 100, 0, Math.PI * 2);
    ctx.fillStyle = gradient;
    ctx.fill();

    // 添加旋转效果
    ctx.save();
    ctx.translate(150, 150);
    ctx.rotate(angle);

    // 绘制特征(如云带)
    ctx.beginPath();
    ctx.ellipse(0, 0, 120, 40, 0, 0, Math.PI * 2);
    ctx.strokeStyle = 'rgba(255, 255, 255, 0.3)';
    ctx.lineWidth = 10;
    ctx.stroke();

    ctx.restore();

    angle += 0.01;
    requestAnimationFrame(drawPlanet);
}

drawPlanet();

添加交互控制

为Three.js实现的星球添加鼠标交互控制:

// 添加轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;

// 修改动画循环
function animate() {
    requestAnimationFrame(animate);
    controls.update();
    renderer.render(scene, camera);
}

优化星球视觉效果

提升Three.js星球的真实感:

js实现星球转动

// 使用更高级的材质
const material = new THREE.MeshPhongMaterial({
    map: texture,
    bumpMap: textureLoader.load('path/to/bump_map.jpg'),
    bumpScale: 0.05,
    specular: new THREE.Color('grey'),
    shininess: 5
});

// 添加环境光和平行光
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);

const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);

以上方法提供了从简单到复杂的多种实现方式,可根据项目需求选择合适的方案。Three.js方案适合需要高质量3D效果的场景,CSS方案适合简单的页面装饰,Canvas方案则提供了更多的自定义控制能力。

标签: 星球js
分享给朋友:

相关文章

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…

js实现菜单导航

js实现菜单导航

实现基础菜单导航结构 使用HTML和CSS创建菜单的基本结构,再通过JavaScript添加交互功能。HTML部分通常使用<ul>和<li>标签构建层级: <nav i…

vue js实现登录

vue js实现登录

Vue.js 登录功能实现 依赖安装 确保项目已安装 Vue.js 和必要的依赖库(如 Vue Router、Axios)。通过以下命令安装: npm install vue-router axio…

js实现vue组件

js实现vue组件

使用原生JavaScript实现类似Vue的组件功能 基础组件结构 创建一个简单的组件系统需要实现数据绑定、模板渲染和事件处理。以下是一个基础实现框架: class Component { co…

vue.js 实现弹窗

vue.js 实现弹窗

Vue.js 实现弹窗的方法 使用组件化方式创建弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏。组件内包含弹窗的模板、样式和逻辑。 <t…