threejs太阳系(源码加相关素材)

news2024/11/25 20:15:27

目录

前言

效果预览图

完整代码

html部分

js部分

模块aa


前言

      Three.js 是一款基于原生 WebGL 封装通用 Web 3D 引擎,在小游戏、产品展示、物联网、数字孪生、智慧城市园区、机械、建筑、全景看房、GIS 等各个领域基本上都有 three.js 的身影。本篇文章简单的使用three.js写了一个太阳系,代码比较繁琐,感兴趣的可以下载源码优化一下。

效果预览图

完整代码

html部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>太阳系</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        canvas{
            margin: 0 auto;
            display: block;
            width: 100vw;
            height: 100vh;
        }
    </style>
</head>
<body>
    
</body>
</html>
<script type="importmap">
    {
      "imports": {
        "three": "https://unpkg.com/three@0.158.0/build/three.module.js",
        "three/addons/": "https://unpkg.com/three@0.158.0/examples/jsm/"
      }
    }
</script>
<script type="module" src="./js/太阳系.js"></script>

js部分

import * as THREE from 'three'
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
//导入物体
import geo from './aa.js';
//创建一个场景
let scene = new THREE.Scene();



let arr = [];
for (let i = 1; i <= 9; i++) {
const geometry = new THREE.TorusGeometry( 50*i, 0.3,50 );
const material = new THREE.MeshBasicMaterial( { color: 0xffffff } ); 
const torusKnot = new THREE.Mesh( geometry, material ); 
torusKnot.rotateX(-Math.PI/2)
    arr.push(torusKnot)
}
 //把物体加入场景当中
 scene.add(...arr);
 
const geometry1 = new THREE.TorusGeometry( 18, 0.01,50 );
const material1 = new THREE.MeshBasicMaterial( { color: 0xffffff } ); 
const torusKnot1 = new THREE.Mesh( geometry1, material1 ); 
torusKnot1.rotateX(-Math.PI/2)
torusKnot1.position.set(-150,0,0)
scene.add(torusKnot1);


//把网格物体放入场景
scene.add(...geo);

let geo11 = new  THREE.SphereGeometry(9999);
let load11 = new THREE.TextureLoader();
let word11 = load11.load('./images/universe.jpg');
let mater11 = new  THREE.MeshLambertMaterial({
    map:word11,
    side:THREE.DoubleSide
});
let mesh11 = new THREE.Mesh(geo11,mater11);
mesh11.position.set(0,0,0);
scene.add(mesh11)

const geometry = new THREE.RingGeometry( 30, 23, 132 );
let loader = new THREE.TextureLoader();
let stars = loader.load('./images/venusAtmosphere.jpg')
const material = new THREE.MeshBasicMaterial( {
     map: stars, 
     side: THREE.DoubleSide } );
const mesh = new THREE.Mesh( geometry, material );
mesh.rotateX(-Math.PI/2)
mesh.position.set(-300,0,0)
scene.add( mesh );



let geo99= new  THREE.SphereGeometry(44);
let load99 = new THREE.TextureLoader();
let mater99 = new  THREE.MeshLambertMaterial({
    color:0xffffff,
    opacity:0.3,
    transparent:true,
});
let mesh99 = new THREE.Mesh(geo99,mater99);
mesh99.position.set(0,0,0);
scene.add(mesh99)

let geo991= new  THREE.SphereGeometry(13);
let load991 = new THREE.TextureLoader();
let mater991 = new  THREE.MeshLambertMaterial({
    color:0xffffff,
    opacity:0.3,
    transparent:true,
});
let mesh991 = new THREE.Mesh(geo991,mater991);
mesh991.position.set(-150,0,0);
scene.add(mesh991)

//设置一个分组
let group = new THREE.Group()
group.add(...geo)
//设置分组的坐标
group.position.set(0,0,0)

//把网格物加入 环境
scene.add(group)

let fz1 = new THREE.Group();
fz1.add(geo[2])
fz1.position.set(0,0,0);
scene.add(fz1)

let fz2 = new THREE.Group();
fz2.add(geo[3],torusKnot1,mesh991)
fz2.position.set(0,0,0);
scene.add(fz2)

let fz3 = new THREE.Group();
fz3.add(geo[4])
fz3.position.set(0,0,0);
scene.add(fz3)

let fz4 = new THREE.Group();
fz4.add(geo[5])
fz4.position.set(0,0,0);
scene.add(fz4)

let fz5 = new THREE.Group();
fz5.add(geo[6],mesh)
fz5.position.set(0,0,0);
scene.add(fz5)

