【Three.js基础学习】14.Galaxy Generator

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

  课程知识点

        1. 实现星际编辑器

        2. 创建粒子 1000, 在随机位置

        3. 创建材质 PointsMaterial

        4. Points() 接收

        5. 放到gui 中调试  但是会发现调整size 等 属性 页面无变化

            因此有两种方法 onChange() onFinishChange()

        这个时候更改就会 将参数传到 generateGalaxy

        同样有问题 增加可以 ,因为在数值增加 不断生成新的星系

        数值缩小时候,但是没有消减

        因此要在函数外部 创建geometry,position,material 这些变量

        判断是否和之前相等 ,不相等则 dispose()  清除几何体缓存,材质缓存同时

        删除这些点 scene.remove(points)

        // 实现漩涡星系 思路

        首先将所有粒子 放到一条直线上 ,x  position[i3 + 0] = Math.random() * parameters.radius

        要实现分支  %  取余操作

        这样在循环中 就可以得到 branchAngle=0,1,2,0,1,2,0,1,2,0,1,2,

                        对应的       i    =0,1,2,3,4,5,6,7,8,9

        下面主要是数学的应用 通过更改数值 实现星系

一、代码

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import * as lil from 'lil-gui'
import { AdditiveBlending } from 'three'/* 课程知识点1. 实现星际编辑器2. 创建粒子 1000, 在随机位置3. 创建材质 PointsMaterial4. Points() 接收5. 放到gui 中调试  但是会发现调整size 等 属性 页面无变化因此有两种方法 onChange() onFinishChange()这个时候更改就会 将参数传到 generateGalaxy同样有问题 增加可以 ,因为在数值增加 不断生成新的星系数值缩小时候,但是没有消减因此要在函数外部 创建geometry,position,material 这些变量判断是否和之前相等 ,不相等则 dispose()  清除几何体缓存,材质缓存同时删除这些点 scene.remove(points)// 实现漩涡星系 思路首先将所有粒子 放到一条直线上 ,x  position[i3 + 0] = Math.random() * parameters.radius要实现分支  %  取余操作这样在循环中 就可以得到 branchAngle=0,1,2,0,1,2,0,1,2,0,1,2,对应的       i    =0,1,2,3,4,5,6,7,8,9下面主要是数学的应用 通过更改数值 实现星系
*//*** Base*/
// Debug
const gui = new lil.GUI()// Canvas
const canvas = document.querySelector('canvas.webgl')// Scene
const scene = new THREE.Scene()/* 
* Galaxy 星系 Generator 编辑器
*/
const parameters = {}
parameters.count = 100000
parameters.size = 0.01
parameters.color = '#ffffff'
parameters.radius = 5 // 半径
parameters.branches = 3 // 分支
parameters.spin = 1 // 旋转
parameters.randomness = 0.2 // 随机值
parameters.randomnessPower = 3 // 
parameters.insideColor = '#ff6030' // 
parameters.outsideColor = '#1b3984' let geometry = null
let points = null
let material = null
const generateGalaxy = () =>{/* * Destroy old galaxy*/if(points !== null){geometry.dispose()material.dispose()scene.remove(points)}// Geometrygeometry = new THREE.BufferGeometry()// 创建粒子 位置参数const position = new Float32Array(parameters.count * 3)const colors = new Float32Array(parameters.count * 3)const colorInside = new THREE.Color(parameters.insideColor)const colorOutside = new THREE.Color(parameters.outsideColor)// 设置随机位置for(let i=0;i<parameters.count;i++){const i3 = i * 3// positionconst radius = Math.random() * parameters.radiusconst sponAngle = radius * parameters.spinconst branchAngle = (i % parameters.branches) / parameters.branches * Math.PI * 2const randomX = Math.pow(Math.random(), parameters.randomnessPower) * (Math.random() < 0.5 ? 1 : -1)const randomY = Math.pow(Math.random(), parameters.randomnessPower) * (Math.random() < 0.5 ? 1 : -1)const randomZ = Math.pow(Math.random(), parameters.randomnessPower) * (Math.random() < 0.5 ? 1 : -1)position[i3 + 0] = Math.cos(branchAngle + sponAngle) * radius + randomXposition[i3 + 1] = randomYposition[i3 + 2] = Math.sin(branchAngle + sponAngle) * radius + randomZ// position[i3 + 0] = (Math.random() - 0.5) * 10  // x位置// position[i3 + 1] = (Math.random() - 0.5) * 10  // y// position[i3 + 2] = (Math.random() - 0.5) * 10  // z// colorconst mixedColor = colorInside.clone()mixedColor.lerp(colorOutside,radius/parameters.radius)colors[i3 + 0] = mixedColor.rcolors[i3 + 1] = mixedColor.gcolors[i3 + 2] = mixedColor.b}geometry.setAttribute('position',new THREE.BufferAttribute(position,3))geometry.setAttribute('color',new THREE.BufferAttribute(colors,3))// Materialmaterial = new THREE.PointsMaterial({// color:parameters.color,size:parameters.size,sizeAttenuation:true, // 衰减depthWrite:false, // 深度缓冲区blending: THREE.AdditiveBlending,vertexColors:true})// material.vertexColors = true/* *   Points*/points = new THREE.Points(geometry,material)scene.add(points)
}
gui.add(parameters, 'count').min(100).max(100000).step(100).onFinishChange(generateGalaxy)
gui.add(parameters, 'size').min(0.001).max(1).step(0.001).onFinishChange(generateGalaxy)
gui.add(parameters, 'radius').min(0.01).max(20).step(0.01).onFinishChange(generateGalaxy)
gui.add(parameters, 'branches').min(2).max(20).step(1).onFinishChange(generateGalaxy)
gui.add(parameters, 'spin').min(-5).max(5).step(0.001).onFinishChange(generateGalaxy)
gui.add(parameters, 'randomness').min(0).max(2).step(0.001).onFinishChange(generateGalaxy)
gui.add(parameters, 'randomnessPower').min(1).max(10).step(0.001).onFinishChange(generateGalaxy)
gui.addColor(parameters, 'insideColor').onFinishChange(generateGalaxy)
gui.addColor(parameters, 'outsideColor').onFinishChange(generateGalaxy)generateGalaxy()/*** Sizes*/
const sizes = {width: window.innerWidth,height: window.innerHeight
}window.addEventListener('resize', () =>
{// Update sizessizes.width = window.innerWidthsizes.height = window.innerHeight// Update cameracamera.aspect = sizes.width / sizes.heightcamera.updateProjectionMatrix()// Update rendererrenderer.setSize(sizes.width, sizes.height)renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})/*** Camera*/
// Base camera
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
camera.position.x = 3
camera.position.y = 3
camera.position.z = 3
scene.add(camera)// Controls
const controls = new OrbitControls(camera, canvas)
controls.enableDamping = true/*** Renderer*/
const renderer = new THREE.WebGLRenderer({canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))/*** Animate*/
const clock = new THREE.Clock()const tick = () =>
{const elapsedTime = clock.getElapsedTime()// Update controlscontrols.update()// Renderrenderer.render(scene, camera)// Call tick again on the next framewindow.requestAnimationFrame(tick)
}tick()

二、知识点

1.思路图

2.效果


总结

五一前看的,全被自己吃进肚子里了,想想怎么实现的一头雾水!还是要看之前代码,很烦...

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习-15】决策树(Decision Tree,DT)算法介绍:原理与案例实现

前言 决策树算法是机器学习领域中的一种重要分类方法&#xff0c;它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点&#xff0c;在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理&#xff0c;包括熵和信息熵的相关概念&#xff0c;以及几种经典的…

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于&#xff1a;自己走了很多弯路&#xff0c;淋过雨所以想为别人撑伞&#xff0c;也方便回顾&#xff0c;仅供参考 一、搭建开发环境&#xff1a; 虚拟机&#xff08;ubuntu-20.04.6-desktop-amd64&#xff09;&#xff1a;Mysql数据库 8.0.36Workbench …

透明屏幕的亮度如何?在强光环境下是否仍然清晰可见?

透明屏幕的亮度是一个重要的指标&#xff0c;决定了屏幕在明亮环境中的可视程度。在透明屏幕领域&#xff0c;高亮度的屏幕可以确保在强光环境下仍然能够清晰显示内容。 OLED透明屏通常具有较高的亮度&#xff0c;可以达到500尼特以上&#xff0c;这使得它们在明亮的环境中仍然…

中间件研发之Springboot自定义starter

Spring Boot Starter是一种简化Spring Boot应用开发的机制&#xff0c;它可以通过引入一些预定义的依赖和配置&#xff0c;让我们快速地集成某些功能模块&#xff0c;而无需繁琐地编写代码和配置文件。Spring Boot官方提供了很多常用的Starter&#xff0c;例如spring-boot-star…

图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类&#xff1a;队列和字典 export class DictionNary {// 字典的封装constructor() {this.items {}}set(key, value) {// 添加键this.items[key] value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(k…

H3C ripng实验(ipv6)

H3C ripng实验&#xff08;ipv6&#xff09; 实验需求 按照图示为路由器配置IPv6地址 所有路由器运行ripng&#xff0c;进行ipv6网段的互通 查询路由表后&#xff0c;​进行全网段的ping测试&#xff0c;实验目的RTD可以ping通RTA 实验解法 按照图示为路由器配置IPv6地址 …

Simple ThFHE with poly ratio via Rényi Divergence

参考文献&#xff1a; [Renyi61] Rnyi A. On measures of entropy and information[C]//Proceedings of the fourth Berkeley symposium on mathematical statistics and probability, volume 1: contributions to the theory of statistics. University of California Press,…

【Transformer系列(5)】vision transformer(ViT)带来的思考?

一、ViT的意义 Vision Transformer&#xff08;ViT&#xff09;是一种基于Transformer架构的图像分类模型&#xff0c;它通过将图像划分为一系列的图像块&#xff08;patches&#xff09;&#xff0c;并将这些块转换为向量序列&#xff0c;然后通过Transformer的自注意力机制对…

某站戴师兄——Excel实战

1、设置下拉选项&#xff1a;数据——数据验证——设置 如下设置&#xff1a; 2、If、sumif、index、match综合应用&#xff1a; sumif(条件区域&#xff0c;条件&#xff0c;目标区域&#xff09; sumifs(目标区域,条件区域1&#xff0c;条件1,条件区域2&#xff0c;条件2) …

[渗透利器]某大佬公开自用红队渗透工具

前言 看到群里大佬发的文章&#xff0c;公开了自用的工具&#xff0c;前来拜膜一下。 使用方式 该工具首先需要初始化数据库&#xff0c;Windows推荐使用PHP Study&#xff0c;搭建更方便。 修改默认root密码后新建数据库&#xff0c;账号密码随便填&#xff0c;公网环境注意…

知识库工具:付费的HelpLook AI知识库比免费的牵牛易帮好在哪里

在知识管理的领域中&#xff0c;选择合适的知识库工具对于企业来说很重要。市面上有很多知识库产品&#xff0c;有付费的和免费的&#xff0c;但是还是有很多企业会选择使用付费的&#xff0c;而不是免费的。这是为什么呢&#xff1f;这就是今天要探讨的问题&#xff0c;下面就…

【自用】了解移动存储卡的基本信息

前言 本文是看B站视频做的一个简单笔记&#xff0c;方便日后自己快速回顾&#xff0c;内容主要介绍了存储卡基本参数&#xff0c;了解卡面上的数字、图标代表的含义。对于日后如何挑选判断一张存储卡的好坏、判别一张存储卡是否合格有一定帮助。 视频参考链接&#xff1a;【硬…