ThreeJS实现3D星空隧道效果

three.js之高级几何体-管状几何体TubeGeometry(vue中使用three.js33) TubeGeometry管状几何体介绍和使用1.TubeGeometry管状几何体介绍2.demo说明3.demo代码 1.TubeGeometry管状几何体介绍 TubeGeometry可以沿着一条三维样条曲线拉伸出一根管子。可以通过指定顶点来定义路径。创建TubeGeometry管道几何体时可输入以下参数: 属性 必须 描述 path 是 该属性用一个THREE.SplineCurve对象来指定管道遵循的路径 segments 否 该属性指定管道的分段数,路径越长指定的段数应该越多, 阅读详情

图片

主要运用TubeGeometry来制作自定义的隧道效果

1.初始化场景

function init(){
  //创建 WebGL renderer
  var canvas = document.querySelector("canvas");
  renderer = new THREE.WebGLRenderer({
    canvas: canvas,
    antialias: true,
    shadowMapEnabled: true,
    shadowMapType: THREE.PCFSoftShadowMap });

  renderer.setSize(ww, wh);

  //创建场景 添加雾效果,是场景朦胧些
  scene = new THREE.Scene();
  scene.fog = new THREE.Fog(0x194794, 0, 100);

  var clock = new THREE.Clock();

  //创建透视类型的相机
  cameraRotationProxyX = 3.14159;
  cameraRotationProxyY = 0;

  camera = new THREE.PerspectiveCamera(45, ww / wh, 0.001, 200);
  camera.rotation.y = cameraRotationProxyX;
  camera.rotation.z = cameraRotationProxyY;

  group = new THREE.Group();
  group.position.z = 400;

  group.add(camera);
  scene.add(group);

  //创建点光源
  light = new THREE.PointLight(0xffffff, .35, 4, 0);
  light.castShadow = true;
  scene.add(light);
}

2.创建星空管道

用连续的空间点创建自定义曲线,然后根据曲线来创建管道 再添加贴图

function createSkyTube(){
  //Array of points
  var points = [
  [10, 89, 0],[50, 88, 10],[76, 139, 20],
  [126, 141, 12],[150, 112, 8],[157, 73, 0],
  [180, 44, 5],[207, 35, 10],[232, 36, 0]];

  var p1, p2;

  //points转化为 vertices
  for (var i = 0; i < points.length; i++) {
    var x = points[i][0];
    var y = points[i][2];
    var z = points[i][1];
    points[i] = new THREE.Vector3(x, y, z);
  }
  //根据路径点创建自定义曲线
  path = new THREE.CatmullRomCurve3(points);  
  path.tension = .5;

  //创建TubeGeometry
  var geometry = new THREE.TubeGeometry(path, 300, 4, 32, false);   

  //贴图
  var texture = new THREE.TextureLoader().load('res/3d_space_5.jpg', function (texture) {
    texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
    texture.offset.set(0, 0);
    texture.repeat.set(15, 2);
  });

  //凹凸贴图,影响光照感知深度
  var mapHeight = new THREE.TextureLoader().load('res/waveform-bump3.jpg', function (texture) {
    texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
    texture.offset.set(0, 0);
    texture.repeat.set(15, 2);
  });

  //创建MeshPhong镜面高光材质
  var material = new THREE.MeshPhongMaterial({
    side: THREE.BackSide,
    map: texture,
    shininess: 20,
    bumpMap: mapHeight,
    bumpScale: -.03,
    specular: 0x0b2349 }
  );

  //Create a mesh
  var tube = new THREE.Mesh(geometry, material);
  scene.add(tube);
}

此时效果如下,效果很干不够立体,然后我们加上辅助线效果

图片

3.添加立体辅助线

思路是创建比星空管道半径更小的TubeGeometry,然后用EdgesGeometry来创建