let fz6 = new THREE.Group();
fz6.add(geo[7])
fz6.position.set(0,0,0);
scene.add(fz6)

let fz7 = new THREE.Group();
fz7.add(geo[8])
fz7.position.set(0,0,0);
scene.add(fz7)

let fz8 = new THREE.Group();
fz8.add(geo[9])
fz8.position.set(0,0,0);
scene.add(fz8)

let fz9 = new THREE.Group();
fz9.add(geo[10])
fz9.position.set(-18,0,0);
scene.add(fz9)



//添加环境光
let light1 = new THREE.AmbientLight(0xffffff,2);
scene.add(light1);




let light2 = new THREE.PointLight(0xffffff,150000);
light2.position.set(0,0,0);
scene.add(light1,light2)
//设置照片大小
let w=window.innerWidth;
let h=window.innerHeight;

//创建相机
let camera = new THREE.PerspectiveCamera(45,w/h,0.1,100000);
//设置相机位置
camera.position.set(-30,100,500);

//设置拍照物体位置
camera.lookAt(0,0,0);

//创建一个渲染器
let renderer = new THREE.WebGLRenderer();

//设置渲染的大小
renderer.setSize(w,h);

//渲染
renderer.render(scene,camera);

//渲染到页面中
document.body.appendChild( renderer.domElement );

//设置一个轨道控制器
let con = new OrbitControls(camera,renderer.domElement);

con.addEventListener('change',()=>{
    renderer.render(scene,camera);
    document.body.appendChild( renderer.domElement );
});



//设置关键帧动画,让物体旋转
function animate(){
     renderer.render(scene,camera);
     //旋转的单位是弧度
    for (let i = 0; i < geo.length; i++) {
        geo[i].rotateY(0.02)
    }
     fz1.rotateY(-0.02)
     //设置分组旋转
     group.rotateY(0.01)
     fz2.rotateY(0.02)
     fz3.rotateY(0.01)
     fz4.rotateY(0.005)
     fz5.rotateY(0.01)
     fz6.rotateY(0.006)
     fz7.rotateY(0.004)
     fz8.rotateY(0.001)
     fz9.rotateY(0.02)
     requestAnimationFrame(animate)
}
animate();

模块aa

import * as THREE from 'three'

//创建太阳
let geo1 = new  THREE.SphereGeometry(42);
let load = new THREE.TextureLoader();
let word = load.load('./images/sun.jpg');
let mater1 = new  THREE.MeshLambertMaterial({
    map:word
});

let mesh1 = new THREE.Mesh(geo1,mater1);
mesh1.position.set(0,0,0);

//创建星球1
let geo2 = new  THREE.SphereGeometry(6);
let load1 = new THREE.TextureLoader();
let moon = load1.load('./images/eris.jpg');
let mater2 = new  THREE.MeshLambertMaterial({
    map:moon
});

let mesh2 = new THREE.Mesh(geo2,mater2);
mesh2.position.set(-50,0,0);


//创建星球2
let geo3 = new  THREE.SphereGeometry(10);
let load3 = new THREE.TextureLoader();
let word3 = load3.load('./images/venus.jpg');
let mater3 = new  THREE.MeshLambertMaterial({
    map:word3
});
let mesh3 = new THREE.Mesh(geo3,mater3);
mesh3.position.set(-100,0,0);
//创建星球3
let geo4 = new  THREE.SphereGeometry(11);
let load4 = new THREE.TextureLoader();
let moon4 = load1.load('./images/earth.jpg');
let mater4 = new  THREE.MeshLambertMaterial({
    map:moon4
});

let mesh4 = new THREE.Mesh(geo4,mater4);
mesh4.position.set(-150,0,0);
//创建星球4
let geo5 = new  THREE.SphereGeometry(9);
let load5 = new THREE.TextureLoader();
let moon5 = load1.load('./images/mars.jpg');
let mater5 = new  THREE.MeshLambertMaterial({
    map:moon5
});

let mesh5 = new THREE.Mesh(geo5,mater5);
mesh5.position.set(-200,0,0);
//创建星球5
let geo6 = new  THREE.SphereGeometry(18);
let load6 = new THREE.TextureLoader();
let moon6 = load1.load('./images/jupiter.jpg');
let mater6 = new  THREE.MeshLambertMaterial({
    map:moon6
});

let mesh6 = new THREE.Mesh(geo6,mater6);
mesh6.position.set(-250,0,0);
//创建星球6
let geo7 = new  THREE.SphereGeometry(20);
let load7 = new THREE.TextureLoader();
let moon7 = load1.load('./images/saturn.jpg');
let mater7 = new  THREE.MeshLambertMaterial({
    map:moon7
});

