<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>3D on Vijay Kodam</title><link>https://vijay.eu/tags/3d/</link><description>Recent content in 3D on Vijay Kodam</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 10 Jun 2026 12:00:00 +0300</lastBuildDate><atom:link href="https://vijay.eu/tags/3d/index.xml" rel="self" type="application/rss+xml"/><item><title>Retro Racer</title><link>https://vijay.eu/projects/retro-racer/</link><pubDate>Wed, 10 Jun 2026 12:00:00 +0300</pubDate><guid>https://vijay.eu/projects/retro-racer/</guid><description>&lt;div class="retro-racer"&gt;
&lt;h1 class="racer-title"&gt;Retro Racer&lt;/h1&gt;
&lt;p class="racer-subtitle"&gt;A 3D arcade racer. One lap, against the clock.&lt;/p&gt;
&lt;div class="racer-frame"&gt;
&lt;canvas id="racerCanvas"&gt;&lt;/canvas&gt;
&lt;div class="racer-banner hidden" id="racerBanner" aria-live="polite"&gt;&lt;/div&gt;
&lt;div class="racer-hud" aria-live="off"&gt;
&lt;div class="hud-item"&gt;
&lt;span class="hud-label"&gt;Time&lt;/span&gt;
&lt;span class="hud-value" id="hudTime"&gt;0:00.0&lt;/span&gt;
&lt;/div&gt;
&lt;div class="hud-item hud-item--speed"&gt;
&lt;span class="hud-label"&gt;Speed&lt;/span&gt;
&lt;span class="hud-value" id="hudSpeed"&gt;0 km/h&lt;/span&gt;
&lt;/div&gt;
&lt;div class="hud-item"&gt;
&lt;span class="hud-label"&gt;Progress&lt;/span&gt;
&lt;span class="hud-value" id="hudProgress"&gt;0%&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="racer-overlay" id="racerStart"&gt;
&lt;h2&gt;Retro Racer&lt;/h2&gt;
&lt;p&gt;Complete one lap as fast as you can. Dodge traffic and stay on the road - grass and crashes will slow you down.&lt;/p&gt;
&lt;p&gt;Arrow keys or WASD to drive. On touch devices, hold gas/brake with your left thumb and steer with your right.&lt;/p&gt;
&lt;button class="racer-btn" id="racerStartBtn" type="button" disabled&gt;Start Race&lt;/button&gt;
&lt;p class="racer-loading" id="racerLoading"&gt;Loading 3D assets...&lt;/p&gt;
&lt;p class="racer-best" id="racerStartBest"&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="racer-overlay hidden" id="racerResults"&gt;
&lt;h2&gt;Finish!&lt;/h2&gt;
&lt;p class="racer-result-time" id="racerResultTime"&gt;&lt;/p&gt;
&lt;p class="racer-best" id="racerResultBest"&gt;&lt;/p&gt;
&lt;button class="racer-btn" id="racerAgainBtn" type="button"&gt;Race Again&lt;/button&gt;
&lt;/div&gt;
&lt;div class="racer-cinematic hidden" id="racerCinematic" aria-hidden="true"&gt;
&lt;div class="racer-letterbox racer-letterbox--top"&gt;&lt;/div&gt;
&lt;div class="racer-letterbox racer-letterbox--bottom"&gt;&lt;/div&gt;
&lt;div class="racer-flyby-label"&gt;
&lt;span class="racer-flyby-name"&gt;Mazda Miata&lt;/span&gt;
&lt;span class="racer-flyby-sub"&gt;MX-5 NA&lt;/span&gt;
&lt;/div&gt;
&lt;button class="racer-skip-btn" id="racerSkipBtn" type="button"&gt;Skip &amp;rsaquo;&amp;rsaquo;&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="racer-touch"&gt;
&lt;div class="touch-cluster touch-cluster--drive" aria-label="Speed controls (left thumb)"&gt;
&lt;button class="touch-btn touch-btn--gas" id="racerBtnGas" type="button" aria-label="Accelerate"&gt;GAS&lt;/button&gt;
&lt;button class="touch-btn touch-btn--brake" id="racerBtnBrake" type="button" aria-label="Brake"&gt;BRAKE&lt;/button&gt;
&lt;/div&gt;
&lt;div class="touch-cluster touch-cluster--steer" aria-label="Steering controls (right thumb)"&gt;
&lt;button class="touch-btn touch-btn--arrow" id="racerBtnLeft" type="button" aria-label="Steer left"&gt;&amp;larr;&lt;/button&gt;
&lt;button class="touch-btn touch-btn--arrow" id="racerBtnRight" type="button" aria-label="Steer right"&gt;&amp;rarr;&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class="racer-note"&gt;Built with vanilla JavaScript and &lt;a href="https://threejs.org/" rel="noopener"&gt;three.js&lt;/a&gt;. Car models "&lt;a href="https://sketchfab.com/3d-models/mazda-miata-mx-5-na-d51fcd44b74f4daf8012c41e0400c041" rel="noopener"&gt;Mazda Miata MX-5 NA&lt;/a&gt;" and "&lt;a href="https://sketchfab.com/3d-models/toyota-ae86-trueno-fe02fba6302e450ea8424591493341ea" rel="noopener"&gt;Toyota AE86 Trueno&lt;/a&gt;" by Lexyc16 on Sketchfab (CC-BY 4.0). Textures and lighting from &lt;a href="https://polyhaven.com/" rel="noopener"&gt;Poly Haven&lt;/a&gt; (CC0). Your best lap time is stored locally in your browser.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Hand-Gesture 3D Car Viewer</title><link>https://vijay.eu/projects/car-concept/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0300</pubDate><guid>https://vijay.eu/projects/car-concept/</guid><description>&lt;div class="car-concept-container"&gt;
&lt;header class="car-header"&gt;
&lt;div class="car-header__content"&gt;
&lt;h1 class="car-header__title"&gt;Hand-Gesture 3D Car Viewer&lt;/h1&gt;
&lt;p class="car-header__subtitle"&gt;&lt;strong&gt;Uses your camera to detect hand gestures&lt;/strong&gt; - Open hand to rotate, make a fist and move to zoom&lt;/p&gt;
&lt;/div&gt;
&lt;div class="car-header__status"&gt;
&lt;span class="status-badge" id="statusHand"&gt;Hand: Not detected&lt;/span&gt;
&lt;span class="status-badge status-badge--muted" id="statusGesture"&gt;Use mouse or enable hand tracking&lt;/span&gt;
&lt;/div&gt;
&lt;/header&gt;
&lt;div class="viewer-container"&gt;
&lt;canvas id="threeCanvas"&gt;&lt;/canvas&gt;
&lt;div class="loading-overlay" id="loadingOverlay"&gt;
&lt;div class="loading-spinner"&gt;&lt;/div&gt;
&lt;p&gt;Loading 3D model...&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="webcam-preview" id="webcamPreview"&gt;
&lt;div class="webcam-preview__stack"&gt;
&lt;video id="webcam" playsinline autoplay muted&gt;&lt;/video&gt;
&lt;canvas id="overlay2d"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;button class="webcam-btn" id="btnWebcam" type="button"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="16" height="16"&gt;
&lt;path stroke-linecap="round" stroke-linejoin="round" d="M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z" /&gt;
&lt;path stroke-linecap="round" stroke-linejoin="round" d="M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z" /&gt;
&lt;/svg&gt;
Enable Hand Tracking
&lt;/button&gt;
&lt;div class="webcam-error hidden" id="webcamError"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="instructions" id="instructions"&gt;
&lt;div class="instructions__item"&gt;
&lt;span class="instructions__icon"&gt;🖱️&lt;/span&gt;
&lt;span&gt;Drag to rotate, scroll to zoom&lt;/span&gt;
&lt;/div&gt;
&lt;div class="instructions__item"&gt;
&lt;span class="instructions__icon"&gt;✋&lt;/span&gt;
&lt;span&gt;Open hand: rotate car&lt;/span&gt;
&lt;/div&gt;
&lt;div class="instructions__item"&gt;
&lt;span class="instructions__icon"&gt;✊&lt;/span&gt;
&lt;span&gt;Fist + move: zoom in/out&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Hand-Gesture Cricket</title><link>https://vijay.eu/projects/cricket-bowling/</link><pubDate>Sat, 10 Jan 2026 10:00:00 +0300</pubDate><guid>https://vijay.eu/projects/cricket-bowling/</guid><description>&lt;div class="cricket-bowling-container"&gt;
&lt;header class="cricket-header"&gt;
&lt;div class="brand"&gt;
&lt;div class="brand__title"&gt;Hand-Gesture Cricket&lt;/div&gt;
&lt;div class="brand__subtitle"&gt;&lt;strong&gt;Uses your camera to detect hand gestures&lt;/strong&gt; - Grip, bowl, and hit the wickets with real hand motions!&lt;/div&gt;
&lt;/div&gt;
&lt;div class="status" aria-live="polite"&gt;
&lt;span class="badge badge--phase" id="statusPhase"&gt;Ready&lt;/span&gt;
&lt;span class="badge" id="statusSpeed"&gt;Speed: --&lt;/span&gt;
&lt;span class="badge" id="statusBallType"&gt;--&lt;/span&gt;
&lt;span class="badge badge--score" id="statusScore"&gt;Wickets: 0/0&lt;/span&gt;
&lt;span class="badge badge--muted" id="statusFps"&gt;FPS: --&lt;/span&gt;
&lt;/div&gt;
&lt;/header&gt;
&lt;main class="cricket-layout"&gt;
&lt;section class="panel"&gt;
&lt;div class="panel__header"&gt;
&lt;h2 class="panel__title"&gt;Camera&lt;/h2&gt;
&lt;div class="panel__actions"&gt;
&lt;button class="btn btn--primary" id="btnWebcam" type="button"&gt;Enable webcam&lt;/button&gt;
&lt;button class="btn" id="btnOverlay" type="button" aria-pressed="true"&gt;Overlay: On&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="media"&gt;
&lt;div class="media__stack"&gt;
&lt;video id="webcam" playsinline autoplay muted&gt;&lt;/video&gt;
&lt;canvas id="overlay2d" class="overlay2d" aria-hidden="true"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class="hint" id="gameHint"&gt;
&lt;strong&gt;How to play:&lt;/strong&gt;&lt;br&gt;
1. Show your hand to the camera&lt;br&gt;
2. Make a bowling motion (arm forward/down)&lt;br&gt;
3. Release naturally at the end&lt;br&gt;
4. Try to hit the wickets!
&lt;/div&gt;
&lt;div class="result-display hidden" id="resultDisplay"&gt;
&lt;div class="result-icon" id="resultIcon"&gt;&lt;/div&gt;
&lt;div class="result-text" id="resultText"&gt;&lt;/div&gt;
&lt;div class="result-details" id="resultDetails"&gt;&lt;/div&gt;
&lt;div class="result-hint"&gt;Show hand to bowl again&lt;/div&gt;
&lt;/div&gt;
&lt;div class="error hidden" id="cameraError" role="alert"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="game-stats"&gt;
&lt;div class="stat-row"&gt;
&lt;span class="stat-label"&gt;Fast balls:&lt;/span&gt;
&lt;span class="stat-value" id="statFast"&gt;0&lt;/span&gt;
&lt;/div&gt;
&lt;div class="stat-row"&gt;
&lt;span class="stat-label"&gt;Spin balls:&lt;/span&gt;
&lt;span class="stat-value" id="statSpin"&gt;0&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="debug-panel hidden" id="debugPanel"&gt;
&lt;div class="debug-header"&gt;
&lt;strong&gt;DEBUG MODE&lt;/strong&gt;
&lt;div&gt;
&lt;button class="btn btn--small" id="btnDebugClear" type="button"&gt;Clear Recording&lt;/button&gt;
&lt;button class="btn btn--small" id="btnDebugClose" type="button"&gt;X&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id="debugOutput" style="font-size: 11px; margin: 0; white-space: pre-wrap;"&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;button class="btn btn--small" id="btnDebug" type="button" style="margin-top: 8px;"&gt;Show Debug&lt;/button&gt;
&lt;/section&gt;
&lt;section class="panel"&gt;
&lt;div class="panel__header"&gt;
&lt;h2 class="panel__title"&gt;3D Scene&lt;/h2&gt;
&lt;div class="panel__actions"&gt;
&lt;button class="btn" id="btnReset" type="button"&gt;Reset Game&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="scene"&gt;
&lt;canvas id="threeCanvas"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;footer class="cricket-footer"&gt;
&lt;span class="muted"&gt;Tip: Good lighting helps hand tracking. Works best on Chrome/Safari.&lt;/span&gt;
&lt;/footer&gt;
&lt;/section&gt;
&lt;/main&gt;
&lt;/div&gt;</description></item></channel></rss>