从鼠标单击点开始扩散的海浪效果(shadermaterial)
·
import * as THREE from 'three';
import {Logger} from './js_threesim/logger.js';
import {ThreeApp,ThreeObject} from './js_threesim/threesim.js';
import {OrbitControls} from './js_three/jsm/controls/OrbitControls.js';
const vertexShader = `
varying highp vec2 vertexUV;
uniform float uTime; //震荡快慢
uniform vec3 uPosition; //鼠标单击位置
uniform float uRange; //波纹范围
uniform float uAmplitude; //波纹振幅
void main() {
vertexUV = uv;
vec3 newPos;
newPos = position;
float len = distance(newPos, uPosition);
//当前顶点距离鼠标单击点的距离
if (len <= uRange){ //在波纹范围内
float amp = uAmplitude * (uRange - len)/uRange; //根据距离振幅衰减
newPos.y = amp * sin(len/uRange * 2.0 * 3.14159 * 5.0 - uTime); //以5个正弦波的方式向外扩散
}
gl_Position = projectionMatrix * modelViewMatrix * vec4( newPos, 1.0 );
}`;
const fragmentShader = `
precision highp float; //高精度
uniform sampler2D Texture;
uniform vec2 uRepeat;
varying vec2 vertexUV;
void main() {
vec2 texCoord = vec2(vertexUV.x * uRepeat.x ,vertexUV.y * uRepeat.y );
texCoord = fract(texCoord); // 获取小数部分,实现重复
vec4 texColor = texture2D(Texture, texCoord);
texColor = texColor * vec4(0.0/255.0,80.0/255.0,250.0/255.0,1.0); //(00,80,250)
gl_FragColor = texColor;
}`;
class MyApp extends ThreeApp{
static sceneSize = 100;
constructor() {
super();
}
init(param){
super.init(param);
this.param = param;
let object = new MyObject();
object.init('海浪');
this.addObject(object);
this.camera.position.set(0, 0, 20);
this.camera.lookAt(new THREE.Vector3(0, 0, 0));
this.controls = new OrbitControls(this.camera, this.renderer.domElement);
this.focus();
}
update() {
super.update(this);
this.controls.update();
}
handleKeyDown(event){
}
handleKeyUp(event){
}
onWindowResize() {
super.onWindowResize(this);
}
}
class MyObject extends ThreeObject{
constructor() {
super();
}
init = function (name) {
let root = new THREE.Object3D();
this.setObject3D(root);
this.name = '' || name;
this.root = root;
let uniforms = {
Texture : {value : new THREE.TextureLoader().load('./images/water.jpg') },
uRepeat:{ value :new THREE.Vector2(10.0,10.0)},
uTime: { value: 0.0},
uPosition: {value: new THREE.Vector3(0,0,0)}, //波纹中心位置
uRange: {value: 50.0},
uAmplitude:{value: 1.0}
};
this.uniforms = uniforms;
let g = new THREE.PlaneGeometry(100,100,128,128);
g.rotateX(-Math.PI/2);
let m = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
side: THREE.DoubleSide
});
let mesh = new THREE.Mesh(g, m);
mesh.position.set(0,-2,0);
root.add(mesh);
}
update() {
super.update();
this.uniforms.uTime.value += 0.03;
}
handleMouseUp(x, y, point, normal, event) {
this.uniforms.uPosition.value.copy(point);
}
handleMouseOver(x, y, point, normal) {
this.overCursor = "pointer";
}
handleMouseOut(x, y, point, normal) {
}
handleMouseMove(x, y, point, normal) {
logger.logObject(this.uniforms.uPosition.value);
logger.render();
}
}
//----用于程序调试
let logger = new Logger(document.querySelector('#debug pre'));
/*-------------------Main start-------------------------*/
let container = document.getElementById("container");
let app = new MyApp();
app.init({container: container});
app.run();
基于正弦波变换的海浪效果
更多推荐



所有评论(0)