{"id":1533,"date":"2025-12-31T10:36:00","date_gmt":"2025-12-31T10:36:00","guid":{"rendered":"https:\/\/stuartcupit.com\/wordpress\/?p=1533"},"modified":"2026-08-29T15:53:02","modified_gmt":"2026-08-29T15:53:02","slug":"laser-target-practice-for-nike","status":"publish","type":"post","link":"https:\/\/stuartcupit.com\/wordpress\/?p=1533","title":{"rendered":"Laser Target Practice for Nike"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Solarflare was approached by Metallic to create a fun, interactive game for Nike&#8217;s launch of their new clothing range, Nocta. <br>I had previously used a technique where a laser pointer dot is tracked using just a webcam, and by carefully tuning the camera sensitivity settings, the camera could be made to only see the reflected laser dot and not the projected game image, enabling it to be tracked for 2D input.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Early on, I decided to try using Touch Designer for its quick dev workflow. Even though this was a game, it was a very tight 2-week build. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After some initial testing, the tracking technique was working great. The reflected laser dot was so much brighter than the projection that manually setting the exposure on the webcam meant it could be isolated. Some blob tracking and calibration to align the tracking image with the projected image, and voila! it worked. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The gameplay involved pointing the laser at the projected wall and aiming at floating targets. The game progresses through rounds, adding an extra target each round. Holding the laser pointer dot on the target reduces its life until it explodes and re-spawns. The more accurate you aim, the quicker the target explodes. Targets have a limited life before they expire and reduce your health. You keep playing with the game, getting progressively more targets expiring until you run out of health. The total time you remain alive and the number of targets you destroy all contribute to your score on the leaderboard. <\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"2160\" style=\"aspect-ratio: 3840 \/ 2160;\" width=\"3840\" controls src=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/251222_NOCTA_Case_16x9.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I did all the programming \/ nodeing in Touch, <a href=\"https:\/\/www.linkedin.com\/in\/sergiugopleac\/\">Sergiu<\/a> did all the motion graphics, <a href=\"https:\/\/www.benjaminheim.com\/\">Ben Heim<\/a> worked on the backgrounds. Using Touch was a great choice, meaning we could make live tweaks to the gameplay while the client was testing it on site. I pushed my TD knowledge beyond the last big project, refrAIme with state management, UI&#8217;s, etc. <\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"2048\" data-id=\"1542\" src=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-28-18_Samsung_S25Plus-1-945x2048.jpg\" alt=\"\" class=\"wp-image-1542\" srcset=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-28-18_Samsung_S25Plus-1-945x2048.jpg 945w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-28-18_Samsung_S25Plus-1-185x400.jpg 185w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-28-18_Samsung_S25Plus-1-768x1664.jpg 768w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-28-18_Samsung_S25Plus-1-709x1536.jpg 709w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-28-18_Samsung_S25Plus-1.jpg 1080w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2049\" height=\"1154\" data-id=\"1544\" src=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-31-02_Samsung_S25Plus-1-2049x1154.jpg\" alt=\"\" class=\"wp-image-1544\" srcset=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-31-02_Samsung_S25Plus-1-2049x1154.jpg 2049w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-31-02_Samsung_S25Plus-1-400x225.jpg 400w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-31-02_Samsung_S25Plus-1-768x432.jpg 768w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-31-02_Samsung_S25Plus-1-1536x865.jpg 1536w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-12-31-02_Samsung_S25Plus-1-2048x1153.jpg 2048w\" sizes=\"auto, (max-width: 2049px) 100vw, 2049px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2049\" height=\"1154\" data-id=\"1543\" src=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-16-41-55_Samsung_S25Plus-1-2049x1154.jpg\" alt=\"\" class=\"wp-image-1543\" srcset=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-16-41-55_Samsung_S25Plus-1-2049x1154.jpg 2049w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-16-41-55_Samsung_S25Plus-1-400x225.jpg 400w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-16-41-55_Samsung_S25Plus-1-768x432.jpg 768w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-16-41-55_Samsung_S25Plus-1-1536x865.jpg 1536w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Photo-2025-12-17-16-41-55_Samsung_S25Plus-1-2048x1153.jpg 2048w\" sizes=\"auto, (max-width: 2049px) 100vw, 2049px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2049\" height=\"1321\" data-id=\"1541\" src=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-13-090036-2049x1321.png\" alt=\"\" class=\"wp-image-1541\" srcset=\"https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-13-090036-2049x1321.png 2049w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-13-090036-400x258.png 400w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-13-090036-768x495.png 768w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-13-090036-1536x990.png 1536w, https:\/\/stuartcupit.com\/wordpress\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-13-090036-2048x1320.png 2048w\" sizes=\"auto, (max-width: 2049px) 100vw, 2049px\" \/><\/figure>\n<\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Solarflare was approached by Metallic to create a fun, interactive game for Nike&#8217;s launch of their new clothing range, Nocta. I had previously used a technique where a laser pointer dot is tracked using just a webcam, and by carefully tuning the camera sensitivity settings, the camera could be made to only see the reflected&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1534,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,5],"tags":[],"class_list":["post-1533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interactive-media","category-programming"],"_links":{"self":[{"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1533"}],"version-history":[{"count":6,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1533\/revisions"}],"predecessor-version":[{"id":1553,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1533\/revisions\/1553"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/1534"}],"wp:attachment":[{"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stuartcupit.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}