vue+threeJS 创建镂空球体(SphereGeometry)

        嗨,我是小路。今天主要和大家分享的主题是“vue+threeJS 创建镂空球体(SphereGeometry)”。        

上次看到一个做镂空球体的项目,自己也准备尝试着做一做。今天终于做完了,并对这个项目进行梳理。

镂空球体示例效果图

1.ShaderMaterial 编写着色器代码

定义:提供了一种灵活的方式来自定义材质的外观。通过编写着色器代码(GLSL),你可以实现非常独特和复杂的视觉效果

属性列表列表说明

vertexShader

顶点着色器

fragmentShader

片段着色器

2.vUv 模型文理坐标

定义:用于将模型的UV纹理坐标(范围[0,1])从顶点着色器传递到片元着色器

二、实例代码

<!--创建一个球体-->
<template><div class="pageBox"><div class="leftBox" ref="leftRef"></div></div></template>
<script setup>
import { onMounted, onUnmounted, reactive, ref } from 'vue';
import * as THREE from 'three';
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { getRandomColor, createLight,createTriangle } from '../utils/commonThree';
const leftRef = ref();
// 定义相机输出画布的尺寸(单位:像素px)
let width = window.innerWidth; //宽度
let height = window.innerHeight; //高度
// 创建3D场景对象Scene
const scene = new THREE.Scene();
//设置背景色
scene.background = getRandomColor(0.5,0.4);const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
//三角形缩放过大时,会形成多种三角形形成的背景图
camera.position.z = 1000;// 创建渲染器对象
const renderer = new THREE.WebGLRenderer();let triangles = [];
let spheres = [];/*** 生成一个球体*/const createSphere = (radius = 1) => {const sphereGeometry = new THREE.SphereGeometry(radius, 32, 32);//生成一个矩形// const sphereGeometry = new THREE.BoxGeometry(radius,radius,radius)const material = new THREE.MeshStandardMaterial({color: getRandomColor(),})const shaderMaterial = new THREE.ShaderMaterial({uniforms: {time: { value: 0 }},vertexShader: `varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,fragmentShader: `varying vec2 vUv;void main() {float lineWidth =  0.04;float lineNumber = 20.0;float x = fract(vUv.x*lineNumber);float y = fract(vUv.y*lineNumber);if(x < lineWidth || y < lineWidth) {gl_FragColor = vec4(vec3(0.0),1.0);} else {gl_FragColor = vec4(1.);}}`,side: THREE.DoubleSide});const sphere = new THREE.Mesh(sphereGeometry, shaderMaterial);//设置网格的随机位置// sphere.position.set(//   (Math.random() - 0.5) * 2000,//   (Math.random() - 0.5) * 1000,//   (Math.random() - 0.5) * 1000// );return sphere;
}onMounted(() => {initData()//添加相机空间const controls = new OrbitControls(camera, renderer.domElement);// 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景controls.addEventListener('change', function () {renderer.render(scene, camera); //执行渲染操作});//监听鼠标、键盘事件renderer.setSize(width, height); //设置three.js渲染区域的尺寸(像素px)//将innerHTML置空,避免append重复添加渲染leftRef.value.innerHTML = ''leftRef.value.append(renderer.domElement);})
const initData = () => {createLight(scene);for (let i = 1; i >= 0; i--) {const outSphere = createSphere(500);spheres.push(outSphere);scene.add(outSphere);}for (let j = 1000; j >= 0; j--) {const triangle = createTriangle(getRandomColor(),2000,1000,1000);triangles.push(triangle);scene.add(triangle);}render();
}
function render() {requestAnimationFrame(render);// 旋转所有三角形triangles.forEach(triangle => {triangle.rotation.x += 0.01;triangle.rotation.y += 0.01;});//旋转球体spheres.forEach(sphere => {sphere.rotation.x += 0.01;sphere.rotation.y += 0.01;});renderer.render(scene, camera);
}
onUnmounted(() => {//释放内存renderer.dispose();
})</script>
<style scoped lang="less">
.pageBox {width: 100%;height: 100vh;padding: 0;margin: 0;display: flex;justify-content: space-between;align-items: center;.rightBox {width: 100%;height: 100%;}
}
</style>

三、总结

       1、几何体可以更换。可以更换成三角形、矩形、球体等等其它的形成。

        2、vUv可以通过着色器修改模型的坐标颜色

        3、着色器模块确实挺有意思了,目前用起来不多,后续练习这块!

        4、同时将创建多个三角形模块合并在一起,让页面稍微好看点。

都看到这里了,记得【点赞】+【关注】勉励一下哟。

参考:

利用shader绘制一个带经纬度的球体_绘制经纬度为30个瓣,半径为学号尾数的球体,用axis调整坐标系为适当形式。axis equ-CSDN博客

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

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

相关文章

Docker 镜像打包到本地

保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下&#xff1a; docker save [options] IMAGE [IMAGE...]示例&#xff1a;docker save -o centos.tar centos:latest--output 或 -o&#xff1a;将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…

前端常见的安全问题

跨站脚本攻击(XSS) XSS&#xff08;跨站脚本攻击&#xff0c;Cross-Site Scripting&#xff09;是一种通过在网页中注入恶意脚本&#xff0c;从而窃取用户数据或控制用户行为的攻击方式。注入的js跟网页与原有的js具有同样的权限&#xff0c;可以获得server端数据、可以获取co…

Spring Boot与Disruptor高性能队列整合指南

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、Disruptor简介 Disruptor是LMAX公司开发的高性能无锁队列框架&#xff0c;其核心设计通过以下特性实现卓越性能&#xff1a; 环形数组结构&#xff08;…

MongoDB CRUD操作完全指南:从入门到精通

在当今数据驱动的时代&#xff0c;数据库管理系统扮演着至关重要的角色。作为最受欢迎的NoSQL数据库之一&#xff0c;MongoDB以其灵活的数据模型、卓越的可扩展性和强大的查询能力赢得了开发者的青睐。本文将全面介绍MongoDB的核心操作——CRUD&#xff08;创建、读取、更新、删…

2025/5/25 学习日记 linux进阶命令学习

tree:以树状结构显示目录下的文件和子目录&#xff0c;方便直观查看文件系统结构。 -d&#xff1a;仅显示目录&#xff0c;不显示文件。-L [层数]&#xff1a;限制显示的目录层级&#xff08;如 -L 2 表示显示当前目录下 2 层子目录&#xff09;。-h&#xff1a;以人类可读的格…

quickbi实现关联度分析(复刻PowerBI展示)

quickbi实现关联度分析&#xff08;复刻PowerBI展示&#xff09; PowerBI通过DAX创建度量值&#xff0c;可以比较轻松的实现不同产品的关联度分析&#xff0c;即购物篮分析&#xff0c;但如果使用quickbi&#xff0c;则需要通过sql代码创建一个数据集&#xff0c;然后再通过数…

git 把一个分支A的某一个 commit 应用到另一个分支B上

先记住分支 A 上你要应用的那个 commit <commit_id> checkout 到分支 B git cherry-pick <commit_id>完成

基于Python的分布式网络爬虫系统设计与实现

摘要 随着互联网信息爆炸性增长&#xff0c;大规模数据采集与分析需求日益增加。本文设计并实现了一套基于Python的分布式网络爬虫系统&#xff0c;采用图形用户界面实现便捷操作&#xff0c;集成异步IO技术与多线程处理机制&#xff0c;有效解决了传统爬虫在数据获取、处理效…

一文讲透golang channel 的特点、原理及使用场景

在 Go 语言中&#xff0c;通道&#xff08;Channel&#xff09; 是实现并发编程的核心机制之一&#xff0c;基于 CSP&#xff08;Communicating Sequential Processes&#xff09; 模型设计。它不仅用于协程&#xff08;Goroutine&#xff09;之间的数据传递&#xff0c;还通过…

PID项目---硬件设计

该项目是立创训练营项目&#xff0c;这些是我个人学习的记录&#xff0c;记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用&#xff1a;当电机工作…

【分库分表】理论基础

目录 为什么要分库分表 垂直分 垂直分库 垂直分表 垂直切分优缺点 优点 缺点 水平分 水平分库 水平分表 水平切分优缺点 优点 缺点 为什么要分库分表 分库分表是一种场景解决方案&#xff0c;它的出现是为了解决一些场景问题的 单表过大的话&#xff0c;读请求进…

UDP和TCP示例程序

查看自己的IP地址 以管理员身份运行cmd 输入 ipconfig 复制图中的IPv4地址 UDP通信程序 UdpReceiver.java import java.net.*;public class UdpReceiver {public static void main(String[] args) {// 监听端口&#xff08;需与发送端保持一致&#xff09;int listenPort…

Double使用注意事项

目录 数据精度问题BigDecimal的正确使用构造陷阱数值比较除法舍入控制 RoundingMode 数据精度问题 Java开发中&#xff0c;Double类作为包装类用于处理双精度浮点数。浮点数double无法精确表示某些十进制小数&#xff08;如0.1&#xff09;&#xff0c;导致运算结果出现误差 …

8.2 线性变换的矩阵

一、线性变换的矩阵 本节将对每个线性变换 T T T 都指定一个矩阵 A A A. 对于一般的列向量&#xff0c;输入 v \boldsymbol v v 在空间 V R n \pmb{\textrm V}\pmb{\textrm R}^n VRn 中&#xff0c;输出 T ( v ) T(\boldsymbol v) T(v) 在空间 W R m \textrm{\pmb W}\…

【后端高阶面经:微服务篇】5、限流实战:高并发系统流量治理全攻略

一、限流阈值的三维度计算模型 1.1 系统容量基准线:压测驱动的安全水位 1.1.1 压力测试方法论 测试目标:确定系统在资源安全水位(CPU≤80%,内存≤70%,RT≤500ms)下的最大处理能力测试工具: 单机压测:JMeter(模拟10万并发)、wrk(低资源消耗)集群压测:LoadRunner …

同一无线网络下的设备IP地址是否相同?

在家庭和办公网络普及的今天&#xff0c;许多人都会好奇&#xff1a;连接同一个Wi-Fi的设备是否共享相同的IP地址&#xff1f;这个问题看似简单&#xff0c;实则涉及多个角度。本文将为您揭示其中的技术奥秘。 用一个无线网IP地址一样吗&#xff1f;同一无线网络&#xff08;如…

git push出现 “HTTP 400 curl 22 The requested URL returned error: 400...“错误

错误内容是&#xff1a; 错误&#xff1a;RPC 失败。HTTP 400 curl 22 The requested URL returned error: 400 send-pack: unexpected disconnect while reading sideband packet 致命错误&#xff1a;远端意外挂断了 检查发现&#xff1b;文件大小5M&#xff0c;远低于100M&a…

对WireShark 中的UDP抓包数据进行解析

对WireShark 中的UDP抓包数据进行解析 本文尝试对 WireShark 中抓包的 UDP 数据进行解析。 但是在尝试对 TCP 中的 FTP 数据进行解析的时候&#xff0c;发现除了从端口号进行区分之外&#xff0c; 没有什么好的方式来进行处理。 import numpy as np import matplotlib.pyplot …

云原生安全基石:Linux进程隔离技术详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 进程隔离是操作系统通过内核机制将不同进程的运行环境和资源访问范围隔离开的技术。其核心目标在于&#xff1a; 资源独占&#xff1a;确保…

云迹机器人底盘调用

云迹机器人底盘调用还是比较友好的&#xff0c;就是纯socket收发指令就能实现&#xff0c;今天实现一个底盘移动到指定点位功能。底盘的默认IP是192.168.10.10通讯端口是31001&#xff0c;测试机与底盘接入统一网络后直接发指令即可。本文给出两种语言调用源码&#xff0c;选择…