Movi Kanti Revo - Phần 1 - Xây dựng thế giới 3D

Biểu trưng của Movi Kanti Revo.

Movi.Kanti.Revo là một thử nghiệm Chrome cảm giác mới do Cirque du Soleil tạo ra và do Subatomic Systems phát triển, mang sự kỳ diệu của Cirque du Soleil đến với web thông qua các công nghệ web hiện đại.

Xây dựng thế giới 3D

Thử nghiệm được tạo chỉ bằng HTML5 và môi trường được xây dựng hoàn toàn bằng mã đánh dấu và CSS. Giống như các phần đã dựng sẵn trên sân khấu, div, img, video nhỏ và các phần tử khác được định vị trong không gian 3D bằng cách sử dụng CSS. Việc sử dụng API getUserMedia mới đã mang đến một cách hoàn toàn mới để tương tác với thử nghiệm, thay vì dùng bàn phím hoặc chuột, thư viện phát hiện khuôn mặt JavaScript sẽ theo dõi đầu của bạn và di chuyển môi trường cùng với bạn.

Tất cả các giai đoạn của web

Để tạo thử nghiệm này, tốt nhất bạn nên tưởng tượng trình duyệt là một giai đoạn và các phần tử như <div>, hình ảnh, video và các phần tử khác như là các phần được đặt trong không gian 3D bằng CSS. Mỗi phần tử hoặc phần tử cố định được đặt trên vùng hiển thị bằng cách áp dụng phép biến đổi 3D. Nếu bạn chưa quen thuộc với phép biến đổi translate3d, bạn cần có 3 tham số là X, Y và Z. X di chuyển phần tử dọc theo một đường ngang, Y di chuyển phần tử lên và xuống, còn Z di chuyển phần tử lại gần hoặc ra xa hơn. Ví dụ: khi áp dụng transform: translate3d(100px, -200px, 300px), phần tử sẽ di chuyển phần tử 100 pixel sang phải, xuống 200 pixel và tiến gần hơn 300 pixel về phía trình xem.

Xây dựng khán phòng

Hãy cùng xem cảnh cuối và xem cách kết hợp cảnh này. Tất cả cảnh được chia thành 3 vùng chứa chính: vùng chứa thế giới, vùng chứa phối cảnh và vùng hiển thị. Vùng chứa thế giới thiết lập hiệu quả máy ảnh của người xem và sử dụng thuộc tính perspective CSS để cho trình duyệt biết nơi mà người xem sẽ xem phần tử. #perspective-container dùng để thay đổi góc nhìn của chúng ta bằng cách áp dụng các phép biến đổi 3D cho đối tượng đó. Cuối cùng, giai đoạn này chứa các phần đã tập hợp thực tế sẽ hiển thị trên màn hình.

<div id="world-container">
  <div id="perspective-container">
    <div id="stage">
    </div>
  </div>
</div>
#world-container {
perspective: 700px;
overflow: hidden;
}

#perspective-container {
{ % mixin transform-style: preserve-3d; % }
{ % mixin transform-origin: center center; % }
{ % mixin perspective-origin: center center; % }
{ % mixin transform: translate3d(0, 0, 0) rotateX(0deg) rotateY(0deg) rotateZ(0deg); % }
}

Hình ảnh hoá vùng hiển thị

Có 7 thành phần trong cảnh cuối cùng. Di chuyển từ sau ra trước, bao gồm nền trời, lớp sương mù, cửa ra vào, nước, bóng phản chiếu, lớp sương mù bổ sung và cuối cùng là những vách đá ở phía trước. Mỗi mục được đặt lên vùng hiển thị bằng một thuộc tính CSS transform: translate3d(x, y, z) cho biết vị trí mục đó nằm vừa trong không gian 3D. Chúng ta sử dụng giá trị z theo cách tương tự như z-index. Tuy nhiên, với thuộc tính translate3d, chúng ta cũng có thể cung cấp một đơn vị cùng với giá trị.

Hình 1: Giai đoạn từ một bên
Hình 1: Giai đoạn từ bên cạnh.

Hình 1 cho thấy cảnh được thu nhỏ và xoay gần như 90 độ để bạn có thể hình dung cách đặt từng phần trong bối cảnh. Ở phía sau (xa nhất về bên trái), bạn có thể thấy nền, sương mù, cửa ra vào, nước và cuối cùng là các vách đá.

Hiển thị nền

Hãy bắt đầu với hình nền. Vì đây là điểm lùi xa nhất, nên chúng tôi đã áp dụng phép biến đổi -990px trên trục Z để đẩy nó trở lại theo góc nhìn của mình (xem Hình 2).

Vùng hiển thị, chỉ đặt nền ở -990px
Hình 2: Giai đoạn, chỉ có nền được đặt ở -990px

Khi di chuyển trở lại không gian, vật lý yêu cầu nó nhỏ hơn, vì vậy cần được đổi kích thước thông qua thuộc tính scale(3.3) để vừa với khung nhìn và căn chỉnh cạnh trên cùng với đỉnh của khung nhìn bằng translate3d trên trục y (xem Hình 3).

.background {
width: 1280px;
height: 800px;
top: 0px;
background-image: url(stars.png);
{ % mixin transform: translate3d(0, 786px, <b>-990px</b>) <b>scale(3.3)</b>; % }
}
Hình 3: Giai đoạn, với nền được định vị và điều chỉnh theo tỷ lệ.
Hình 3: Giai đoạn chỉ có nền được định vị và điều chỉnh theo tỷ lệ.

Sương mù, cửa và vách đá theo cách tương tự, áp dụng một translate3d với một vị trí z và hệ số tỷ lệ thích hợp (xem Hình 4). Hãy chú ý đến cách sương mù che phủ sau cánh cửa và sau các vách đá.

Hình 4: Sân khấu, có sương mù, cửa ra vào và vách đá được bố trí và sắp xếp
Hình 4: Sân khấu, có sương mù, cửa ra vào và vách đá được định vị và chia tỷ lệ.

Thêm biển

Để tạo ra một môi trường thực tế nhất có thể, chúng tôi biết rằng chúng tôi không thể chỉ đơn giản là đặt nước trên một mặt phẳng thẳng đứng, nó thường không tồn tại theo cách đó trong thế giới thực. Ngoài việc áp dụng translate3d để định vị vùng nước trên vùng hiển thị, chúng ta cũng áp dụng chế độ xoay trục x (ngang) 60 độ (rotateX(60deg)) để làm cho vùng nước trông phẳng và có hoạ tiết. Một góc xoay tương tự đã được thêm vào phản chiếu cửa và sương mù thứ cấp để làm cho nó xuất hiện trong đúng mặt phẳng (xem Hình 5).

.sea {
bottom: 120px;
background-image: url(sea2.png);
width: 1280px;
height: 283px;
{ % mixin transform: translate3d(-100px, 225px, -30px) scale(2.3) <b>rotateX(60deg)</b>; % }
}
Hình 5: Giai đoạn với mọi thứ được xác định vị trí và điều chỉnh theo tỷ lệ.
Hình 5: Giai đoạn có mọi thứ được xác định vị trí và điều chỉnh theo tỷ lệ.
>

Mỗi cảnh được xây dựng theo một cách tương tự nhau, các phần tử được trực quan hoá trong không gian 3D của sân khấu và một phép biến đổi phù hợp đã được áp dụng cho từng cảnh.

Tài liệu đọc thêm