let mesh7 = new THREE.Mesh(geo7,mater7);
mesh7.position.set(-300,0,0);
//创建星球7
let geo8 = new  THREE.SphereGeometry(16);
let load8 = new THREE.TextureLoader();
let moon8 = load1.load('./images/uranus.jpg');
let mater8 = new  THREE.MeshLambertMaterial({
    map:moon8
});

let mesh8 = new THREE.Mesh(geo8,mater8);
mesh8.position.set(-350,0,0);
//创建星球8
let geo9 = new  THREE.SphereGeometry(16);
let load9 = new THREE.TextureLoader();
let moon9 = load1.load('./images/neptune.jpg');
let mater9 = new  THREE.MeshLambertMaterial({
    map:moon9
});

let mesh9 = new THREE.Mesh(geo9,mater9);
mesh9.position.set(-400,0,0);

let geo10 = new  THREE.SphereGeometry(6);
let load10 = new THREE.TextureLoader();
let moon10 = load1.load('./images/pluto.jpg');
let mater10 = new  THREE.MeshLambertMaterial({
    map:moon9
});

let mesh10 = new THREE.Mesh(geo10,mater10);
mesh10.position.set(-450,0,0);

let geoy = new  THREE.SphereGeometry(3);
let loady = new THREE.TextureLoader();
let moony = load1.load('./images/eris.jpg');
let matery = new  THREE.MeshLambertMaterial({
    map:moony
});

let meshy = new THREE.Mesh(geoy,matery);
meshy.position.set(-150,0,0);

//导出创建的物体列表
export default [ mesh1,mesh2,mesh3,mesh4,mesh5,mesh6,mesh7,mesh8,mesh9,mesh10,meshy];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1206501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源维修上门服务小程序SAAS系统源码 带完整搭建教程

在现代生活中&#xff0c;家电设备维修往往是一个耗时且繁琐的过程。消费者需要花费大量时间寻找合适的维修人员&#xff0c;并面临服务质量不稳定的风险。同时&#xff0c;对于维修人员来说&#xff0c;寻找客户和接收订单的过程也十分繁琐。因此&#xff0c;开发一款基于小程…

cryptopp Base64Encoder \n问题

1、问题&#xff1a; new Base64Encoder(new StringSink(out_base)) 调用库函数Base64Encoder进行base64加密后确认多出来了\n 2、原因 base64加密的问题, 由于base64一行不能超过76字符, 超过就会添加回车换行符(在Windows中是 \r\n , 在Linux中是 \n ) 3、解决 方法一、给定参…

Python中的filter函数用法详解

目录 引言 一、filter函数基本用法 二、filter函数应用场景 1、筛选符合条件的元素 2、数据清洗和预处理 3、复杂条件筛选 4、与其他函数结合使用 三、filter函数与lambda表达式 四、filter函数与列表推导式 五、总结 引言 Python中的filter函数是一种内置的高效过滤…

电脑桌面图标打不开?三种方法让你轻松应对

电脑桌面上的图标是我们日常使用电脑的入口&#xff0c;但有时候您可能会遇到一个常见问题&#xff0c;电脑桌面图标打不开。这个问题可能会让您感到困惑&#xff0c;但幸运的是&#xff0c;通常有多种方法可以解决。本文将详细介绍三种常见的解决方法&#xff0c;帮助您恢复桌…

测试:面试问题(多精全)

目录 面试问题 1&#xff0c;你们原来项目的测试流程是怎么样的&#xff1f; 2&#xff0c;你介绍下&#xff0c;你最熟悉的项目&#xff1f; 3&#xff0c;你们原来项目的主要的功能模块有哪些&#xff0c;你主要负责哪些模块&#xff1f; 4&#xff0c;你说原来充值…

Axure9学习

产品经理零基础入门&#xff08;四&#xff09;Axure 原型图教程&#xff0c;2小时学会_哔哩哔哩_bilibili 1. ① 页面对应页面个数&#xff0c;概要对应每个页面的具体内容 ② 文件类型 ③ 备用间隔改为5分钟 ④ 当多个元件重叠&#xff0c;想把在下面的元件b直接拖出来&…

一款IT团队都在用的私有化知识库,技术开放,还开源了!

IT和软件开发团队需要处理大量的技术文档和知识&#xff0c;通过建立内部知识库&#xff0c;可以将技术文档、代码示例、最佳实践等知识整理和归档起来&#xff0c;方便团队成员查找和参考。 IT和软件开发团队为什么要建立内部知识库&#xff1f; 提高知识管理效率&#xff1a…

