Ответы пользователя по тегу Canvas
  • Как в canvas расположить два элемента рядом?

    profesor08
    @profesor08 Куратор тега JavaScript
    Ну так вычисляй координаты следующей картинки. Это ширина предыдущей.

    let prevX = 0;
    
    function handleImage(e){
     ...
      ctx.drawImage(img,  prevX, 0, 300, 300)
      prevX = img.width;
    ...
    }
    Ответ написан
    2 комментария
  • Как изменить курсор при наведении в JavaScript?

    profesor08
    @profesor08 Куратор тега JavaScript
    Вешаешь на канвас addEventListener("mousemove ", e => {});, где e это объект события мыши, там есть координаты, по которым двигается курсор, проверяй попадают ли оно в площадь, занимаемую картинкой на канвасе или нет.
    Ответ написан
    Комментировать
  • Анимация в canvas на JS с помощью нескольких спрайтов?

    profesor08
    @profesor08 Куратор тега JavaScript
    Вот загружаешь свои 17 картинок в 17 объектов и рисуешь по очереди.
    Ответ написан
    Комментировать
  • Как поместить svg маркер на canvas слой в leaflet?

    profesor08
    @profesor08
    В доках все есть. В гугле все есть. На stackoverflow все есть.

    https://leafletjs.com/examples/custom-icons/

    var svg = '' // insert your own svg
    var iconUrl = 'data:image/svg+xml;base64,' + btoa(svg);
    
    var icon = L.icon( {
        iconUrl: iconUrl,
    } );
    Ответ написан
  • Как можно создать такую анимацию? Точнее с помощью чего?

    profesor08
    @profesor08 Куратор тега JavaScript
    Создается N блоков, каждому задается один и тот-же фон, но со смещением, чтоб выглядело все это дело как единая картинка. Этим блокам задается одинаковый transform: skew, чтоб они стали под наклоном, а при анимации сдвигают их по одному с какой-то задержкой. Создавать блоки программно или руками дело твое.
    Ответ написан
    Комментировать
  • Как создать подобный эффект перехода и анимацию?

    profesor08
    @profesor08
    Немного THREE.js, немного glsl и немного gsap.

    И собрать это вот так: https://www.youtube.com/watch?v=I9A4xTT2rh0

    Но можешь расслабиться, разобраться в этом деле тебе пока не светит, в ближайшее время, раз ты задал такой вопрос, вместо того чтоб сразу полезть в devtools и разбираться что да как там. Все это дело сильно завязано на математике, тригонометрия, синусы, косинусы и тд., и умении ими манипулировать.

    precision highp float;
    float mirrored(float v) {
     float m = mod(v, 2.0);
     return mix(m, 2.0 - m, step(1.0, m));
    }
    
    vec2 mirrored(vec2 v) {
     vec2 m = mod(v, 2.0);
     return mix(m, 2.0 - m, step(1.0, m));
    }
    vec3 mirrored(vec3 v) {
     vec3 m = mod(v, 2.0);
     return mix(m, 2.0 - m, step(1.0, m));
    }
    vec4 mirrored(vec4 v) {
     vec4 m = mod(v, 2.0);
     return mix(m, 2.0 - m, step(1.0, m));
    }
    float tri(float v) {
     return mix(v, 1.0 - v, step(0.5, v)) * 2.0;
    }
    vec2 tri(vec2 v) {
     return mix(v, 1.0 - v, step(0.5, v)) * 2.0;
    }
    vec3 tri(vec3 v) {
     return mix(v, 1.0 - v, step(0.5, v)) * 2.0;
    }
    vec4 tri(vec4 v) {
     return mix(v, 1.0 - v, step(0.5, v)) * 2.0;
    }
    #define PI_2 6.283185307179586
    #define PI_H 1.5707963267948966
    varying vec2 vUv;
    varying vec2 vUv1;
    varying vec2 vUv2;
    uniform vec4 time;
    uniform float progress;
    uniform vec3 mask;
    uniform float rotation;
    uniform vec4 translateDelay;
    uniform vec2 accel;
    uniform vec4 waveAmpFreq;
    uniform vec4 waveSpeedBlend;
    uniform vec4 pixels;
    uniform sampler2D texture1;
    uniform sampler2D texture2;
    void main(void) {
     vec2 uv = gl_FragCoord.xy / pixels.xy;
     float p = fract(progress + mask.z);
    
     float delayValue = p * (1.0 + translateDelay.z + translateDelay.w) - uv.y * translateDelay.w - (1.0 - uv.x) * translateDelay.z;
     delayValue = clamp(delayValue, 0.0, 1.0);
    
     vec2 translateValue = p + delayValue * accel;
     vec2 translateValue1 = translateDelay.xy * translateValue;
     vec2 translateValue2 = translateDelay.xy * (translateValue - 1.0 - accel);
     vec2 w = sin(time.y * waveSpeedBlend.xy + vUv.yx * waveAmpFreq.zw) * waveAmpFreq.xy;
     vec2 xy = (tri(p) * waveSpeedBlend.z + tri(delayValue) * waveSpeedBlend.w) * w;
     vec2 uv1 = vUv1 + translateValue1 + xy;
     vec2 uv2 = vUv2 + translateValue2 + xy;
     vec4 rgba1 = texture2D(texture1, mirrored(uv1));
     vec4 rgba2 = texture2D(texture2, mirrored(uv2));
     vec4 rgba = mix(rgba1, rgba2, delayValue);
     rgba = mix(vec4(0.0, 0.0, 0.0, 1.0), rgba, mask.y);
     rgba = mix(vec4(0.0), rgba, float(abs(uv.y * 2.0 - 1.0) <= mask.x));
     rgba.rgb *= 0.7;
     gl_FragColor = rgba;
    
    }
    Ответ написан
    1 комментарий
  • Какую webgl библиотеку выбрать?

    profesor08
    @profesor08 Куратор тега JavaScript
    Ну ты либо берешь three.js, либо пилишь ручками. Выбор очевиден.
    Ответ написан
    Комментировать
  • Как в js динамически рисовать предметы?

    profesor08
    @profesor08 Куратор тега JavaScript
    Ну тут довольно все просто, если умеешь рисовать квадрат и отслеживать действия мыши (mousedown, mouseup, mousemove). При нажатии кнопки мыши записываешь координаты курсора, это и есть стартовая точка. Далее при движении мыши ты тоже получаешь координаты курсора, это и есть точка, куда рисовать. Остается только нарисовать. Чтоб это было динамически, придется рисовать на каждом кадре, очистил - нарисовал, очистил - нарисовал и тд.

    jsfiddle.net/profesor08/2rw8c7qg

    let canvas = document.createElement("canvas")
    let ctx = canvas.getContext("2d")
    
    document.body.appendChild(canvas);
    
    let x1 = 0, y1 = 0, x2 = 0, y2 = 0;
    let canDrawSelection = false;
    
    canvas.addEventListener("mousedown", function(e) {
    	canDrawSelection = true;
    	x1 = e.clientX;
    	y1 = e.clientY;
    	x2 = e.clientX;
    	y2 = e.clientY;
    });
    
    canvas.addEventListener("mouseup", function(e) {
    	canDrawSelection = false;
    });
    
    canvas.addEventListener("mousemove", function(e) {
    	x2 = e.clientX;
    	y2 = e.clientY;
    });
    
    function drawSelection() {
    	if (canDrawSelection === true) {
    		ctx.beginPath();
    		ctx.lineWidth="2";
    		ctx.strokeStyle="white";
    		ctx.rect(x1, y1, x2 - x1, y2 - y1);
    		ctx.stroke();
    	}
    }
    
    function render() {
    	ctx.canvas.width = window.innerWidth;
    	ctx.canvas.height = window.innerHeight;
    	ctx.fillStyle = "#2B2E35";
    	ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
      
    	drawSelection();
    }
    
    function animate() {
    	requestAnimationFrame(animate);
    	render();
    }
    
    animate();
    Ответ написан
    Комментировать
  • Как сделать точное вычисление физики гравитации на javascript в canvas методом Верле?

    profesor08
    @profesor08 Куратор тега JavaScript
    Ну нормально же работает, что не так то? Играйся с параметрами планет, расставляй их правильно, чтоб не улетали, задавай им правильную скорость, правильный вектор, правильную массу, правильный радиус орбиты. Для примера возьми нашу Солнечную систему в масштабе.

    А улетают они потому, что стартовое направление движения планеты направлено в сторону аттрактора, и пока она летит к нему, она набирает скорость, и в какой-то момент ее скорость будет достаточной для того, чтоб вырваться из гравитационного поля аттрактора и улететь прочь.

    Короче говоря, физическая модель у тебя есть, тебе достаточно подобрать параметры объектов.
    Ответ написан
    1 комментарий
  • Это вообще люди делают?

    profesor08
    @profesor08 Куратор тега CSS
    Все это на glsl шейдерах, я про фон, эффекты, модели и тд. THREE.js лишь для того, чтоб это все связать. Vue.js для управления контентом. Без знания тригонометрии и матана, такое сделать непосильно.

    Просто представить функцию, которая выполняется, миллионы раз за кадр, для одной отдельной точки, и в зависимости от, доступных ей, параметров рисует все что ты видишь на экране. Просто взрыв мозга.
    Ответ написан
    Комментировать
  • Как сделать такой стёрка-эффект ховера?

    profesor08
    @profesor08 Куратор тега CSS
    Тут два варианта, либо все рисовать на canvas, либо на svg path. На canvas проще, тут главное уметь рисовать круг с текстурой, ну а дальше понятно, много кругов, которые перекрывают фон.
    Ответ написан
    Комментировать
  • Видео в шапке сайта?

    profesor08
    @profesor08 Куратор тега JavaScript
    gif. Любое автовоспроизведение видео будет жестко заблочено.
    An AudioContext must be created or resumed after the document received a user gesture to enable audio playback.
    Ответ написан
    2 комментария
  • Как анимировать крылья у птички?

    profesor08
    @profesor08 Куратор тега CSS
    Берешь точки и перемещаешь их. Какой вопрос, такой ответ.
    Ответ написан
    Комментировать
  • Как сделать анимацию водяного пара с помощью canvas?

    profesor08
    @profesor08
    А попробуйте анимацией text-shadow на CSS. Можно очень интересные эффекты делать.
    Например вот: https://codepen.io/atnyman/pen/cgGuL
    Ответ написан
    1 комментарий