如何在 spark AR 中创建此 voronoi 着色器动画?
How can I create this voronoi shader animation in spark AR?
我有从 github 生成纹理的代码示例。我希望点在流畅的动画中四处移动,但我不确定从哪里开始。下面是生成纹理的JS代码:
//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"});
我将如何在连续流畅的动画中为点设置动画?
这太酷了!我能够使用 Animation 模块获得点以在流畅的运动中制作动画。我通过将每个点变成随机循环动画来做到这一点。将脚本顶部的 for 循环更改为此,它应该可以工作:
//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);
}
我有从 github 生成纹理的代码示例。我希望点在流畅的动画中四处移动,但我不确定从哪里开始。下面是生成纹理的JS代码:
//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"});
我将如何在连续流畅的动画中为点设置动画?
这太酷了!我能够使用 Animation 模块获得点以在流畅的运动中制作动画。我通过将每个点变成随机循环动画来做到这一点。将脚本顶部的 for 循环更改为此,它应该可以工作:
//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);
}