Nhân sự kiện Houdini 19.5 ra cái video mào đầu, trong đó có phần render Karma Ocean, có một tiểu tiết tôi để ý đó là Encino Waves render với Karma, tôi đã làm thử một bài tập về nhà và mời cùng tìm hiểu kiến thức đó đây ứng dụng vào đồ họa máy tính cũng như Houdini trong các hạng mục ocean và flip simulation. Link tới video Houdini 19.5 Sneak Peek
Swell là gì (sea swell)
Sea swell khác nhau thế nào với một cơn sóng ? đây là một thuật ngữ “sea swell” chỉ đến những khoảng trống giữa các cơn sóng hoặc có thể hiểu là tập hợp của các cơn sóng trước những ngọn gió bão ngoài biển khơi (biển sâu). Khác với “Wave” sóng biển, là tạo hình bởi các đợt gió nội tại khi thổi vào bờ biển.

hình ảnh chụp thực tế do người dùng reddit thực hiện một cái phao màu đỏ giữa những tập hợp con sóng gọi là sea swell
Sea swell có thể có kích thước rất lớn, lên tới hơn 10 mét và dễ dàng lật úp một con tàu. những kiểu sea swell hình thành thường do tạo hình của bề mặt trái đất và ảnh hưởng trong hệ mặt trời. Nhiều chuyên gia lướt sóng còn mong muốn lướt trên những kiểu “sea swell” lớn mới đủ để giải trí và thể thao.

