#p5.js #noise
#p5.js #шум
Вопрос:
У меня есть сетка плиток, которые медленно меняют цвета между красным и зеленым. Как мне сделать так, чтобы скорость изменения цвета зависела от mouseX, чтобы малый mouseX равнялся более быстрым изменениям цвета.
function colorGrid(){
var stepSize = 20;
var green = color(0, 255, 0);
var red = color(255, 0, 0);
for(var x=0;x<25;x ){
for(var y=0;y<25;y ){
var tX = (x*stepSize frameCount)*0.003;
var tY = (y*stepSize frameCount)*0.003;
var t = noise(tX, tY);
var c = lerpColor(green, red, t);
fill(c);
noStroke();
rect(x*stepSize,y*stepSize,stepSize,stepSize);
}
}
}
Комментарии:
1. Вашему вопросу было бы полезно получить более подробную информацию, не совсем ясно, что вы подразумеваете под скоростью изменения цвета, зависящей от mouseX. Вы просто хотите заменить
frameCount
наmouseX
в своихtX
иtY
инициализациях? Или вы ищете что-то еще?2. @statox Сделайте так, чтобы маленький mouseX равнялся более быстрым изменениям цвета, а большой mouseX — более медленным изменениям цвета. Скорость изменения цвета будет зависеть от положения моего mouseX.
Ответ №1:
Что вы хотите изменить, так это скорость, с которой вы перемещаетесь в шумовом пространстве. На данный момент вы используете frameCount
для временного перемещения в этом пространстве.
Поэтому, чтобы изменить скорость, с которой вам нужно играть frameCount
. Один из способов сделать это — сопоставить mouseX
между frameCount * 1
(вашим текущим поведением) и frameCount * X
where X > 1
.
function colorGrid(){
var stepSize = 20;
var green = color(0, 255, 0);
var red = color(255, 0, 0);
// Creating the factor
const temporalOffsetFactor = map(mouseX, 0, width, 1, 50);
for(var x=0;x<25;x ){
for(var y=0;y<25;y ){
var tX = (x*stepSize frameCount*temporalOffsetFactor)*0.003; // Using the new factor
var tY = (y*stepSize frameCount*temporalOffsetFactor)*0.003;
var t = noise(tX, tY);
var c = lerpColor(green, red, t);
fill(c);
noStroke();
rect(x*stepSize,y*stepSize,stepSize,stepSize);
}
}
}
Смотрите это в действии здесь
Редактировать Чтобы избежать «прыжков» карты при перемещении мыши, возможным решением является отключение mouseX для получения его значения только каждые X мс (я обнаружил, что 500 мс работает довольно хорошо). Таким образом, вы могли бы добавить это в свой код перед вызовом setup()
let debouncedMouseX = 1;
setInterval(() => (debouncedMouseX = mouseX), 1000);
и заменить mouseX
на debouncedMouseX
в строке const temporalOffsetFactor = map(mouseX, 0, width, 1, 50);
Это может быть не идеально, но это может сработать. Я соответствующим образом обновил свой codepend.
Комментарии:
1. Хорошо, я не знаю, глупый ли это вопрос, но есть ли способ, чтобы цвета не перемещались со сверхскоростью каждый раз, когда я перемещаю курсор мыши? Например, скорость изменения цвета mouseX отлично работает, если моя мышь канцелярская, но каждый раз, когда я ее перемещаю, все цвета выходят из строя. А затем я перестаю двигаться, и все снова в порядке.
2. @ahmadalibin Проверьте мое редактирование Я попытался добавить некоторые изменения, чтобы избежать такого рода скачков.
3. Я использую скобки, которые используют p5.js и у него есть ошибка синтаксического анализа: неожиданный токен с этой строкой
setInterval(() => (debouncedMouseX = mouseX), 1000);
.4. Как вы можете видеть здесь, в строке 2 это работает нормально. «Неожиданный токен» означает, что вы неправильно отформатировали код перед этой строкой, проверьте, нет ли пропущенных кавычек или присваивания или любой синтаксической ошибки.
5. Хорошо, я все еще могу компилироваться даже с ошибкой. Я не уверен, лучше ли это с debounce или без debounce, так как это выглядит действительно прерывисто, но это работает, останавливая «прыжки», поэтому я думаю, что это тот, который я предпочитаю. В любом случае, спасибо за вашу помощь. Вы были очень полезны.