汇川(Inovance) PLC——H2u 和H3u:编程口通讯协议

文章目录 说明通讯帧通讯命令字通讯数据地址汇川 H2u H3u通讯协议举例 说明 该协议适用于汇川H2u系列和H3u系列PLC。 通讯帧 通讯采用ASCII码&#xff0c;校验方式采用和校验。 请求帧格式:报文开始命令字地址&#xff08;有些无&#xff09;长度&#xff08;有些无&#xf…

怎样用 vs2017编写一个cpp并运行

02 第一个C程序-C书写HelloWorld_哔哩哔哩_bilibili 1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1.1 创建项目 Visual Studio是我们用来编写C程序的主要工具&#xff0c;我们先将它打开 1.2 创建文件 右键源文件&#xff0c;选…

解决企业项目管理难题:痛点分析与实用解决方案探索

在当前竞争激烈的商业环境中&#xff0c;产品力已然成为市场竞争的核心&#xff0c;这背后的驱动力是技术、人才和管理能力的综合体现——研发创新能力。其中&#xff0c;项目管理能力扮演着至关重要的角色&#xff0c;它能最大化地发挥和释放以上三者的优势。因此&#xff0c;…

教资笔记(目录)

2023.9.16教资考试 笔试成绩是150分&#xff0c;但是考试折合成120分满分&#xff0c;70分及格。 计划&#xff1a;2024上半年再战科一 名称类型中学科二急救班中学中小学科一模板通用科目二简答题汇总中学教资学习笔记总结中学《综合素质》通用 小学中学科一&#xff08;通…

基于springboot实现小学家校一体“作业帮”系统项目【项目源码】计算机毕业设计

基于springboot实现小学家校一体“作业帮”系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具…

电子零部件工厂的WMS系统:业务特点、产品特点与优势

一、电子零部件工厂的业务特点 电子零部件工厂的业务涉及各种电子元器件的生产、组装和配送。其业务特点包括&#xff1a; 高度复杂性&#xff1a;电子零部件工厂的生产流程涉及多种原材料、半成品和成品&#xff0c;每种产品都有不同的规格、属性及存储要求。 严格的质量控…

HTTP 常见的请求头

面试官&#xff1a;说说 HTTP 常见的请求头有哪些? 作用&#xff1f; 一、是什么 HTTP头字段&#xff08;HTTP header fields&#xff09;,是指在超文本传输协议&#xff08;HTTP&#xff09;的请求和响应消息中的消息头部分 它们定义了一个超文本传输协议事务中的操作参数 …

建模分析 | 差速轮式移动机器人运动学建模(附Python/Matlab仿真)

目录 0 专栏介绍1 差速模型定义2 控制量与驱动量3 运动学方程4 仿真实现4.1 Python仿真4.2 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#xff…

P6入门:项目初始化6-项目详情之资金Funding

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

Socket网络编程(服务端和客户端代码示例)

本文主要讲解Socket网络编程。 首先介绍socket&#xff0c;包括TCP和UDP通信过程&#xff1b;然后介绍常用的函数&#xff1b;最后编写client-server例子&#xff0c;并进行测试。 文章目录 Socket介绍TCP通信过程服务器端通信过程&#xff1a;客户端通信过程&#xff1a; UDP通…

SpringBoot整合Activiti7——定时器事件(九)

文章目录 定时器事件时间定义时间固定时间段时间周期 1.开始事件2.中间事件3.边界事件代码实现xml文件自定义服务任务监听器自定义用户任务监听器测试流程流程执行步骤 定时器事件 可以用在开始事件、中间事件、边界事件上&#xff0c;边界事件可以是中断和非中断边界事件 需要…

腾讯云双11,多款云服务器优惠多多!新用户优惠超值!

腾讯云在2023年的双11优惠活动中推出了多种优惠的云服务器配置&#xff0c;本文将为您介绍其中的几款服务器配置以及价格优惠。 2核2G3M带宽云服务器 该款云服务器配置为2核2G3M&#xff0c;优惠活动价格为88元/年。该配置适合小型网站、个人博客等轻量级应用。 腾讯云88元服…

医疗器械维修工程师必须重视的方面

彩虹医疗器械维修技能培训开班报名中 长期班低至五折&#xff0c; 打破常规培训模式轻松愉快技术学习&#xff01; 两个多月时间&#xff0c;提升自我&#xff01; 点击进入 彩虹实训基地 理论实践结合教学 小班授课 立即咨询 1 工程师须重视 在医疗行业中&#xff0c;…