Vùng biển Waimea Bay ở Hawaii là một trong những nơi người yêu thích môn thể thao lướt sóng tìm tới những cơn sóng lớn khổng lồ để giải trí và thể thao
Houdini Ocean workflow với Geometry
Trong Houdini, để một object tương tác với nước ta có FLIP simulation, đây là physical animation thực hiện các thao tác dynamic dựa trên nguồn lực của computer. Thông thường Flip sẽ được chứa trong một volume và nó sẽ có bề mặt phẳng `flat`.
Để mô tả sóng biển lên bề mặt phẳng (theo trục x, z – trong Houdini y là trục tung hướng lên), ta có Ocean workflow, là các tạo hình biến đổi bề mặt của geometry tạo hình gợn sóng, đỉnh sóng phát triển theo thời gian (animation). Và hoàn toàn có thể kết hợp Ocean với Flip thông qua Guided Simulation hay các cách thủ công custom khác nhau (FX TD) nhằm tạo sóng biển trực tiếp vào trong Flip simulation, ví dụ để làm biển bão – thường thấy nhất là đỉnh sóng biển (hay nói đúng hơn là `sea swell` va chạm với tàu thuyền).
Túm váy Ocean không thể tương tác (collision hay dynamic), nó chỉ là cơ bản deform geometry. Flip mới là thứ dynamic. Sử dụng Ocean để initital cho Flip hay post process cho flip đó là các phương pháp để trọn vẹn art direction một ocean work flow kết hợp giữa flip và ocean.
Thông thường người ta sẽ không cần đến Houdini nếu như các kiểu physical animation là không cần quá chân thực – mặc dù đây chỉ là một phần mềm giải trí chứ không phải phần mềm khoa học, nhưng với khả năng của Houdini sẽ giúp cho các tạo hình – art direction, các kiểu công cụ custom dễ dàng được tạo ra và art direction theo ý, trong đó bao gồm cả việc có thể khớp được hình ảnh thực tế (reference) với computer graphics đang làm.
Đó cũng là lý do mà bộ Ocean của Houdini cũng khá là phát triển ra thành nhiều thứ. Match live action với CGI là điều rất bình thường – phổ biến và yêu cầu hàng ngày của các tiệm làm VFX – mà ngay cả phim hoạt hình thì giờ đây cũng là yêu cầu phổ biến.
Phim hoạt hình Sea Beast mới ra trên Netflix gần như chủ yếu là biển cả mênh mông:
https://youtu.be/d6OrdQJAvnM
hay Bad Travelling || Love, Death & Robots
https://youtu.be/oy2QvlBt0Jc
Phim The Shallow
https://youtu.be/uD2657joL9I
Phim Midway 2019
https://youtu.be/dM9v1pMfP7I
Ocean Spectra
Hiện nay ở trong Houdini, workflow tạo bề mặt biển (deform geometry – thường là apply lên 1 cái grid phẳng – hay sẽ dùng lúc render chính là displacement) thường được biết đến là dùng `ocean spectra` – đây là một loạt các hệ thống dựa trên giải thuật chính tạo hình sóng biển phát triển bởi Jerry Tessendorf (năm 2001), cách để tạo hình các gợn sóng biển là tập hợp của các `heigh field` spectrum dựa trên thời gian. Kỹ thuật này sẽ sử dụng hàm thời gian để hòa trộn các spectrum theo mật độ trãi dài dựa theo `wave length`, ta có các đợt sóng biển, nếu phân theo đồ họa biểu diễn 2D thì ta có thể thấy kiểu biểu đồ các đường curve lượn sóng đè chồng lên nhau.
Để thấy bề mặt (geometry) gợn tạo hình sóng biển Jerry Tessendorf ra sao thì có thể coi cái đĩa đẹp đẽ này: http://www.allenhemberger.com/alinea/2013/05/tessendorf-plate/
Hay cái bề mặt biển tôi đã làm khi kết hợp với flip simulation hy vọng lại không bị đè ra dislike youtube, tội tôi.
Cái combo Houdini ocean workflow dùng xử lý Geometry Node thì gồm các node như Ocean Wave, Ocean Spectrum, Ocean Evaluate. Và đúng với thuật toán Jerry Tessendorf nếu khi tạo Ocean Spectrum sẽ thấy các `heigh field` volume, merge thật nhiều volume này với nhau tạo ra các sóng biển đa dạng theo ý (art direction hay làm theo reference), bao gồm cả các đợt sóng có đỉnh cao.
Để tạo các gợn sóng, đỉnh sóng thì dùng Houdin Ocean Spectrum:
Để có thể thấy được các Ocean Spectrum hay hiểu là thấy được con sóng cụ thể thông qua geometry trên view port thì cần dùng node Ocean Evaluate:
Để tạo `wave train` tức các ngọn sóng chạy song song theo một hướng mong muốn thì dùng node Ocean Wave:
Tuy nhiên: Để tạo được các sea swell hay tựu chung là sóng biển trong bão, thì điều này trở nên rất khó khăn, vì thông thường, cách của Jerry Tessendorf là dựa trên thời gian, tạo sóng nên sẽ dùng thuật toán Fast Fourier Transform (hay còn biết tiếng Việt là biến đổi Fourier nhanh, được đặt tên theo nhà toán học người Pháp Jean – Baptiste Joseph Fourier cuối thế kỷ 18, biến đổi Fourier là một phép toán biến đổi tín hiệu từ miền thời gian (không gian) sang miền tần số. Theo định lý Fourier, một tín hiệu là sự hợp thành của một số hàm điều hòa với biên độ, tần số và pha cho trước).
Điều này cũng tương đương là các con sóng ở biển sâu (FLIP simulation) sẽ khó điều khiển, đỉnh sóng sẽ có những biến đổi quá mức và gây rất nhiều khó khăn cho artist trong quá trình tạo hình, điều đó đã tạo nên rất nhiều công ăn việc làm cho FX TD thông qua việc bào chế, làm rất nhiều kiểu mẹo và thủ thuật với ocean và flip simulation hòng tạo ra các simulation dạng có biển bão – tuy nhiên vẫn rất khó, hoặc cụ thể là làm cho kiểu ván lướt sóng thì đó cũng đã là rất nhiều khó khăn vả thử thách mặc dù công việc tạo ra flip simulation thì quá cơ bản và đơn giản.
Nghĩa là gì, nghĩa là để tạo ra các kiểu biển bão, sóng cao trên 15 mét, 10 mét hoặc nhiều nhiều hơn nữa dựa trên sức mạnh biển (Beaufort là đơn vị đó lường sức mạnh của biển) là điều rất khó khăn ngay trong Houdini nếu không cheat. Hình minh họa:

