Сделать скорость изменения цвета зависящей от mouseX

#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, так как это выглядит действительно прерывисто, но это работает, останавливая «прыжки», поэтому я думаю, что это тот, который я предпочитаю. В любом случае, спасибо за вашу помощь. Вы были очень полезны.