//再创建半径略小的管道,添加几何体辅助线
function createTubeEdges(){
  var geometry = new THREE.TubeGeometry(path, 150, 3.4, 32, false);
  //创建边缘几何体
  var geo = new THREE.EdgesGeometry(geometry);  
  var mat = new THREE.LineBasicMaterial({
    linewidth: 2,
    opacity: .2,
    transparent: 1 }
  );

  //创建线段
  var wireframe = new THREE.LineSegments(geo, mat);
  scene.add(wireframe);
}

此时效果如图,显得更加立体了 但是光线还是太暗,我们再用后期效果处理一下

图片

4.添加后期泛光通道

UnrealBloonPass是three.js后期处理的扩展库,可以用来模拟生活中的泛光或眩光效果,用在星空效果里恰到好处 用法如下

function initRenderPass(){
  var params = {
    exposure: 1.3,
    bloomStrength: .9,
    bloomThreshold: 0,
    bloomRadius: 0 
  };
  //set up render pass
  var renderScene = new THREE.RenderPass(scene, camera);
  //创建泛光通道
  var bloomPass = new THREE.UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), 1.5, 0.4, 0.85);
  bloomPass.renderToScreen = true;
  bloomPass.threshold = params.bloomThreshold;	//阈值
  bloomPass.strength = params.bloomStrength;		//强度
  bloomPass.radius = params.bloomRadius;			  //半径
  composer = new THREE.EffectComposer(renderer);
  composer.setSize(window.innerWidth, window.innerHeight);
  composer.addPass(renderScene);
  composer.addPass(bloomPass);
}

此时效果图:

图片

5.加上粒子效果来点缀

这里以创建一个为例,项目中创建了三个来交叉运动,加上之后就有了文章开头的效果

var particleSystem1,particleSystem2,particleSystem3;
function createParticles(){
  var lastPlace = 0;
  var newPlace = 0;

  //粒子贴图
  var spikeyTexture = new THREE.TextureLoader().load('res/spikey.png');

  var particleCount = 6800;
  particles1 = new THREE.Geometry();

  //粒子材质
  pMaterial = new THREE.ParticleBasicMaterial({
    color: 0xFFFFFF,
    size: .5,
    map: spikeyTexture,
    transparent: true,
    blending: THREE.AdditiveBlending 
  });


  for (var p = 0; p < particleCount; p++) {
    // 随机创建粒子
    // 随机值 -250 -> 250
    var pX = Math.random() * 500 - 250,
    pY = Math.random() * 50 - 25,
    pZ = Math.random() * 500 - 250,
    particle = new THREE.Vector3(pX, pY, pZ);
    particles1.vertices.push(particle);
  }

  // create the particle system
  particleSystem1 = new THREE.ParticleSystem(particles1,pMaterial);

  // add it to the scene
  scene.add(particleSystem1);
}

6. render实时变化,让粒子动起来

function render() {
  //...
  particleSystem1.rotation.y += 0.00002;
  particleSystem2.rotation.x += 0.00005;
  particleSystem3.rotation.z += 0.00001;
  //...
  requestAnimationFrame(render);
}
requestAnimationFrame(render);

7. 关联鼠标滚动,让摄像机跟随

用gsap的ScrollTrigger插件来关联滚动,用法如下:

//初始化gsap鼠标滚动
function initAction(){
  gsap.defaultEase = Linear.easeNone;

  var tubePerc = {percent: 0 };

  //注册ScrollTrigger
  gsap.registerPlugin(ScrollTrigger);

  var tl = gsap.timeline({
    scrollTrigger: {
      trigger: ".scrollTarget",
      start: "top top",
      end: "bottom 100%",
      scrub: 5,
      markers: { color: "white" } } 
  });

  tl.to(tubePerc, {
    percent: .96,
    ease: Linear.easeNone,
    duration: 10,
    onUpdate: function () {
      cameraTargetPercentage = tubePerc.percent;
    } 
  });
}

这里根据onupdate的cameraTargetPercentage值可以去更新相机的位置

8.更新相机的位置

function updateCameraPercentage(percentage) {
  //camera位于p1点看向p2点
  p1 = path.getPointAt(percentage);
  p2 = path.getPointAt(percentage + 0.03);

  group.position.set(p1.x, p1.y, p1.z);
  group.lookAt(p2);
  light.position.set(p2.x, p2.y, p2.z);
}

 