Hình ảnh tàu hàng trong biển bão Photograph of a ship in bad weather on the Georges Bank in the North Atlantic ocean basin Image courtesy of the National Oceanic and Atmospheric Administration (NOAA)
Sea State – Trạng Thái Của Biển
Các yếu tố ảnh hưởng đến bề mặt biển khơi thực tế và tạo hình gợn sóng, đỉnh sóng đều do gió mà ra nhưng sẽ dựa trên thời gian kéo dài trong bao lâu `duration`, năng lượng `speed` và tính ảnh hưởng `fetch`:
- Duration: là thời gian bao lâu cơn gió quét qua vùng biển đó, thời gian gió thổi càng lâu, sẽ vô hình tạo thành năng lượng cộng dồn và quán tính lớn dần.
- Fetch: Là khoản cách tại thời điểm gió thổi với cơn sóng. Để thấy được sự ảnh hưởng rõ rệt tạo ra bởi gió lên bề mặt cơn sóng có thể tự tưởng tượng bề mặt gợn sóng của biển khác với hồ hay chỉ trong ao. Khi gió có thể di chuyển được trên một diện tích rộng, năng lượng sẽ được truyền ảnh hưởng lên con sóng rất nhiều.
- Speed: đây là cách mà người ta sẽ đo được sức mạnh của một cơn gió. Cho cơn gió với cùng thời gian và ảnh hưởng, gió thổi càng nhanh thì càng mạnh, nhiều năng lượng, có thể di chuyển được nhiều gợn sóng, và ra những cơn sóng lớn hơn. Điều này cũng tương tự với sóng biển, nếu loại to, di chuyển nhanh, nhiều năng lượng dồi dào thì đích thị là nó có thể di chuyển mọi vật, tức đó là bão cấp hủy diệt…. cỡ con tàu hàng đi qua giữa các sea swell khổng lồ thì việc gãy gần như làm đôi là có thể xảy ra.
Hãy xem qua các ví dụ là video tàu hàng khổng lồ trong hành trình viễn dương qua các sea swell
- Video tàu hàng của Nga gãy ngay trên sea swell https://youtu.be/gaZhnNlutuQ
- Tàu hàng New Zealand gãy làm đôi: https://youtu.be/wkr95Zf0Ch4
- Một tàu hàng đi qua hướng của Sea Swell: https://youtu.be/YIQsAvE89es
Cùng vì lý do này mà khi phát triển các kiểu sóng thần nhiều cơn, các kiểu sóng cuộn trên biển lúc bão cho dù đã có FX TD tham gia rất nhiều, như Project Blue Book (Stormborn Studios) sử dụng Houdini tạo ra các con sóng va chạm lớn với chiếc tàu trong phim, tạo ra các đợt sóng hung dữ đoán là trên 100 mét (con sóng do UFO tạo ra trước khi va chạm với thuyền được show thông tin là hơn 300 mét), nhưng mỗi shot hình cao lắm cũng chỉ một cơn sóng, vì để có thể tạo ra hình hài một cơn sóng như thế thì việc simulation phải đủ thời lượng kéo dài (gọi là pre-roll) cho tạo quán tính (momentum) từ năng lượng gió đủ để tạo hình được con sóng theo physical animation mong muốn, nên việc thấy một tá các con sóng kiểu như `sea swell` trong physical simulation là khó thấy hoặc sẽ rất tốn kém dung lượng đĩa chứa đủ lâu thời lượng của animation, liên kết đến Project Blue Book (sử dụng Houdini, render Redshift – studio thực hiện Stormborn Studios, fluid artist Igor Zanic):
https://www.artstation.com/artwork/GaLLDW
Emperical Directional Wave Spectra For Computer Graphics
Đây là một paper phát triển bởi Christopher J. Horvath vào năm 2015, làm việc tại Google Inc.
https://dl.acm.org/doi/10.1145/2791261.2791267
Paper này phát triển dựa trên giải thuật tạo hình sóng biển nguyên bản của Jerry Tessendorf tuy nhiên paper sẽ trình bày phương pháp cao cấp hơn để thể hiện sóng biển đó chính là tạo ra các SEA SWELL, tức các con sóng ở biển khơi – biển sâu trong bão. Theo diễn giải trong paper thì cách mà tác giả đưa ra để làm `sea swell` là không cần artist phải ngồi thủ công chỉnh tới lui các tham số nhằm để cân bằng cho tạo hình. Cách của paper là sẽ tạo ra giao diện thân thiện để có thể có các gợn sóng dựa trên các cơn bão và có các sea swell tương ứng.
Hình minh họa với cùng các tham số đầu vào tạo ra swell nhưng độ lớn của swell ở hình trên là 0 và ở dưới là 1:
Như vậy thì để có thể match một hình ảnh thực tế (reference) giờ đây trở nên vô cùng dễ dàng (theo paper) rằng chỉ cần chọn kích thước của domain (grid), tốc độ gió, độ sâu của biển, và số `swell` mong muốn có. Các swell sẽ được hình thành tùy theo hướng và tạo ra các sea wave train song song theo hướng định sẵn.

