当前位置: 首页 > article >正文

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.lryc.cn/news/2385051.html

相关文章:

  • [ Qt ] | 常见控件(一)
  • 【八股战神篇】Java虚拟机(JVM)高频面试题
  • Pycharm-jupyternotebook不渲染
  • lanqiaoOJ 4330:欧拉函数模板
  • NDVI谐波拟合(基于GEE实现)
  • 《虚拟即真实:数字人驱动技术在React Native社交中的涅槃》
  • 南京邮电大学《智能控制技术》期末抢救(上)
  • Cookie、Session、JWT
  • TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》
  • 地理特征类可视化图像
  • 【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案
  • DataGridView中拖放带有图片的Excel,实现数据批量导入
  • 跨域_Cross-origin resource sharing
  • Opencv常见学习链接(待分类补充)
  • 大疆制图跑飞马D2000的正射与三维模型
  • PostgreSQL中的权限管理简介
  • ConceptAttention:Diffusion Transformers learn highly interpretable features
  • 物联网低功耗保活协同优化方案:软硬件与WiFi网关动态联动
  • LW-CTrans:一种用于三维医学图像分割的轻量级CNN与Transformer混合网络|文献速递-深度学习医疗AI最新文献
  • 光谱相机在地质勘测中的应用
  • Autodl训练Faster-RCNN网络(自己的数据集)
  • 每日两道leetcode(今天开始刷基础题模块——这次是之前的修改版)
  • 服务器数据迁移终极指南:网站、数据库、邮件无缝迁移策略与工具实战 (2025)
  • NFS服务小实验
  • vue 中的v-once
  • 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面
  • 2025年开源大模型技术全景图
  • 【创造型模式】工厂方法模式
  • 【MySQL】使用文件进行交互
  • # 大模型的本地部署与应用:从入门到实战