我在这里放在一起的项目叫做Swellcloud。动画是从here派生出来的。这段代码连接到我当地海滩附近的一个波浪浮标,动画与现场条件相关。如果“膨胀”是高的,我希望峰值和低谷是大的,膨胀数据的范围是最小的0.1m =最小的膨胀所以低谷和峰值在动画中。最大10米的巨浪,如此大的波谷和波峰...然后冲浪“周期”数据的范围从0到20s将反映动画的“平滑度”,因此高周期在动画上很好的直线,而低周期将是起伏/参差不齐的线。
如果膨胀数据很大,但我不能控制动画上的波浪高度或周期,我已经设法获得了数据来“加速”动画。
有谁有什么建议吗?
我们将这些变量设置为全局变量,这样我们就可以知道它们何时加载: let surfheight,surfperiod;
fetch(
"https://data.channelcoast.org/observations/waves/latest?key='my key"
)
.then(function (resp) {
return resp.text();
})
.then(function (data) {
//console.log(data);
let parser = new DOMParser(),
xmlDoc = parser.parseFromString(data, "text/xml");
//console.log(xmlDoc.getElementsByTagName('ms:hs')[36].innerHTML); //76=Perran,36 Porthleven
surfheight = xmlDoc.getElementsByTagName("ms:hs")[36].innerHTML;
surfperiod = xmlDoc.getElementsByTagName("ms:tp")[36].innerHTML;
// you can set the surf variable here, because the sketch will start only after the data loads,
// also make sure to first convert it to a number like "Number(surfheight)" otherwise it won't work
surfht = Number(surfheight);
surfpd = Number(surfperiod);
document.getElementById("surfheight").textContent = surfheight;
document.getElementById("surfperiod").textContent = surfperiod;
});
var yoff = 0; // 2nd dimension of perlin noise
var waveColor, waveColor2, waveColor3;
var waveColorArr;
var controls, waveSpeed;
var canvas;
let surfht;
let surfpd;
function setup() {
canvas = createCanvas(windowWidth, windowHeight);
waveColor = color(0, 50, 120, 100);
waveColor2 = color(0, 100, 150, 100);
waveColor3 = color(0, 200, 250, 100);
noiseDetail(2, 0.2);
waveColorArr = [waveColor, waveColor, waveColor2, waveColor2, waveColor3, waveColor3];
}
function draw() {
// after these load, the sketch starts
if (!surfperiod && !surfheight) {
return;
}
background(0);
noStroke();
const amp = map(surfht, 0, 10, 0, 1);
//const amp = map(surfpd, 0, 10, 0, 1);
for (var i = 0; i <= 5; i++) {
// We are going to draw a polygon out of the wave points
beginShape();
fill(waveColorArr[i]);
var xoff = 0;
for (var x = 0; x <= width + 500; x += 100) {
var y = map(
noise(xoff, yoff - 0.5 * i),
0,
1,
(height / 10) * (i + 1),
height - height / 10 + (height / 10) * i
);
vertex(x, y);
// i've extracted this into a variable for cleaner code
const inc = map(surfpd, 0, 20, 0.01, 0.5);
xoff += inc + 0.5 / 10000.0;
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
}
const inc = map(surfht, 0, 10, 0, 0.025);
yoff += 0.007 + inc + 0.5 / 10000.0;
}
function windowResized() {
resizeCanvas(window.innerWidth, window.innerHeight);
}
发布于 2021-01-08 08:12:36
这是一小段代码,主要是绘制一个单独的波:
// We are going to draw a polygon out of the wave points
beginShape();
fill(waveColorArr[i]);
var xoff = 0;
for (var x = 0; x <= width + 500; x += 100) {
var y = map(
noise(xoff, yoff - 0.5 * i),
0,
1,
(height / 10) * (i + 1),
height - height / 10 + (height / 10) * i
);
vertex(x, y);
// i've extracted this into a variable for cleaner code
const inc = map(surfpd, 0, 20, 0.01, 0.5);
xoff += inc + 0.5 / 10000.0;
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
您已经了解了如何对inc
值执行map()
操作。类似的注意y
也被映射,从0.0 -> 1.0范围到(height / 10) * (i + 1)
到height - height / 10 + (height / 10) * i
范围。
一种快速而老套的方法是将这些值乘以一个可以缩放波高的值。
更好的是,您可以将指令封装到一个可重用的函数中,该函数可以使用参数进行配置。
你也可以看看这个detailed answer on drawing sine waves,记住你可以将波相加/相乘得到不同的形状。
https://stackoverflow.com/questions/65620844
复制相似问题