Stereoskopowy CSS

Przez jakiś czas blogowałem o tworzeniu różnego rodzaju efektów 3D przy wykorzystaniu CSS. W tym artykule pójdę o krok dalej i spróbuje sprawić, że ujęcia będą wyglądały bardziej trójwymiarowo.

Zobacz demo stereoskopowego sześcianu.

Stereoskopowe

Istnieje wiele technik używanych do wydobycia z ekranu obrazu 3D. Jedną z najstarszych jest zastosowanie czerwonego i zielonego (lub niebieskiego) filmu, który oglądany przez czerwone/zielone okulary tworzy efekt 3D. 

Old-style 3D effect

[Simurai[ włożył w to trochę pracy i stworzył świetną wtyczkę o nazwie CSS3D, aby to osiągnąć.

Wadą tego rozwiązania jest to, że film może być tylko monochromatyczny, ponieważ kolory są ograniczone do tych wykorzystywanych do stworzenia efektu 3D.

Stereoskopia ramię w ramię

Drugim podejściem zaprezentowania 3D jest zastosowanie umiejętności, którą niektórzy z nas posiadają czyli skrzyżowania oczu. Pomysł polega na prezentacji dwóch ujęć ramię w ramię, każda przedstawiona z innej perspektywy. Jeśli widz może skrzyżować oczy, dwa obrazy łączą się tworząc efekt 3D.

How two images combine to form a 3D version

Chociaż to nie zawsze działa, świetnie kiedy działa i nie ogranicza liczby kolorów, które zawiera ujęcie. Kilka fotografii, które ładnie pokazują ten efekt.

Aby spróbować, patrz na poniższy obraz z odległości około 60 centymetrów od monitora. Delikatnie skrzyżuj oczy aż dwa obrazy połączą się ze sobą i jeśli uda ci się wyrównać je prawidłowo, obraz powinien wyglądać jak 3D.

The finished stereoscopic 3D scene with just CSS

Ta technika podwójnych obrazów jest w szczególności używana w nowych okularach Oculus Rift. Nie posiadam ich, aby przetestować, ale sądzę, że jest możliwość wyświetlania stron w HTML, więc jakaś forma tej techniki może być tam przydatna.

Ostrzeżenie

To tylko mała uwaga, ale jeśli zamierzasz spędzić dużo czasu wpatrując się w ekran krzyżując oczy, możesz doświadczyć bólu głowy. Wiem, bo sam to robiłem. Jednak zdecydowanie warto!

Ustaw ujęcie

Zaczniemy od stworzenia prostego ujęcia 3D za pomocą HTML.

<div class="stage">
  <figure class="cube">
    <span class="back">S</span>
    <span class="top"></span>
    <span class="bottom"></span>
    <span class="left">3D!</span>
    <span class="right">S</span>
    <span class="front">C</span>
  </figure>
</div>

Mamy tutaj zawierający scenę div, która będzie działać jako scena, w której umieścimy sześcian, a niej figurę sześcianu. Sześcian składa się z 6 części.

"Scena" div jest potrzebna do ustanowienia przez przeglądarkę kilku ważnych ustawień związanych z 3D takich jak głębia ujęcia i kąt patrzenia na ujęcie. Te rzeczy ustawiamy za pomocą CSS.

.stage {
  width: 480px;
  height: 500px;
  margin: 10px auto;
  position: relative;
  perspective: 1600px;
}

CSS przedstawia scenę za pomocą kilku proporcji i wartości perspective. Perspektywa opisuje głębie ujęcia, małe wartości reprezentują bardziej ekstremalne rezultaty. W tym przypadku 1600 pikseli wygląda całkiem nieźle, ale możesz spróbować różnych wartości, aby zobaczyć jak wygląda ujęcie.

Budowanie sześcianu

Sześcian jest zbudowany z sześciu elementu. Korzystając z właściwości transform w CSS, możemy manipulować składowymi w przestrzeni 3D i umieścić je, gdzie chcemy. Jednakże najpierw musimy przekazać przeglądarce, że naszą intencją jest przemieszczanie elementów w przestrzeni 3D. Nasz kod CSS jest w stanie to osiągnąć.

.cube {
  transform-style: preserve-3d;
  transform-origin: 100px 50%;
  position: absolute;
  top: 120px;
  left: 140px;
}

Należy zwrócić tutaj na główne właściwości transform-style i transform-origin. Przekazują one przeglądarce, że ten i elementy podrzędne będą w stanie się przekształcać w kontekście "sceny" figure, jak również opisywać punkt względnie którego będzie przebiegać rotacja, skalowanie lub pochylanie.

Następnie musimy określić wymiary ścian sześcianu, a potem przenieść je na miejsce używając właściwości transform.

.cube span {
  color: white;
  display: block;
  font-size: 100px;
  height: 200px;
  line-height: 200px;
  opacity: 0.5;
  position: absolute;
  text-align: center;
  width: 200px;
}
.back {
  background-color: #f00;
  transform: rotateY(180deg) translateZ(100px);
}
.top {
  background-color: #ff7400;
  transform: rotateX(90deg) translateZ(100px);
}
.bottom {
  background-color: #aaa;
  box-shadow: 0 10px 100px rgba(0, 0, 0, 0.7);
  transform: rotateX(-90deg) translateZ(100px);
}
.left {
  background-color: #099;
  transform: rotateY(-90deg) translateZ(100px);
}
.right {
  background-color: #0c0;
  transform: rotateY(90deg) translateZ(100px);
}
.front {
  background-color: #ff0;
  transform: translateZ(100px);
}

Aby wszystko było bardziej czytelne, usunąłem tutaj prefiksy "-webkit" i "-moz" z właściwości transform.

Ten kod CSS opisuje ogólne zasady dla składowych, których szerokość wynosi na przykład 200 pikseli i posiada biały tekst. Zasady, które dotyczą obracania i pozycji każdej ściany wykorzystującej właściwość rotate i translate. Każda ściana posiada również kolor tła.

Tworzenie stereoskopii

Teraz gdy mamy ujęcie z obiektem 3D, możemy go sklonować i uczynić stereoskopowym. Rozpoczniemy kopiując kod HTML do tagu div left i right.

<div class="container">
  <div class="left">
    <div class="stage">
      <figure class="cube">
        <span class="back">S</span>
        <span class="top"></span>
        <span class="bottom"></span>
        <span class="left">3D!</span>
        <span class="right">S</span>
        <span class="front">C</span>
      </figure>
    </div>
  </div>

  <div class="right">
    <div class="stage">
      <figure class="cube">
        <span class="back">S</span>
        <span class="top"></span>
        <span class="bottom"></span>
        <span class="left">3D!</span>
        <span class="right">S</span>
        <span class="front">C</span>
      </figure>
    </div>
  </div>
</div>

Celem jest podzielenie ekranu na dwie części i umieszczenie dwóch sześcianów obok siebie. Ponownie skorzystamy z magii o nazwie CSS, aby osiągnąć cel.

.container {
  margin: 0 auto;
  width: 960px;
}

.left, .right {
  height: 100%;
  overflow: hidden;
  width: 50%;
}

.left {
  float: left;
}

.right {
  float: right;
}

Nasz przykład nie musi być wyświetlany na pełnym ekranie, więc ustawiłem go w kolumnie kontenera. Każdy tag div jest ustawiony na 50% szerokości i pływa odpowiednio na lewej i prawej stronie.

Teraz mamy dwa identyczne obiekty 3D. To nie koniec, ponieważ musimy dostosować je do różnych kątów dla każdego oka. Aby to wykonać, nadpiszemy każdą właściwość perspective-origin tagu stage.

.left .stage {
  perspective-origin: 63.5% -340px;
}

.right .stage {
  perspective-origin: 36.5% -340px;
}

Lewa scena otrzymała perspektywę około dwóch trzecich wzdłuż osi X, aby naśladować prawe oko, a prawa scena otrzymała wartość około jednej trzeciej. Poprawiłem je ręcznie, więc mogą wymagać dostosowania, aby działały zgodnie z twoim projektem.

Końcowy rezultat powinien zawierać dwie prawie identyczne ujęcia 3D w CSS w delikatnie różnych perspektywach.

The finished stereoscopic 3D scene with just CSS

Tutaj możesz obejrzeć animowaną stereoskopową wersję.