Nicole Guernsey
Product Design Leadership

Crafting tomorrow, with love and magic. Passionate creator & innovator dedicated to transforming ideas into impactful realities.

I’m currently a Principal Product Designer at Matterport, creating the future of immersive experiences in digital twins. I lead our XR tooling, generative AI, and datafication initiatives.

I've spent 14+ years delivering outstanding solutions and making friends along the way.

I'm currently open for collabs, mentoring, speaking, and anything that needs order from chaos.

Design Strategy & Leadership at Matterport
Project Genesis, Innovation Strategy

AI / ML

3D / XR

Disrupting the landscape of interior design, architecture, and space planning with enchanting AI solutions.

✦ U.S. Patent Application Serial No. 18/742,947, entitled “SYSTEMS AND METHODS FOR DEFURNISHING AND FURNISHING SPACES, AND REMOVING OBJECTS FROM SPACES,” filed on June 13, 2024.

✦ This work directly lead to our acquisition in 2024.

Design Strategy & Leadership at Matterport
Project Genesis, Innovation Strategy

AI / ML

3D / XR

Disrupting the landscape of interior design, architecture, and space planning with enchanting AI solutions.

✦ U.S. Patent Application Serial No. 18/742,947, entitled “SYSTEMS AND METHODS FOR DEFURNISHING AND FURNISHING SPACES, AND REMOVING OBJECTS FROM SPACES,” filed on June 13, 2024.

✦ This work directly lead to our acquisition in 2024.

Nicole Guernsey

Product Design Leadership

219.916.0678

nguernsey.ux@gmail.com

<canvas class="fireworks" width="3692" height="2280"></canvas>
body{
	background-color: desaturate(darken(#fff, 50%), 60%);
}
var fireworks = (function() {

  var canvasEl = document.querySelector('.fireworks');
  var ctx = canvasEl.getContext('2d');
  var numberOfParticules = Number(location.href.split('?')[1]) || 40;
  var pointerX = 0;
  var pointerY = 0;
  var tap = ('ontouchstart' in window || navigator.msMaxTouchPoints) ? 'touchstart' : 'mousedown';
  var colors = ['#FFf', '#ababab', '#fff', '#ababab'];

  function setCanvasSize() {
    canvasEl.width = window.innerWidth * 2;
    canvasEl.height = window.innerHeight * 2;
    canvasEl.style.width = window.innerWidth + 'px';
    canvasEl.style.height = window.innerHeight + 'px';
    canvasEl.getContext('2d').scale(2, 2);
  }

  function updateCoords(e) {
    pointerX = e.clientX || e.touches[0].clientX;
    pointerY = e.clientY || e.touches[0].clientY;
  }

  function setParticuleDirection(p) {
    var angle = anime.random(0, 360) * Math.PI / 180;
    var value = anime.random(50, 180);
    var radius = [-1, 1][anime.random(0, 1)] * value;
    return {
      x: p.x + radius * Math.cos(angle),
      y: p.y + radius * Math.sin(angle)
    }
  }

  function createParticule(x,y) {
    var p = {};
    p.x = x;
    p.y = y;
    p.color = colors[anime.random(0, colors.length - 1)];
    p.radius = anime.random(2, 8);
    p.endPos = setParticuleDirection(p);
    p.draw = function() {
      ctx.beginPath();
      ctx.arc(p.x, p.y, p.radius, 0, 2 * Math.PI, true);
      ctx.fillStyle = p.color;
      ctx.fill();
    }
    return p;
  }

  function createCircle(x,y) {
    var p = {};
    p.x = x;
    p.y = y;
    p.color = '#FFF';
    p.radius = 0.1;
    p.alpha = .5;
    p.lineWidth = 6;
    p.draw = function() {
      ctx.globalAlpha = p.alpha;
      ctx.beginPath();
      ctx.arc(p.x, p.y, p.radius, 0, 2 * Math.PI, true);
      ctx.lineWidth = p.lineWidth;
      ctx.strokeStyle = p.color;
      ctx.stroke();
      ctx.globalAlpha = 1;
    }
    return p;
  }

  function renderParticule(anim) {
    for (var i = 0; i < anim.animatables.length; i++) {
      anim.animatables[i].target.draw();
    }
  }

  function animateParticules(x, y) {
    var circle = createCircle(x, y);
    var particules = [];
    for (var i = 0; i < numberOfParticules; i++) {
      particules.push(createParticule(x, y));
    }
    anime.timeline().add({
      targets: particules,
      x: function(p) { return p.endPos.x; },
      y: function(p) { return p.endPos.y; },
      radius: 0.1,
      duration: anime.random(1200, 2200),
      easing: 'easeOutExpo',
      update: renderParticule
    })
    .add({
      targets: circle,
      radius: anime.random(80, 160),
      lineWidth: 0,
      alpha: {
        value: 0,
        easing: 'linear',
        duration: anime.random(600, 1200),  
      },
      duration: anime.random(1200, 2200),
      easing: 'easeOutExpo',
      update: renderParticule,
      offset: 0
    });
  }

  var render = anime({
    duration: Infinity,
    update: function() {
      ctx.clearRect(0, 0, canvasEl.width, canvasEl.height);
    }
  });

  document.addEventListener(tap, function(e) {
    window.human = true;
    render.play();
    updateCoords(e);
    animateParticules(pointerX, pointerY);
    ga('send', 'event', 'Fireworks', 'Click');
  }, false);

  window.addEventListener('resize', setCanvasSize, false);

  return {
    render: render,
    setCanvasSize: setCanvasSize,
    animateParticules: animateParticules
  }

})();

window.onload = function() {
  fireworks.setCanvasSize();
}