three.js 实现星空粒子效果 threejs星空粒子效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body { margin: 0; ... 阅读详情

相关推荐

从零到一:ThreeJS与TubeGeometry打造沉浸式3D星空隧道的艺术与科学

本文详细介绍了如何使用ThreeJS和TubeGeometry创建沉浸式3D星空隧道,涵盖从基础场景设置到高级视觉效果的全过程。通过曲线生成、管道构建、动态效果和交互控制等关键技术,开发者可以打造令人惊叹的WebGL 3D体验,适用于游戏、数据可视化和创意网站等多种场景。

weixin_29313423的博客 574

Three.js入门——画星空(star field)

http://www.wukai.me/2015/11/15/star-field/ Three.js是一个很流行的3D JavaScript库。这里有一个three.js的入门教程,在浏览器窗口中画出星空。我按照教程重新实现了一遍,这里的这篇博客把教程大致翻译了一遍。我的demo。 变量 定义全局变量: 1 2 3 4 5 6 7 8 9 10 11

大灰狼的小绵羊哥哥的博客 5970

ThreeJS打造沉浸式3D星空隧道:从TubeGeometry到粒子特效全解析

本文详细解析了如何使用ThreeJS打造沉浸式3D星空隧道,从TubeGeometry创建隧道主体到粒子特效实现璀璨星空效果。通过实战案例分享,包括纹理贴图、粒子系统、泛光效果等关键技术点,帮助开发者快速掌握3D场景构建技巧,提升WebGL应用开发能力。

weixin_29291185的博客 419

threejs 绘制星空

效果 online 地址:https://pengfeiw.github.io/minicode/threejs-star 源码 star | github

AhCola 1516

ThreeJS入门(059):THREE.TubeGeometry 知识详解,示例代码

`THREE.TubeGeometry` 是 Three.js 中用于创建管状几何体的一个类。这个类允许你根据给定的路径曲线创建一个三维管状物体。管状几何体广泛应用于创建管道、血管、电缆等类型的三维模型。

大剑师兰特的GIS世界 2359

threejs 制作传送阵效果的贴图

threejs 制作传送阵效果的贴图

【threejs】实现星空、星链、太阳系、线等效果的参考

星空其实就是粒子。星链是一组星星用线连接。一些入门的Threejs项目参考。

记录 2822

Unity UI适配核心:Canvas Scaler模式解析与2023版避坑指南

UI适配是游戏与应用开发中的基础挑战,其核心在于确保界面元素在不同屏幕分辨率与设备上保持视觉一致与功能可用。原理上,系统通过坐标转换与缩放计算,将设计稿的布局映射到物理屏幕。技术价值在于提升用户体验的一致性与产品的跨平台兼容性。应用场景广泛覆盖手游、PC端应用及各类交互界面。本文聚焦Unity引擎中的Canvas Scaler组件,深入剖析其Scale With Screen Size等模式的工作原理,并结合锚点设置、安全区域处理等高频搜索热词,提供解决UI错位、拉伸及异形屏适配等常见问题的工程实践方案,帮

weixin_30920597的博客 623

three.js学习笔记(1)如何创建一个场景

three.js,显而易见,three即3D,js为JavaScript,如果要建立一个3d效果的页面,那么three.js是一个很好地选择,如下图 three.js的简单模型如下图,基础要素如下,包含虚拟场景,虚拟相机,执行渲染操作,投影 直接上代码 这样就可以创建一个基础的3d场景了 ...

weixin_39531576的博客 556

技术美术个人笔记(十三)——Houdini金属弯曲模拟

最近接收到使用Houdini自动解算破损/砸坏/扭曲汽车的需求,以此文记录制作金属弯曲自动解算工具时使用的部分节点解析;

小谁的博客 2149

Cadence DSP 算子开发实战:从入门到精通

本文详细介绍了Cadence DSP算子开发的实战技巧,从入门基础到高级优化。内容涵盖DSP架构特性、内存管理、分块计算策略、SIMD指令优化等核心知识,并提供了性能调优和调试的实用技巧,帮助开发者快速掌握Cadence DSP开发精髓,提升图像处理等计算密集型任务的开发效率。

weixin_29278805的博客 435

three.js点材质实现星空效果

刚开始学习three.js,写的不好请多担待!

m0_54070657的博客 717

MATLAB2022b安装

图文并茂,手把手教会你怎么安装MATLAB2022b

1万+

three.js从入门到精通系列教程040 - 绘制星空背景和运动星体

【代码】three.js从入门到精通系列教程040 - 绘制星空背景和运动星体。

深南大道 953

告别系统迁移蓝屏!用Intel RST驱动搞定11代酷睿装Win11的硬盘识别难题

本文详细介绍了如何通过Intel RST驱动解决11代酷睿处理器在安装Win11时遇到的硬盘识别问题。针对VMD技术导致的系统迁移蓝屏错误,提供了从驱动下载、PE环境创建到驱动注入的完整解决方案,帮助用户顺利完成系统升级或迁移。

weixin_31309419的博客 577

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计

本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。

weixin_28704565的博客 566

Three.js星空粒子特效

效果 代码 只渲染固定个数与区域的粒子保证性能 初始化时确定每个粒子偏移向量方向,操作帧动画时做三维向量偏移 超过规定区域时还原,实现无限粒子移动 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />

漫漫漫漫的博客 2322

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

three.js曲线路径管道TubeGeometry

threejs默认只渲染mesh三角形的正面,如果想看到管道内壁,可以设置双面渲染。几何体的功能就是基于一个3D曲线路径,生成一个管道几何体。你也可以使用下面直线替换上面的样条曲线查看圆管生成效果。下面组合曲线CurvePath是由一段三维贝塞尔曲线。三维二次贝塞尔曲线生成管道几何体。的参数1,用于生成管道几何体。组合曲线,也可以作为。

u014291990的博客 1986

PCL 从LAS文件中获取点云的颜色【2026最新版】

PCL从LAS文件中获取点云的RGB信息(pcl::PointXYZRGB)并进行可视化。博客长期更新,本文最新更新时间为:2026年5月4日。

点云侠的博客 1720

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

vue中使用three绘制星空效果

vue中使用three绘制星空

Anlittlecat的博客 1601

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

学习threejs,拉伸几何体THREE.TubeGeometry管道

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录一、🍀前言1.1 ☘️拉伸几何体THREE.TubeGeometry管道概念二、🍀生成拉伸几何体THREE.TubeGeometry管道1. ☘️实现思路2. ☘️代码样例 一、🍀前言 本文详细介绍如何基于threejs在三维场景中实现生成拉伸几何体THREE.TubeGeometry管道,亲测可用。希望能帮助到您。一起学习,加油!加油! 1.1 ☘️拉

我哎GIS博客 1637

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

3.js - 星空特效

3.js - 星空特效

pig_ning的博客 930

Three.js 星空背景效果

three.js星空背景。

SSophia的博客 709

threejs笔记--TubeGeometry管道

var tubeGeometry = new THREE.TubeGeometry(new THREE.SplineCurve3(points), segments, radius, radiusSegments, closed); //points: 坐标点集合; //segments: 构建管道所用的分段数 默认值为64.路径越长,指定的分段数应越多 //radius: 管道半径...

qq_33943287的博客 3541

Three.js进阶篇之7 - 3D宇宙特效

[html] view plain copy&lt;!DOCTYPE html&gt;  &lt;html&gt;  &lt;head&gt;  &lt;meta charset="utf-8"&gt;  &lt;style&gt;  body {margin: 0;}  body, html {overflow: hidden;}  body, html, .canvasbox {width: ...

ALLENJIAO的专栏 1926
上一篇: TreeJS的图片粒子化效果
下一篇: js控制台 console 打印图片-自定义文字样式
优联前端
博客等级 码龄5年 1832粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值