简体   繁体   中英

How can I create this voronoi shader animation in spark AR?

I have this code example for generating this texture from github. I want the points to move around in a fluid animation but I am not sure where to start. Here is the JS code that generates the texture:

//based on voronoi shaders from: https://thebookofshaders.com/

const Materials = require('Materials');
const R = require('Reactive');
const S = require('Shaders');
const Random = require('Random');
const Patches = require('Patches');
const Animation = require('Animation');
const Time = require('Time');
const Diagnostics = require('Diagnostics');

Diagnostics.log();

let points =[];
let nPoints = 10;

const uv = S.fragmentStage(S.vertexAttribute({'variableName': S.VertexAttribute.TEX_COORDS}));


for(let i=0;i<nPoints; i++){

let x = Random.random();
let y = Random.random();
points[i] = R.pack2(x, y);

}


let m_dist = 1.;
let m_point = R.pack2(0,0);


for (let i = 0; i < nPoints; i++) {

let newPoint = R.pack2( points[i].x, points[i].y);
let dist = R.distance(uv, newPoint);

let cond = R.step(m_dist,dist) ;

m_dist = R.add(R.mul(dist,cond), R.mul(m_dist,R.sub(1,cond)));

m_point = R.add(R.mul(points[i],cond), R.mul(m_point,R.sub(1,cond)));

}


let v = R.mul(m_dist, 3.);

let color = R.pack4(v,v,v,1.);

Materials.get('defaultMaterial0').setTexture(color, {textureSlotName: "diffuseTexture"});
Materials.get('test_mat').setTexture(color, {textureSlotName: "diffuseTexture"});

代码创建了这个

How would I go about animating the points in a continuous fluid animation?

This is cool. I was able to get the points to animate in a fluid motion using the Animation module. I did this by turning each point into a randomized looping animation, Change the for loop at the top of your script to this: and it should work:

//include the Animation module
const Animation = require('Animation');

for(let i=0;i<nPoints; i++){
  //create an animation for each point x and y position
  ///x position animation
  let dx = Animation.timeDriver({durationMilliseconds: Random.random()*10000+1000, loopCount:Infinity, mirror:true});
  let sx = Animation.samplers.easeInOutSine(Random.random(), Random.random());
  let ax = Animation.animate(dx, sx);
  ///y position animation
  let dy = Animation.timeDriver({durationMilliseconds: Random.random()*10000+1000, loopCount:Infinity, mirror:true});
  let sy = Animation.samplers.easeInOutSine(Random.random(), Random.random());
  let ay = Animation.animate(dy, sy);
  //start the animation
  dx.start();
  dy.start();
  //save the points positions into the points array
  points[i] = R.pack2(ax, ay);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM