Kỹ thuật mô phỏng chất lỏng, lửa và khói theo thời gian thực
(andrewkchan.dev)- Mô phỏng lửa thời gian thực dựa trên GPU có thể được hiện thực bằng demo WebGL bằng cách kết hợp động lực học chất lỏng, tính toán song song trên lưới, cùng các mô hình cháy, lực nổi và dựng hình
- Mô hình cơ bản giả định dòng chảy không nén được và không nhớt, đồng thời đạt được tính ổn định và khả năng song song hóa nhờ advection bán-Lagrange để vận chuyển các trường vô hướng như thuốc nhuộm, nhiệt độ và nhiên liệu theo trường vận tốc
- Trong bước Navier-Stokes, trường vận tốc được tự advection theo chính nó, sau đó giảm độ phân kỳ bằng phép chiếu áp suất; phương trình Poisson được xử lý bằng các lời giải gần đúng thân thiện với GPU như lặp Jacobi
- Nội suy trên lưới và phương pháp bán-Lagrange bậc một làm suy yếu các xoáy nhiễu loạn, nên vorticity confinement và curl noise được dùng để tăng cường chi tiết quay nhỏ
- Lửa được mô phỏng bằng cách thêm trường mật độ nhiên liệu và nhiệt độ để tính toán quá trình cháy, làm mát và lực nổi nhiệt, rồi dựng màu bằng bức xạ vật đen dựa trên Planck’s Law để khiến chất lỏng dạng khói trông như ngọn lửa
Toàn bộ quy trình mô phỏng lửa bằng GPU
- Lửa là một bài toán thú vị trong đồ họa, nhưng trước đây phần lớn chỉ được bắt chước bằng các cách không dựa trên vật lý
- Lord of the Rings dùng nhiều sprite khói vì chi phí mô phỏng chất lỏng quá cao
- Các ứng dụng thời gian thực như trò chơi điện tử cũng gần như phụ thuộc hoàn toàn vào các cách tiếp cận phi vật lý
- Trong 10 năm gần đây, nhờ GPU mà mô phỏng chất lỏng nhanh đã trở nên dễ tiếp cận hơn, và các thuật toán động lực học chất lỏng cơ bản khá trực quan để triển khai trên GPU
- ILM đã dùng các kỹ thuật này vào năm 2009 để mô hình hóa và dựng hình lửa trong Harry Potter
- NVIDIA công bố FlameWorks vào năm 2014 như một hệ thống hiệu ứng lửa và khói cho game
- Việc triển khai được xây dựng thành một demo WebGL, và về mặt toán học cần nền tảng về giải tích vectơ và phương trình vi phân
- Mã nguồn có trên GitHub
Trước tiên mô hình hóa chất lỏng
- Trước khi tạo lửa, cần mô phỏng chất lỏng; ở đây giả định chất lỏng không nén được (incompressible) và không nhớt (inviscid)
- Trường vận tốc 2D
u(x, t)được biểu diễn bằng lướiN × N, trong đó mỗi điểm lưới mang giá trị vận tốc tại vị trí đó - Quá trình một trường vô hướng như mật độ thuốc nhuộm
ψ(x, t)di chuyển theo vận tốc của chất lỏng được gọi là advection - Cách đơn giản là đẩy từng điểm lưới tiến về phía trước, nhưng việc này khó song song hóa, nhiều điểm lưới có thể dồn vào cùng một điểm đích, và dễ trở nên mất ổn định khi bước thời gian lớn
Advection ổn định: phương pháp bán-Lagrange
- Dùng định luật bảo toàn khối lượng và định lý phân kỳ, phương trình advection vô hướng trong dòng chảy không nén được có thể viết thành
∂ψ/∂t = -u · ∇ψ - Cách ổn định là thay vì đẩy giá trị đi theo hướng vận tốc từ mỗi điểm lưới, ta lần ngược theo hướng vận tốc từ điểm lưới hiện tại để lấy giá trị tại vị trí trước đó
- Cách này là Semi-Lagrangian advection, do Jos Stam đưa ra năm 1999
- Mỗi điểm lưới chỉ được cập nhật một lần ở mỗi vòng lặp nên rất dễ song song hóa trên GPU
- Không điểm lưới nào được cập nhật thành giá trị lớn hơn giá trị lớn nhất của các điểm lưới ban đầu, nên phương pháp này ổn định vô điều kiện
- Nếu trường vận tốc cố định thỏa điều kiện không nén được, có thể vận chuyển ổn định các trường vô hướng như thuốc nhuộm
Cập nhật trường vận tốc bằng Navier-Stokes
- Navier-Stokes equations định nghĩa cách trường vận tốc của chất lỏng thay đổi theo thời gian trong dòng chảy không nén được
- Khi giả định chất lỏng không nhớt và tạm thời bỏ qua ngoại lực, còn lại hai thành phần cốt lõi
- self-advection khi trường vận tốc tự vận chuyển chính nó
- pressure để thỏa điều kiện không nén được
- Vòng lặp mô phỏng diễn ra đại khái theo thứ tự sau
- advection trường vận tốc
utheo chính nó - tính áp suất
p - trừ gradient áp suất bằng
u = u - gradient(p)để cưỡng ép tính không nén được - dùng trường vận tốc mới để advection trường mật độ
- advection trường vận tốc
Tính áp suất: phương trình Poisson là nút thắt cổ chai
- Trường vận tốc ứng viên
u'thu được sau self-advection không được đảm bảo thỏa điều kiện phân kỳ bằng 0, nên cần dùng áp suất để hiệu chỉnh - Khi sắp xếp lại điều kiện, ta thu được Poisson equation dạng
∇²p = ∇ · u' - Khi rời rạc hóa divergence và Laplacian trên lưới, với lưới
N × Nsẽ sinh ra một hệ tuyến tính gồmN²phương trình vàN²ẩn số - Các cách giải chính xác cho hệ tuyến tính có chi phí tăng siêu tuyến tính theo kích thước lưới, nên khá nặng cho mô phỏng thời gian thực
- Trên GPU, thay vì lời giải chính xác có thể lặp để tìm một giá trị gần đúng đủ tốt
- Jacobi method phù hợp để triển khai trên GPU vì cập nhật ước lượng của từng phần tử theo kiểu song song
- Các cách hội tụ nhanh hơn như Conjugate Gradient và Multigrid cũng có thể triển khai trên GPU
- Với khói và lửa, do sự thay đổi thể tích không rõ rệt như nước, chất lượng advection hay độ dễ triển khai có thể quan trọng hơn độ chính xác tuyệt đối của áp suất
Khôi phục lại chi tiết xoáy
- Khi lưu trường vận tốc trên lưới, quá trình nội suy gây ra hiện tượng làm trơn số học ngoài ý muốn
- Khi cộng thêm phép gần đúng thô của advection bán-Lagrange bậc một, các xoáy nhiễu loạn sẽ biến mất và chất lỏng trở nên quá mượt, đơn điệu
- Tăng độ phân giải có thể giảm vấn đề này, nhưng mô phỏng thời gian thực luôn bị giới hạn tài nguyên tính toán
- Vorticity confinement là cách tìm và khuếch đại những chi tiết nhỏ bị mất đi ở mỗi bước
- Dù không hoàn toàn thực tế về mặt vật lý, nó vẫn giữ lại các chi tiết ở thang nhỏ vào những vị trí nhìn chung hợp lý về mặt vật lý
- Ban đầu kỹ thuật này được thiết kế cho các mô phỏng kỹ thuật về trường dòng chảy phức tạp quanh cánh quạt trực thăng
- Độ xoáy tại mỗi điểm lưới được đo bằng curl; sau đó tính hướng có vorticity cao hơn xung quanh rồi cộng thêm vào trường vận tốc một lực quay được điều khiển bởi hằng số confinement
ε > 0- Chỉ với giá trị confinement thấp khoảng
0–15cũng đã tạo khác biệt lớn - Giá trị cao hơn có thể tạo ra dòng chảy billowing mang tính cách điệu
- Chỉ với giá trị confinement thấp khoảng
Tổng hợp nhiễu loạn bằng curl noise
- Curl noise không khuếch đại vorticity hiện có của trường vận tốc, mà tạo mới một trường vorticity vô hướng bằng hàm nhiễu
- Về mặt toán học, trước tiên tổng hợp một trường vorticity ngẫu nhiên
φ = rand * z, rồi cộng vào vorticity hiện cóωđể tạo vorticity cuối cùngω* = ω + φ - Các chất lỏng chuyển động nhanh và nhiễu loạn mạnh như khói và lửa chịu ảnh hưởng lớn từ vorticity confinement và curl noise
- Trường curl noise thực tế
φthay đổi theo thời gian và cũng được advection cùng dòng chảy của chất lỏng
Thêm nhiên liệu và nhiệt độ cho lửa
- Chỉ với vòng lặp chất lỏng cơ bản đã có thể tạo ra dòng chảy giống khói, nhưng để mô phỏng lửa và khói cần thêm vài kênh dữ liệu
- Mô hình cháy thêm mật độ nhiên liệu
ρvà trường nhiệt độT0 ≤ ρ ≤ 1là mật độ nhiên liệuT > 0là nhiệt độ tại mỗi vị trí
- Ở đây giả định nhiên liệu trong hệ đã được mồi cháy và tiếp tục cấp nhiệt, không xử lý bài toán nhiên liệu chưa bắt lửa
- Ở mỗi bước thời gian, nhiên liệu làm tăng nhiệt độ theo nhiệt độ cháy đã định
- Nhiệt độ được cập nhật theo dạng
T' = max(T, ρ * T_burn)
- Nhiệt độ được cập nhật theo dạng
- Nhiệt khuếch tán từ nơi nóng sang nơi lạnh, và dòng chuyển động lớn của chất lỏng cũng mang nhiệt đi
- Trong mô phỏng, trường nhiệt độ được advection theo trường vận tốc
- Các phân tử phản ứng cũng di chuyển cùng chất lỏng nên trường nhiên liệu cũng được advection
- Các phân tử nóng phát xạ nhiệt độ dưới dạng ánh sáng theo Stefan-Boltzmann Law
- Trong mô phỏng chính xác về mặt vật lý sẽ dùng hằng số Stefan-Boltzmann
- Trong mô phỏng đồ họa, việc cho nghệ sĩ điều chỉnh tốc độ làm mát
σ_coolthường hữu ích hơn
- Nhiên liệu giảm ở mỗi bước thời gian theo tốc độ cháy
γ_fuel
Nâng chất lỏng nóng lên bằng lực nổi nhiệt
- Chỉ tính trường nhiệt độ thì vẫn chưa ảnh hưởng đến dòng chảy, nên cần thêm hiệu ứng không khí nóng bốc lên và không khí lạnh chìm xuống
- Thermal buoyancy cộng một lực hướng lên tỷ lệ với nhiệt độ vào trường vận tốc
- Vì giả định dòng chảy không nén được, mô hình không xử lý sự giãn nở thực của không khí
- Trường vận tốc được cập nhật theo dạng
u' = u + (β T Δt) j βlà hằng số lực nổi dương vàjlà vectơ đơn vị hướng lên
- Khi kết hợp mô hình cháy và lực nổi nhiệt, có thể tạo ra chất lỏng trông giống lửa
- Với các giá trị lực nổi và làm mát phù hợp, có thể thu được các cột vật chất lớn, phồng nở
- Kết quả ở giai đoạn này vẫn gần với khói hơn là ngọn lửa chính xác
- Toàn bộ vòng lặp gồm self-advection của vận tốc, quá trình cháy, vorticity confinement, lực nổi nhiệt, phép chiếu áp suất, rồi advection của mật độ, nhiệt độ và nhiên liệu
Dựng màu ngọn lửa bằng bức xạ vật đen
- Lửa là một participating medium và phát ra ánh sáng thông qua bức xạ vật đen
- Màu cam và đỏ của lửa đến từ bức xạ vật đen; nếu mô phỏng nhiên liệu đang cháy được dựng bằng công thức phù hợp thì có thể chuyển từ khói sang lửa
- Planck’s Law mô tả mật độ phổ ánh sáng do vật đen ở nhiệt độ
Tphát ra - Nếu triển khai dựng hình vật đen bằng fragment shader, có thể tạo nên một mô phỏng lửa hoàn chỉnh trên nền mô hình chất lỏng, cháy và lực nổi
- Vẫn còn những chủ đề mở rộng chưa được đề cập
- các kỹ thuật không dựa trên lưới để giải mô phỏng trong một thể tích cố định
- bài toán miền biến thiên, nơi chất lỏng chiếm các vùng khác nhau trong lưới như nước trong một chiếc cốc chỉ đổ nửa
- vật cản động
- các cách cải thiện dựng hình như bức xạ vật đen chính xác hơn, tán xạ ánh sáng và hiệu ứng hậu kỳ
1 bình luận
Ý kiến trên Hacker News
Tôi có bằng tiến sĩ CFD, nhưng đây là lần đầu tiên tôi thấy kỹ thuật vorticity confinement và curl-noise turbulence
Trong các miền có số Reynolds cao hơn như CFD công nghiệp, thường người ta không muốn dùng cách tiếp cận bù lại tiêu tán nhân tạo của phương pháp số bằng nhiễu
Ngược lại, nhiều khi còn muốn có tiêu tán nhân tạo để ổn định mô phỏng số Reynolds cao, và trong đồ họa máy tính thì có vẻ trông thuyết phục quan trọng hơn là đúng về mặt vật lý
Thậm chí còn không cần phải trông chính xác, chỉ cần trông ngầu là được
Với dân mê vật lý như tôi, mọi người thường cười khi tôi chỉ ra những cảnh vi phạm định luật vật lý ở tiệm arcade
Có một bài phỏng vấn dịch với nhà vật lý từng làm Mario World ở Nintendo khá thú vị; ông nhấn mạnh rằng vật lý trong thế giới Mario dù không giống vật lý “thực”, vẫn có những quy tắc nhất quán như vật lý thực, và điều đó quan trọng để người chơi hiểu mình có thể làm gì trong game và giải câu đố
Tôi đã dùng ý tưởng cốt lõi của bài đó để làm một chương trình khá ổn tạo texture cho hành tinh khí: https://github.com/smcameron/gaseous-giganticus
Tôi đã hơn một lần bị hỏi kiểu “tại sao Unreal Engine làm được trong vài giây mà phần mềm CFD của anh lại mất hàng giờ cho một mô phỏng”
https://en.wikipedia.org/wiki/John_Steinhoff
https://en.wikipedia.org/wiki/Vorticity_confinement
Cũng có các bài báo liên quan:
https://www.researchgate.net/publication/239547604_Modificat...
https://www.researchgate.net/publication/265066926_Computati...
Trước đây tôi từng đọc đâu đó một bài viết rồi làm một mô phỏng ngọn lửa cực kỳ đơn giản kiểu đồ chơi bằng C
Chỉ cần đặt độ sáng của mỗi pixel bằng độ sáng trung bình của các pixel kề ngay bên cạnh, rồi tính từ dưới lên trên
Chỉ cần thêm vài pixel “nóng” di chuyển qua lại ở phía dưới là lập tức có lửa, mã rất ít mà trông khá hay dù không cần giải tích
Trong 1 chiều, nó đơn giản là đạo hàm bậc hai, tức độ cong; đỉnh càng nhọn thì càng âm, đáy càng nhọn thì càng dương
Nếu thay đổi giá trị theo mức đó thì sẽ tạo ra hiệu ứng làm trơn, và dạng rời rạc của nó theo đúng nghĩa đen chính là lấy trung bình
Thực ra bạn vẫn luôn đang làm giải tích
Biết con đường và đi trên con đường là hai chuyện khác nhau
Có cả video 3Blue1Brown giải thích bằng đồ họa trực quan: https://youtube.com/watch?v=ToIXSwZ1pJU
Họ đang nói về mô phỏng lửa và khói cho game, mô phỏng chất lưu trên GPU, nhưng nếu các hiệu ứng này chạy trong game thì GPU chẳng phải đã bận sẵn rồi sao
Vừa chạy bài toán CFD vừa render cùng lúc nghe có vẻ là gánh nặng khá lớn
Tôi cũng tò mò liệu có thể chạy mấy thứ này trên iGPU trong khi dGPU xử lý tác vụ liên quan đến render hay không, hay iGPU quá yếu nên thà đẩy xuống CPU còn hơn
GPU ngày nay rất mạnh, có thể xử lý vật lý, các render pass cầu kỳ, mô phỏng chất lưu, tìm đường cho đơn vị “AI trong game” ở mức hơn 100FPS
Nói dài hơn thì khoảng thời gian giữa việc render các khung hình “trình chiếu” rất nhanh trên 60FPS chính là ngân sách khung hình, và thông thường bạn có 5~30ms để tính toán trạng thái khung tiếp theo cùng mọi thứ cần cho việc render
Trong đó có thể gồm di chuyển đơn vị trên bản đồ, tính vật lý ngọn lửa, sao chép texture địa hình, render đỉnh có material, và trong nhiều engine game, GPU mỗi khung hình thực hiện hàng chục phép tính riêng như vậy
GPU về cơ bản là một máy tính phụ gắn vào máy tính chính, nên mỗi khung hình bạn ném cho nó nhiều tác vụ, nó trả kết quả lại, rồi các kết quả đó được ghép lại thành thứ trông giống một trò chơi
Gần như chẳng ai dùng iGPU
So với dGPU chính thì nó thường vô dụng đến mức bị bỏ qua
Có lẽ thời kỳ cân bằng những thứ đó sẽ khá thú vị, và ngày càng có vẻ tài nguyên tính toán cục bộ và từ xa sẽ cùng chia tải
Tôi nhớ là mình đã gán cấu hình đó hoặc nhận ra điều đó khi nhìn những bức tường liên tục bị phá hủy trong Red Faction
Nó gần như là Minecraft, nhưng theo kiểu cầm rocket launcher trên sao Hỏa
Để dùng GPU thì không nhất thiết phải đang chơi game
Dạo này cũng có nhiều phần mềm render có chế độ GPU
Tuy vậy, các thuật toán GPU thường được song song hóa ở mức rất cao nên nhiều khi khác với thuật toán mô phỏng trên CPU
EmberGen là một phần mềm cực kỳ điên rồ, có thể mô phỏng lửa và khói theo thời gian thực trên GPU dành cho người dùng phổ thông, đồng thời hỗ trợ workflow dạng node nên rất dễ tạo hiệu ứng mới
Quy trình vốn trước đây mất hàng giờ giờ đây có thể tinh chỉnh xong chỉ trong vài phút
https://jangafx.com/software/embergen/
Tôi cứ nghĩ bài này sẽ nói về EmberGen, và thành thật mà nói cũng hơi tiếc là EmberGen không được chú ý nhiều trên HN: https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
Tôi không liên quan gì đến EmberGen/JangaFX, chỉ là một khách hàng hài lòng thôi
https://odin-lang.org/showcase/embergen/
Nếu thích mấy thứ như thế này thì Ten Minute Physics cũng sẽ rất thú vị
Đặc biệt là chương 17, “How to write an Eulerian Fluid Simulator with 200 lines of code”
https://matthias-research.github.io/pages/tenMinutePhysics/i...
Tôi đang tò mò không biết có tài liệu nào được khuyến nghị cho người học mô phỏng CFD từ đầu, nhất là với một người học toán rồi chuyển sang làm kỹ sư phần mềm
Chủ đề này thực sự rất hấp dẫn, nhưng đã lâu rồi tôi không đụng đến giải tích vectơ hay phương trình vi phân riêng nên kiến thức toán đã rỉ sét khá nhiều
https://www.youtube.com/watch?v=zxiqA8_CiC4
Bản “Apprentice” miễn phí cho mục đích phi thương mại chỉ bị giới hạn ở tính năng render và cộng tác
Tuy nhiên đây là một công cụ khá sâu
Nếu đi từ phía phần mềm sang ngành này, workflow để học những công cụ như vậy hoàn toàn khác biệt
Nhiều người nói Houdini gần với một IDE hơn là một chương trình dựng mô hình 3D, và ở nhiều khía cạnh tôi đồng ý
Thay vì dùng công cụ trực quan kiểu Blender, bạn gần như xây mọi thứ bằng mạng lưới node rồi chỉnh các thuộc tính và tham số
Hầu hết mọi thứ có thể làm bằng Python, gọn gàng hơn mấy thứ như 3ds Max, nhưng vì không được biên dịch nên hiệu năng kém trong các mô phỏng lớn
Ngôn ngữ riêng kiểu C của nó là VEX cũng dùng ổn, và còn có hệ thống node chi tiết hơn dành cho các tác vụ tinh vi như toán học phức tạp
Về mặt kỹ thuật thì gần như toàn bộ là workflow hướng dữ liệu
Tuy nhiên nếu bạn là kiểu người “học bằng cách đọc tài liệu” thì sẽ phải nhanh chóng làm quen với việc yêu thích tutorial
Nó rất khác với bất kỳ môi trường hay mô hình tư duy nào tôi từng dùng, cộng đồng nhìn chung khá thân thiện nhưng cũng bị lời nguyền chuyên môn hóa khá nặng
Nếu thực sự muốn theo đuổi thì tốt nhất là kiếm một công việc trong lĩnh vực đó, và có thể thử ứng tuyển phía Federal hoặc Contractor ở Marshall Space Flight Center hay Ames
Ở Ames có các hệ thống Aitken [#85, 9.07 PFlops], Pleiades [#132, 5.95 PFlops], Electra [#143, 5.44 PFlops] theo Top500
GRC, LARC, JSC cũng có một phần
Ít nhất là vài năm trước, việc tích hợp giữa Contractor/Federal khá tốt và gần như minh bạch, trừ chuyện phân bổ tiền
Bên trong NASA, nhóm Propulsion Structural, Thermal & Fluid Analysis của MSFC [2][3] và nhóm Entry Systems của Ames [4] khá nổi tiếng
Khi đó chúng tôi chạy các mô phỏng Hybrid RANS/LES quy mô khoảng 100 triệu cell cho phương tiện hoặc phương tiện + bệ phóng, dùng Overflow/LARC [5] hoặc Loci/Mississippi State University [6], bao gồm lưới chồng động, khoảng 10~20 loài hóa học cháy phản ứng, và động lực học hạt bay hơi Lagrangian
SSME và SRB được kích hoạt cùng lúc, đồng thời có cả hệ thống dập nước khi phóng
Tuy nhiên thông tin này đã là từ 10 năm trước nên tôi không rõ mặt bằng hiện nay ra sao, chắc giờ đã tiến xa hơn thế
Nếu muốn biết ngành này đang quan tâm điều gì thì dù hơi cũ, nghiên cứu CFD Vision 2030 Study năm 2014 vẫn là tài liệu nhập môn không tệ [7]
Đi dạo quanh Supercomputing nếu kiếm được vé cũng khá hay
Năm nay nó được tổ chức ở Denver [8]
Tuy nhiên trọng tâm của nó là phía “quy mô lớn”, nên bạn sẽ chủ yếu thấy các mô phỏng thời tiết khổng lồ hoặc động lực học tinh vân
Tôi thích bản thân hội nghị này, nhưng đúng là khó thu hút chú ý nếu không có thành tựu ở quy mô kiểu #CPUs/#GPUs/#FPGAs++
Ngoài NASA, phía chính phủ còn có NIST(Gaithersburg), DOE(Oak Ridge, Sandia, Los Alamos), Air Force(AF Research Lab), Huntington Beach
[1] NASA Advanced Supercomputing Division: https://en.wikipedia.org/wiki/NASA_Advanced_Supercomputing_D...
[2] NASA, MSFC: https://www.nasa.gov/wp-content/uploads/2016/01/g-28367g_pst...
[3] Một số ví dụ hơi cũ: https://ntrs.nasa.gov/api/citations/20140016892/downloads/20...
[4] NASA Ames: https://www.nasa.gov/entry-systems-and-technology-division/
[5] OVERFLOW/NASA/LARC: https://overflow.larc.nasa.gov/
[6] Loci/MSU: https://simcenter.msstate.edu/
[7] Nghiên cứu CFD Vision 2030: https://ntrs.nasa.gov/api/citations/20140003093/downloads/20...
[8] Supercomputing SC23: https://sc23.supercomputing.org/
Cũng có phần thứ hai của Muller, người đang hoạt động rất tích cực trong lĩnh vực này: https://matthias-research.github.io/pages/tenMinutePhysics/i...
Sau đó nó được xuất bản thành sách, và hiện là ấn bản thứ 2 của Fluid Simulation for Computer Graphics