hình ảnh trái render CGI, hình ảnh phải là thực tế chụp ảnh
Với kết quả của paper có thể dễ dàng cho ra các kiểu biển trong bão như hình minh họa
Đây là kết quả của tạo hình `sea swell` dựa trên mô hình gió có tốc độ 75 mét/giây tức lên tới 270 km/giờ => là gió giật trên cấp 17 khả năng hoàn toàn đấnh đám tàu biển có tải trọng lớn. Đó cũng chính là hình ảnh tham khảo thực tế (hình bên phải) chụp được của tổ chức biển bắc.
Hình ảnh đồ họa trong paper render bởi Allen Hemberger (artist tại Pixar ở thời điểm làm paper) sử dụng hình ảnh 360 HDRI sky map của Bob Groothuis và có nhiều đóng góp feedback từ Bill Polson (Director of Industry Outreach at Pixar Animation Studios – người đã tạo ra Open Subdiv) cùng với Shane Cooper là senior software developer tại Weta FX người từng đoạt giải Oscar về khoa học kỹ thuật trong phát triển nghệ thuật, phim điện ảnh, khoa học cho nội dung Barbershop Hair Grooming System, Weta Digital vào năm 2014.
Bill Polson: https://youtu.be/Umeyd5qoykU
Công cụ làm lông lá Barbershop Hair Gromming của Weta FX tính tung ra cho Maya (Weta M) và Houdini (Weta H) sử dụng nhưng giờ thành Weta FX trực thuộc Unity và vừa rồi cũng thấy Unity tung ra các realistic video nên chắc M hay H gì cũng sẽ là một tương lai không xác định do các kỹ nghệ đang được Unity chắc chắn phải bào và điều nghiên kỹ lưỡng để làm vũ khí cạnh tranh bảo vệ nhà đầu tư https://youtu.be/y0_E7qz700Q?t=116
Encino waves – Tất cả những thông tin trên mang ý nghĩa gì ?
Lý do là coi trong cái Houdini 19.5 Sneak Peek video phát hành hôm nay của Side FX https://youtu.be/rhcaKSB_Dvo?t=366, trong đó có 1 đoạn nói về những cải tiến mới của Karma dùng cho Ocean có 1 phần đó là. Encino Waves In Ocean Spectrum SOP. Và đây là source code của Encino Wave tức là code để tạo ra con sóng biển sâu dựa và các bài này đều dựa trên paper Emperical Directional Wave Spectra For Computer Graphics của tác giả Christopher Horvath
Chân dung tác giả paper
Các source code tạo EncinoWaves trên internet đa phần sẽ hướng về Open GL, ta có:
- Tạo EncinoWave trên Unity GPU: https://github.com/noobdawn/Unity-GPU-FFTOcean/blob/master/README.md
- Tạo EncinoWave trên C++ https://github.com/blackencino/EncinoWaves
Như vậy có thể thấy với chủ đề Houdini 19.5, Side FX đang tập trung vào xây dựng Flip Simulation trên SOP level cũng như đã làm cho RBD, Pyro .. với phần flip là phần tôi luôn hứng thú đó giờ, chắc chắn đã có để ý mãnh liệt nhưng sau đó vô cùng thất vọng khi coi Houdini 19 trước đây vì không thấy nâng cấp hay đề cập tới, thì với 19.5 phải nói là đang rất khoái chí.
Tuy nhiên việc dùng Karma để ứng dụng là điều tôi chưa thuần thục, cũng không thể không tìm hiểu qua xem Encino Waves là cái thứ gì. Và nội dung trên là của cái note nhỏ tôi tìm thấy thông qua video sneak peek vừa tung ra. Thêm nữa nếu nói rằng kết quả đã tạo ra là sóng biển trong bão thì thật sự tôi chưa thấy điều đó trong clip Sneak Peak nên khả năng cao tôi nghĩ rằng, đây chẳng qua là một trong các phương pháp thêm nhằm phụng sự cho GPU render, và cũng là dùng cho bridge qua môi trường real-time mà Houdini đang hướng tới thông qua bắt tay mạnh mẽ với Unreal Engine, Unity và dành vô vàn ưu đãi cho dân làm game, một trong các thị trường mà Side FX đang không ngừng khai phá.
Vậy chờ xem Encino Waves này sắp tới khi được Side FX tung ra nó là gì. #houdini #houdinifx
— Bài viết có mỗi mình ên nên sẽ có sai chính tả, nếu tìm được lỗi, nhờ chỉ giúp để hiệu chỉnh —