日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

opengl动画_物理动画流体实现流程(Physically Based Fluid Animation)

發布時間:2024/8/1 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opengl动画_物理动画流体实现流程(Physically Based Fluid Animation) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0 說在開始

發現介紹物理動畫實現流程的文章較少,入門需要一定時間,所以才有了這篇文章。此文章不具體介紹算法部分和數學公式,例如SPH、歐拉公式、NS公式、彈簧質點模型等等,而是如何去構造自己的第一個計算機圖形學動畫,其中涉及較多Reference,我會在文章最后給出,非常感謝。(其為我在實驗室做實驗時整理得到,趁熱記錄~)

因個人實驗室的代碼不方便開源,找到代替代碼,流程都是類似的:

https://github.com/douysu/person-summary?github.com

所需知識、內容和工具:

  • OpenGL-實時可視化運行狀態. 鏈接
  • 圖形學物理仿真知識掃盲-閆令琪Animation圖形課程部分. 鏈接
  • Blender、Mitsuba Renderer或其他渲染器. 鏈接

1 運行結果

Fluid Simulation(物理動畫流體模擬)展示視頻_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili?www.bilibili.com知乎視頻?www.zhihu.com

2 物理動畫渲染流程

其可以分為三步:

(1)物理仿真:其包括多種算法,基于粒子的物理方法。賦予粒子物理特性,例如重力,張力,相互作用力,計算粒子下一步位置。

(2)液體表面重建:無論歐拉方法還是拉格朗日方法,粒子都是離散的,都先需要進行液體表面重建,計算法向量,然后在送入Blender進行渲染。 鏈接

(3)離線渲染:在Blender中設置場景(光照、材質、攝像機)中渲染成圖像。使用工具將連續圖像序列轉為視頻。

一步步來介紹。

3 物理仿真

使用WCSPH、PCISPH、DFSPH或者其他物理仿真算法實現仿真,可視化部分使用OpenGL,如以下幾個開頭效果的仿真圖,算法實現部分和場景搭建可以查看其它Github和文章。

在仿真過程中,記錄每一幀的粒子信息到二進制文件中,這里二進制的文件格式為.pos。如下。這里需要注意,重構時,不同相的物體需要分開保存,因為渲染階段需要付給物體不同材質。例如,這里的0_0_d.pos為第一幀水杯,需要付給玻璃材質。0_0_f.pos對應流體的內容,也就是杯子中的水,需要付給水材質。

有了每一幀粒子的數據了,下一步為重構。

4 液體表面重建

得到每一幀.pos二進制文件,對每一幀中的所有.pos進行重構得到ply模型。這里對應331幀和332幀ply。

5 離線渲染

打開Blender,導入ply,設置場景(材質、燈光、視角、背景板等)點擊渲染->渲染圖像。渲染當前幀圖像。

只是一幀渲染方式,我們有很多幀動畫,不可能一幀一幀手動渲染。解決問題,Blender支持腳本編程,可以實現自動渲染,來看腳本,實現200-375幀渲染。water為保存的水材質的名稱。

# -*- coding:utf-8 -*- import shutil input_path = "K:我的資料庫YDIISPH-Three-Despace" path_ply2 = input_path + "pos" path_ply3 = input_path + "solid-ply" path_ret = input_path + "re2" for n in range(200, 375):bpy.ops.import_mesh.ply(filepath=path_ply2 + str(n) + "_c.ply")bpy.context.object.active_material=bpy.data.materials["water"]bpy.ops.import_mesh.ply(filepath=path_ply2 + str(n) + "_f.ply")bpy.context.object.active_material=bpy.data.materials["water"]bpy.context.scene.render.filepath = path_ret + str(n) + ".png"bpy.ops.render.render(write_still=True)bpy.ops.object.delete()# remove mesh from memorymesh_c = bpy.data.meshes[str(n) + '_c']mesh_f = bpy.data.meshes[str(n) + '_f']mesh_c.user_clear()mesh_f.user_clear()bpy.data.meshes.remove(mesh_c)bpy.data.meshes.remove(mesh_f)

最后得到200-375連續幀圖像,在使用工具轉成視頻即可。

Reference

  • GAMES101-現代計算機圖形學入門-閆令琪
  • GAMES201:高級物理引擎實戰指南2020 胡淵鳴
  • Blender渲染引擎Cycles教程
  • Fluid Engine Dev - Jet
  • 液體渲染:一種屏幕空間方法
  • 以及本文出現的所有鏈接

總結

以上是生活随笔為你收集整理的opengl动画_物理动画流体实现流程(Physically Based Fluid Animation)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。