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

目录

前言

效果预览图

完整代码

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];

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 简单的语法

1.插值表达式 1.插值表达式的作用是什么&#xff1f; 利用表达式进行插值&#xff0c;将数据渲染到页面中&#xff1b; 2.语法结构&#xff1f; {{表达式}} 3.插值表达式的注意点是什么&#xff1f; &#xff08;1&#xff09;使用的数据要存在&#xff0c;在data中&…

贪吃蛇小游戏代码

框架区 package 结果;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random;import javax.s…

每日一题----昂贵的婚礼

#include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <vector> using namespace std; //本题酋长的允诺也算一个物品,最后一定要交给酋长&#xff0c;那么等级不能超过酋长的等级范围const int N 150 * 15…

高效使用 PyMongo 进行 MongoDB 查询和插入操作

插入到集合中&#xff1a; 要将记录&#xff08;在MongoDB中称为文档&#xff09;插入到集合中&#xff0c;使用insert_one()方法。insert_one()方法的第一个参数是一个包含文档中每个字段的名称和值的字典。 import pymongomyclient pymongo.MongoClient("mongodb://l…

使用pixy计算群体遗传学统计量

1 数据过滤 过滤参数&#xff1a;过滤掉次等位基因频率&#xff08;minor allele frequency&#xff0c;MAF&#xff09;低于0.05、哈达-温伯格平衡&#xff08;Hardy– Weinberg equilibrium&#xff0c;HWE&#xff09;对应的P值低于1e-10或杂合率&#xff08;heterozygosit…

两万字图文详解!InnoDB锁专题!

前言 本文将跟大家聊聊 InnoDB 的锁。本文比较长&#xff0c;包括一条 SQL 是如何加锁的&#xff0c;一些加锁规则、如何分析和解决死锁问题等内容&#xff0c;建议耐心读完&#xff0c;肯定对大家有帮助的。 为什么需要加锁呢&#xff1f; InnoDB 的七种锁介绍 一条 SQL 是…

2023.11.16-hive sql高阶函数lateral view,与行转列,列转行

目录 0.lateral view简介 1.行转列 需求1: 需求2: 2.列转行 解题思路: 0.lateral view简介 hive函数 lateral view 主要功能是将原本汇总在一条&#xff08;行&#xff09;的数据拆分成多条&#xff08;行&#xff09;成虚拟表&#xff0c;再与原表进行笛卡尔积&#xff0c…

那些让我苦笑不得的 Bug:编码之路的坎坷经历

文章目录 1. CSS 中的样式“消失”问题2. JavaScript 的变量命名引发的混乱3. 时间格式的困扰4. 数据库查询条件引发的错误结语 &#x1f389;欢迎来到Java学习路线专栏~那些让我苦笑不得的 Bug&#xff1a;编码之路的坎坷经历 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨…

了解一下知识付费系统的开发流程和关键技术点

知识付费系统的开发既涉及到前端用户体验&#xff0c;又需要强大的后端支持和复杂的付费逻辑。在这篇文章中&#xff0c;我们将深入探讨知识付费系统的开发流程和关键技术点&#xff0c;并提供一些相关的技术代码示例。 1. 需求分析和规划&#xff1a; 在着手开发知识付费系…

小学生加减乘除闯关运算练习流量主微信小程序开发

小学生加减乘除闯关运算练习流量主微信小程序开发 经过本次更新&#xff0c;我们增加了新的功能和特性&#xff0c;以提升用户体验和运算练习的趣味性&#xff1a; 能量石与激励视频&#xff1a;用户可以通过观看激励视频来获取能量石&#xff0c;这些能量石可以用于解锁收费…

ctfshow 文件上传 151-161

文件上传也好久没做了。。 手很生了 151 前端绕过 只能上传png文件 使用bp抓包&#xff0c;修改文件名后缀为php 上传成功&#xff0c;发现文件上传路径 使用蚁剑连接 找到flag 152 152 后端校验 跟上一关一样 表示后面即使执行错误&#xff0c;也不报错 抓包修改文件…

招投标系统软件源码,招投标全流程在线化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

TypeError: Cannot read properties of undefined (reading ‘0‘)

1、在使用<el-dropdown>会报这个错误 原因&#xff1a;使用v-if控制显隐&#xff0c;找不到该节点就会开始报错 解决&#xff1a;使用v-show就可以了

自定义控件封装

上边对两个控件整合时用函数指针是因为QSpinBox::valueChange有重载版本 自定义的接口放在类外 你设计的界面可以通过提升为调用这些接口 添加qt设计师界面类

winform窗体、控件的简单封装,重做标题栏

1标题栏封装中使用了以下技术&#xff1a; 知识点&#xff1a; 1.父类、子类的继承&#xff1b; 2.窗体之间的继承&#xff1b; 3.自定义控件的绘制&#xff1b; 4.多线程在窗体间的应用&#xff1b; 5.窗体和控件的封装&#xff1b; 6.回调函数&#xff08;委托&#xff09;&…

Redis快速入门(基础篇)

简介&#xff1a; 是一个高性能的 key-value数据库。 存在内存中 与其他 key-value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类…

自动备份pgsql数据库

bat文件中的内容&#xff1a; PATH D:\Program Files\PostgreSQL\13\bin;D:\Program Files\7-Zip set PGPASSWORD**** pg_dump -h 8.134.151.187 -p 5466 -U sky -d mip_db --schema-only -f D:\DB\backup\%TODAY%-schema-mip_db_ali.sql pg_dump -h 8.134.151.187 -p 5466…

BUUCTF 面具下的flag 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;得到一张.jpg图片。 密文&#xff1a; 解题思路&#xff1a; 1、将图片放到Kali中&#xff0c;使用binwalk检测出隐藏zip包。 使用foremost提取zip压缩包到output目录下 解压zip压缩包&…