Ez az oldal nem koncepció, hanem futó kód. Ami itt látszik, az bemásolható a kamadochef.com főoldalába. Alul ott a pontos ok, amiért a CSS-elforgatásos út nem hozható tökéletesre, és mi kell a valódi 3D-s fedélnyitáshoz.
Desktopon vidd rá a kurzort, mobilon egyszerűen görgess ide. Ugyanaz a két trigger, amit Beatrix is megírt, csak nem egy lapos képet döntünk meg, hanem két HIVATALOS stúdiófotó között úsztatunk át: csukott fedél és nyitott fedél. Minden pixel valódi termék.
Ennyi az egész. Nincs benne könyvtár, nincs benne build, és nem tölt be semmit külső helyről.
<!-- HTML: two stacked images inside one figure --> <div class="kc"> <figure> <img class="closed" src="19red_main.jpg" alt="..."> <img class="open" src="19red_open.jpg" alt="..." loading="lazy"> </figure> </div> /* CSS: stack them, fade the top one out */ .kc figure{position:relative;aspect-ratio:1200/848} .kc figure img{position:absolute;inset:0;width:100%;height:100%; object-fit:contain;transition:opacity .45s cubic-bezier(.22,.61,.36,1)} .kc figure img.open{opacity:0} /* desktop: hover. Guarded so touch devices never get a stuck hover state. */ @media (hover:hover){ .kc:hover figure img.closed{opacity:0} .kc:hover figure img.open {opacity:1} } /* mobile: the observer below adds .seen when the card scrolls into view */ .kc.seen figure img.closed{opacity:0} .kc.seen figure img.open {opacity:1} // JS: mobile only, opens the lid when the card is ~55% visible. // It keeps .seen (does not toggle back), so the lid stays open once reached. if (!window.matchMedia('(hover:hover)').matches) { const io = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('seen'); io.unobserve(e.target); } }); }, { threshold: 0.55 }); document.querySelectorAll('[data-kc]').forEach(el => io.observe(el)); }
A hatás azon áll vagy bukik, hogy a csukott és a nyitott fotó ugyanabból a beállításból
készült-e: ha a grill mérete vagy helye eltér a két képen, akkor nem a fedél nyílik, hanem az egész
grill ugrik egyet. Lemértem mind az öt fotópárt, és két csoport van.
Azonnal használható: Classic 19 Red és Shadow (a két fotó lépték-eltérése 0,3 és 4,5 százalék,
a termék vízszintes közepe 1 százalékon belül egyezik) - ez a kettő van fent a mintán.
Előbb egységes kivágás kell: 22 Red (a nyitott kép 1,6-szer nagyobb léptékű), KC13 és
Premium 19 (ezeknél már a képvászon mérete is más). Ezeket nem elég egymásra tenni, előbb közös
kivágásba kell hozni őket, különben a váltásnál ugrik a termék.
Megpróbáltam ezt automatikusan megoldani (a kocsi talpára illesztve), de a végeredmény ránézésre
rosszabb lett, mint a kiindulás, ezért nem tettem be. Ez kézi kivágást kíván, szólj ha kell.
A @media (hover:hover) nélkül érintőképernyőn beragad a hover-állapot, és a fedél
nyitva marad az első koppintás után. A loading="lazy" pedig csak a nyitott képen legyen rajta,
a csukotton ne, mert az a hajtás fölött van.
Kilenc modell van kész, forgatható és zoomolható, desktopon és mobilon egyaránt.
Nem kell hozzá új fejlesztés, csak be kell emelni. Az AR kódban be van kötve mind a kilencre
(ios-src + ar-modes="webxr scene-viewer quick-look"), és az USDZ-fájlok is
ott vannak.
Apple saját ellenőrzőjével (usdchecker --arkit) ma megnéztem a hivatalos oldal
mind a kilenc AR-fájlját: 9-ből 9 átment. Korábban ugyanez a kilenc fájl megbukott,
mert a textúrák WebP formátumúak voltak, amit az AR nem fogad el. A kollégánk azóta újraexportálta
őket, és az ellenőrző ezt most igazolja. Ami még nincs igazolva: hogy egy valódi
iPhone-on el is indul. Ezért az AR ma „a fájlok megfelelnek és be van kötve", nem
„ki van próbálva". Amikor tesztelitek: iPhone-on Safariban nyissátok meg, mert a Telegram
és a Messenger beépített böngészőjében a Quick Look nem indul el.
A teljes, több modellt és színváltozatot kezelő oldal: kamadochef-3d.pages.dev - éles használatra ezt vegyétek, ez a hivatalos.
A fenti nézet a modell saját másolatát használja (assets/model.glb), hogy ez a
mintaoldal akkor is stabil maradjon, ha a hivatalos oldalon dolgoznak. A másolat bájtra azonos az
ottanival. Az AR-gomb viszont szándékosan a hivatalos fájlra mutat, mert ha valaki iPhone-on
teszteli, az igazi fájlt kell tesztelnie, nem egy másolatot.
<script type="module" src="https://unpkg.com/@google/model-viewer@3.5.0/dist/model-viewer.min.js"></script>
<model-viewer src="model.glb" ios-src="model-v2.usdz" ar ar-modes="webxr scene-viewer quick-look"
camera-controls touch-action="pan-y"
shadow-intensity="1" exposure="1.05"></model-viewer>
Megnéztem a kc_lidopen.html-t. A technika ez volt: egy beágyazott PNG-re
transform: translateY(-8%) rotateX(26deg), hover és IntersectionObserver triggerrel. A triggerek jók,
a probléma egy szinttel lejjebb van.
Ez is járható út, csak nem a mostani fájlokból. Megmértem a kilenc GLB-t: mindegyikben 0 animáció van, és összesen 2 node, vagyis a fedél nincs külön geometriaként leválasztva. Ahhoz, hogy nyíljon, három dolog kell.
lid_open néven.<model-viewer animation-name="lid_open">, és hoverre/görgetésre
modelViewer.play({repetitions:1}).A mostani modellek nyitott felületek, nem zárt testek: a 22 colos fájlban 58 831 pont és 100 263 lap mellett 16 669 perem-él van. Ez azt jelenti, hogy a grillnek nincs megmodellezve a belseje. Ha a fedelet felnyitnánk, nem a rács és a tűztér bukkanna elő, hanem egy üres héj. Vagyis a zsanéros nyitáshoz nem elég szétvágni a meglévő modellt, kell hozzá egy belsővel együtt modellezett példány. Ez ugyanaz a hiányzó-információ probléma, mint a lapos fotónál, csak három dimenzióban.
A belsővel együtt modellezett, nagy felbontású példány a gyártói CAD megérkezésére vár. Addig a fenti fotós megoldás az, ami ma élesíthető, és ez egybevág azzal, amit Beatrix is írt: amíg a forgós kép nem élethű, addig maradjon a sima termékkép.