three.js实现扩散波效果

本文详细介绍了如何在Vue项目中利用three.js库创建一个带有扩散波效果的圆柱体,涉及透明度变化和动态缩放的3D模型展示。
摘要由CSDN通过智能技术生成

three.js实现扩散波效果

图例

在这里插入图片描述

步骤

  1. 创建一个圆柱,不要顶与底面
  2. 材质允许透明,双面显示
  3. 动态修改缩放与透明度

代码

<template>
  <div class="app">
    <div ref="canvesRef" class="canvas-wrap"></div>
  </div>
</template>

<script setup>
import { ref, onMounted } from "vue";
import * as THREE from "three";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";

const canvesRef = ref(null);
const canvasWidth = window.innerWidth;
const canvasHeight = window.innerHeight;
let scene;
let camera;
let renderer;
let axesHelper;
let cameraControls;
let mesh;
let s = 0; // 缩放
let p = 160; // 透明度
init();
render();
function init() {
  // 场景
  scene = new THREE.Scene();

  // 相机
  camera = new THREE.PerspectiveCamera(
    45,
    canvasWidth / canvasHeight,
    1,
    10000
  );
  camera.position.set(600, 600, 600);
  camera.lookAt(0, 0, 0);
  // 模型
  addModel();
  // 坐标辅助对象
  axesHelper = new THREE.AxesHelper(200);
  scene.add(axesHelper);

  // 渲染器
  //antialias - 是否执行抗锯齿。默认为false.
  renderer = new THREE.WebGLRenderer();
  renderer.setSize(canvasWidth, canvasHeight);
  // 相机轨道控制器
  cameraControls = new OrbitControls(camera, renderer.domElement);
}

function addModel() {
  const g = new THREE.CylinderGeometry(50, 50, 20, 32, 1, true);
  const m = new THREE.MeshBasicMaterial({
    color: 0x00ffff,
    side: THREE.DoubleSide,
    transparent: true,
  });
  mesh = new THREE.Mesh(g, m);
  mesh.position.set(0, 10, 0);
  scene.add(mesh);
  console.log(mesh);
}

function render() {
  if (s > 160) {
    s = 0;
    p = 160;
  }
  mesh.scale.set(1 + s / 60, 1, 1 + s / 60);
  mesh.material.opacity = p / 160;
  s++;
  p--;
  renderer.render(scene, camera);
  requestAnimationFrame(render);
}
onMounted(() => {
  canvesRef.value.appendChild(renderer.domElement);
});
</script>

<style lang="scss" scoped>
.app {
  position: relative;
}
</style>

实现效果,可以使用three.js中的ShaderMaterial和WebGLRenderTarget等技术。 首先,在场景中创建一个平面,用于显示效果。然后创建一个ShaderMaterial,它包含一个自定义的着色器,用于计算水的变化。着色器中可以通过时间来模拟纹的扩散效果。 接下来,创建一个WebGLRenderTarget,用于将纹的渲染结果渲染到一个纹理中。在每一帧渲染时,将纹的渲染结果反复复制到一个新的纹理中,并将其传递给着色器程序中,以便进行下一次渲染。 最后,在渲染场景时,将纹的纹理作为平面的纹理,并将平面的材质设置为之前创建的ShaderMaterial。 下面是一个简单的示例代码: ```javascript // 创建平面 var geometry = new THREE.PlaneBufferGeometry(100, 100); var material = new THREE.ShaderMaterial({ uniforms: { time: { value: 0 }, texture: { value: null } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('fragmentShader').textContent }); var plane = new THREE.Mesh(geometry, material); scene.add(plane); // 创建WebGLRenderTarget var renderTarget = new THREE.WebGLRenderTarget(100, 100, { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat }); // 渲染场景 function render() { // 更新时间 material.uniforms.time.value += 0.1; // 渲染纹 renderer.setRenderTarget(renderTarget); renderer.render(scene, camera); // 复制纹纹理 material.uniforms.texture.value = renderTarget.texture.clone(); // 渲染场景 renderer.setRenderTarget(null); renderer.render(scene, camera); requestAnimationFrame(render); } ``` 其中,vertexShader和fragmentShader分别为顶点着色器和片元着色器的代码,可以自行编写实现效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值