最近在 Ryan Bruck's Blog 看到一系列有關 volumetric rendering 的文章, 相當精采,而且也有附上 source code 對學習上實在是很有幫助,總結幾個 volumetric rendering 的重點,文章裡主要是使用 ray marching,從 camera 發射光束,計算光束在穿過 volume 的過程中最後呈現在 pixel 的顏色。
第一步是根據穿透率 (transmittance) 來算累積起來的 luminance,吸收率會影響穿透率,在光前進的過程中也會需要考慮到發散 (scattering) 的問題,會有二個因素關係到發散,第一個是發散的機率 (由scattering cofficient 來決定),另一個則是怎麼發散 (由 phase function 來決定), 但最重要的還是要先知道有多少光進來,這部份會由光的強度 (intensity)乘上穿透率再算上衰減的公式(通常是距離平方反比)來得到,這些都是簡化過後的說明,在實作的過程中會看到很多的數學公式,會再根據想要的效果來修改。
在 UE4 裡測試的結果如下,
記得使用的 box 需要先將 normal 反過來,這是為了當 camera 穿到 volume 裡的時候,有東西可以畫要不然一穿進去就會被切掉什麼都看不到,另外 UE4 裡的 material 設定好後,會需要一張 3D volume texture,主要是為了在計算時用來 sample volume 的密度 (density),這張圖文章裡沒有提到怎麼製作,所以我做了一個 houdini digital asset,可以方便的在 houdini 裡製作各式個樣的 volume 或是 pyro 模擬後的結果,指定目標的 field 欄位就可以快速的算出一張 volume texture,目前還在測試中,不過使用起來個人覺得還蠻方便的,可以少了許多鎖碎的設定,
Volumetric Rendering 是一個很吸引人的題目,接下來又有好多東西可以研究了 :)。
Sunday, January 15, 2017
Thursday, December 15, 2016
Unreal.js!!
Unreal Engine 也可以使用 javascript 喔! 這是由 NCSoft 開放出來一個稱 Unreal.js 的 plugin,除了 github 上提供的範例以外,Michael Chang 在 Beyond Tellerrand Conference 2016 有一個蠻有趣的展示
Friday, December 9, 2016
multiverse_note
Multiverse 是從 Bonus: Luma Pictures’ new tools for Doctor Strange fxguide 介紹 Doctor Strange 裡用到的一些技術裡看到的,
“There is no tool in the market capable of handling Alembic and USD, in Maya in the proper
way, - not to mention circumventing all the Maya limitations”
Tuesday, November 4, 2014
OpenVDB
最近開始玩 Houdini 後,發現 Houdini 在 volume 相關的領域表現真的相當出色,其中對 OpenVDB 的支援更是其它 3D 的軟體所無法比擬的,好奇心驅使之下,就想對 OpenVDB 有更深一步的了解,最好的資料當然就是原始碼囉,不過因為環境是使用 Windows 的情況下,一開始在建置這個架在 Linux 上的專案遇到了不少的困難,最頭痛的地方就是使用到的第三方的函式庫還真不少,有 TBB、boost、OpenEXR、zlib,要有 python 支援需要有 boost python,要 unit test 需要 cppunit,想要 build 出 viewer 還需要有 glew、glfw,再加上 debug/release 和 x86/x64 的設定,然後在測試時也有遇到一些奇奇怪怪的問題,著實花了不少的時間在做一些修正,不過目前 library 可以正常運作,編譯出來的 python module 也可以在 Maya 裡 import 進來,project 帶的 viewer 也可以執行,OpenVDB Maya Toolkit 也沒問題,說實在的也蠻有成就感的 :D,接下來就是開始研究一些相關的文獻,google 一下好像還真的不少,上星期也有看到 OpenVDB 3.0 beta 的發表,可能又有一陣子不會無聊了。
Thursday, August 28, 2014
Houdini 一個未知的領堿
這二個星期開始接觸 Houdini,只能說相見恨晚啊,整個軟體設計的理念和其它的 3D 軟體 Maya, Max 等完全不一樣,入門的門檻我覺得相當的高,邏輯的概念也要非常清楚,雖然看了很多教學,還是覺得一堆無法掌握的東西,簡單的說就是被 "定" 的很慘,但同時也無可自拔的愛上它,雖然現階段還無法駕御但可以很清楚的感受到 Houdini 所給與的彈性和強大的功能,也很享受在使用 Houdini 時不時地會有驚喜的感覺,不禁讓我想起一開始使用 vim 的 fu。
除了基本操作以外,我也同時在學習 Houdini 裡如何使用 Script 去做擴充的動作,配合工作上的需求,實作了一個 velocity field 輸出工具,有興趣的朋友可以到 Orbolt (velocity field exporter) 上下載,這個工具可以讓你做完特效的模擬後,將範圍內的粒子或是流體切割 voxel 後輸出每個 voxel 裡的 velocity,配合 Unreal Engine 4 的 GPU particle 可以做出很有趣的效果,簡單的示意圖如下,
做的不是很好但我想概念應該有傳達到。理論上也可以實現像這個教學影片裡的效果 (https://www.youtube.com/watch?v=Dces...Be8NqR8t#t=648),或是像 UE4 elemental demo裡的效果一樣,一整個華麗!
除了基本操作以外,我也同時在學習 Houdini 裡如何使用 Script 去做擴充的動作,配合工作上的需求,實作了一個 velocity field 輸出工具,有興趣的朋友可以到 Orbolt (velocity field exporter) 上下載,這個工具可以讓你做完特效的模擬後,將範圍內的粒子或是流體切割 voxel 後輸出每個 voxel 裡的 velocity,配合 Unreal Engine 4 的 GPU particle 可以做出很有趣的效果,簡單的示意圖如下,
做的不是很好但我想概念應該有傳達到。理論上也可以實現像這個教學影片裡的效果 (https://www.youtube.com/watch?v=Dces...Be8NqR8t#t=648),或是像 UE4 elemental demo裡的效果一樣,一整個華麗!
Monday, March 4, 2013
IPython - 學習 Python 的好東西
IPython 提供了一個可以互動的 Python shell,每一個執行的 script 都可以動態更改,結果也可以存起來供之後的 script 使用,除此之外還有很多預先定義好方便使用的 "Magic Functions",有 Qt based 的 Console 可以在看起來像 terminal 的介面中畫圖
,debug 的輸出訊息也比較清楚,種種好處之外,我最中意的就是像 sys? 或是 xxx_class?? 的功能了,有時候突然腦殘忘記某個 module 的功能,馬上可以叫出文件說明或是查某一個 function 是在做什麼的,真是太實用了!
,debug 的輸出訊息也比較清楚,種種好處之外,我最中意的就是像 sys? 或是 xxx_class?? 的功能了,有時候突然腦殘忘記某個 module 的功能,馬上可以叫出文件說明或是查某一個 function 是在做什麼的,真是太實用了!
Friday, February 22, 2013
Raspberry Pi 的備忘錄 (一)
就在過完年的這幾天收到了等待許久的 Raspberry Pi :D! 其實也沒有想到要用來做什麼用,只是覺得這東西實在很酷,就莫名的想用一台來玩玩,安裝完成啟動後就發現其實要設定的東西好像還蠻多的,設定這東西說真的當下搞定後過不用多久就會忘光了! (還是只有我會這樣 XD),所以就順手筆記一下自己有設定過的東西。
Monday, January 21, 2013
關於 Python 的投資報酬率
回想起來第一次接觸 Python 大概是三年前,那時因為專案關係做了一個 "世界事件的系統" ,程式裡定義了各式各樣的 "事件元件" 像是生怪、生 NPC、給予奨勵等,把這些功能開出來讓企畫可以用 Python Script 用簡單的 loop 或是加上一些判斷式來達到各種事件的變化性,那時就覺得 Python 還真是一個好東西。隨著時間的前進,陸陸續續的發現 Python 似乎愈來愈無所不在...
Wednesday, January 16, 2013
Jenkins 動手玩
這星期專案搬了位置,原本 build server 上跑的是 CruiseControl.NET,也沒有什麼問題,但就是突然心血來潮的想要玩玩看之前看到的 Jenkins continuous integration server,它的這個小老頭 icon 設計得還蠻可愛的~~
Monday, January 7, 2013
設定新 Mac 的備忘錄
不知不覺在工作和一堆瑣事下 2012 就這麼過了!!! 看到上一次發佈的時間是2011還以為看錯了 XD... 2013 一開始,還是覺得得寫些東西留下些記錄才好,要不然回頭一看,雖然做了很多事卻還是白白一片,想想 2012 做了有關 3ds Max 的 plug-in 和 max script,也摸了 Unity 3D 和入手了 Mac Air :D,mac 雖然一開始使用的時候覺得卡卡的 (windows 用太多的遺毒),但用了幾個月後覺得很多東西還真是不錯,剛好最近有需要設定一台新的 Mac,就順便做個筆記來做為 2013 的開場 ^^。
Monday, August 1, 2011
Maya Viewport 2.0 - HwPhongShader
HwPhongShader 這個範例新增了 Viewport 2.0 的支援,最主要的功能都是來於 MHWRender::MPxShaderOverride 的實作,MPxShaderOverride 可以讓使用者針對某一個 node 來自訂 render 的方式,輸入的資料有 geometry, textures 和 lights,我們可以將 MPxShaderOverride想像為一個 CgFx 或是 HLSL effect 檔的專用 renderer 根據 Maya 場景中所提供的資料來繪出物件。
Tuesday, July 26, 2011
Maya Viewport 2.0 - ApiMeshShape 範例
ApiMeshShape 這個範例新增了對 Viewport 2.0 的支援,示範了如何使用MPxGeometryOverride,基本上 MPxGeometryOverride 只是用來定義 geometry 和 render items 的一個介面
Sunday, July 17, 2011
Maya Viewport 2.0 API
Maya 2012 的重點項目之一就是強化過 viewport 2.0 和 Hardware Renderer 2.0 (http://area.autodesk.com/gdc2011/viewport?KeepThis=true&TB_iframe=true&height=520&width=840),viewport 2.0 是 Maya 開發團隊重新打造,架構在 programmable shader system 之上,想要用來取代舊有 rendering system 的新武器,理由其實不難理解...
Saturday, June 25, 2011
Vim 學習筆記 (五)
使用 vim 的時間不知不覺又偷偷的往上升了一些,三不五時的也會去隨便搜尋看看有沒有什麼新的好東西可以用,有時還真的會找到寶,像我最近用最多的就是這一個 - EasyMotion (http://www.vim.org/scripts/script.php?script_id=3526),有多好用呢?
Friday, May 6, 2011
How to reload python modules?
在寫 Wing IDE -Maya Python scripting 的好幫手 時有提到要如何修改 Python 的 script 後而不需重啟 Maya 的方法,主要是使用 reload 這個 function,但很快的就會發現當你的 script 也有 import 到別的 module 時,這個方法就行不通了,因為 module 之間有先後順序的依存關係,先 reload module A 和先 reload module B 會導至不同的結果,這個問題困擾了我許多,最後在 Reloading Python Modules 這篇文章找到一個不錯的解法 (不確定是不是最好的解法,但已足夠我目前的使用)
Thursday, May 5, 2011
Vim 學習筆記 (四)
真是驗了某人說的,vim 用的愈多,愈有不滿足的感覺,東找找西看看又發現了一些不錯的東西,順便做一個小筆記免得幾天不用就忘了 :)
- searchComplete ( http://vim.sourceforge.net/scripts/script.php?script_id=474 ): 在使用 "/" 搜尋時,輸入部份字串再按下 TAB 可以自動補完,就像在 shell 裡輸入命令時的 TAB 一樣,懶人 (我) 的好幫手。
- SuperTab ( http://www.vim.org/scripts/script.php?script_id=1643 ) : 非常方便的在輸入模式下使用 TAB ,按下 TAB 會將 match 的字串列出來,並可以使用 Ctrl+ N/P 去選到想要的字串。
- xptemplate ( http://www.vim.org/scripts/script.php?script_id=2611 ) : 類似 textMate 的 snippets,支援非常多種的語言,也很方便的定義新的 snippets,個人覺得非常好用,舉例來說,開一個 cpp 的檔,在輸入模式下,打 class 然後 Ctrl + \ ,xptemplate 就幫你輸入好一個完整的 class ,還有什麼比這個更方便的呢 :D
- surround ( http://www.vim.org/scripts/script.php?script_id=1697 ) : 原本已為這個是可有可無的 plug-in,沒想到試用之後,出乎意料的好用,可以很快速的在某個字或某行前後加入或刪除像 " 或是 ' 如果是編輯 html 或是 xml 還可以插入 tag 。
Sunday, May 1, 2011
Maya Python API 2.0!
Maya 2012 的 hotfix 1主打的一個項目就是 Python API 2.0! 根據宮方說法,新的 Python API 執行的更快,看起來也更 Pythonic,讓熟悉 Python 的開發者可以更容易的上手,從文件的說明有幾個重點,第一個就是新舊 API 可以共存,但不能共用,文件中提供了一個例子如下,
Saturday, April 30, 2011
我的 Maya Python scripted API 學習之旅 (二)
- CircleNode : 一個 DG node,input 可以是一個數值(例如時間),然後 output 是根據 input算出的 sine 或 cosine,在 plug-ins 的目錄底下還有一個 circleNode.mel 示範要如何使用這個 circleNode,我覺得這個範例雖然說沒有很複雜,但卻清楚說明了 Maya 設計上的理念,整個 Maya 無數個 node 所組合成,每個 node 的功能都明確的定義,資料進,經過加工處理,輸出新的資料,node 與 node 間乾乾淨淨沒有相依關係,這也是我相當為 Maya 著迷一個原因。
import pymel.core as pm
# 建一個 circleNode
pm.createNode("spCircle", name="circleNode1")
# 建一個球
newSphere = pm.sphere(r=1)
# 將時間的 outTime 串到 circleNode 的 input
pm.connectAttr("time1.outTime", "circleNode1.input")
# 將 circleNode 的 sineOutput 串到球的 translate Y
pm.connectAttr("circleNode1.sineOutput", '%s.ty' % newSphere[0])
# 將 circleNode 的 cosineOutput 串到球的 translate Z
pm.connectAttr("circleNode1.cosineOutput", '%s.tz' % newSphere[0])
- customImagePlane : 如何使用 MPxImagePlane 的範例,可以讓使用者定義新的 image plane 使用特定的 image 格式或是改變現有 image plane 的行為。
- customNodeFileTranslator : 非常陽春的 exporter/importer,輸出場景中 node 的名字,讀進來的時候,就將輸出檔中的名字列印出來。
- filmMoveManip : 一個自訂的 manipulator 用來控制 camera 的 filmTranslateH 和 fileTranslateV ,這個範例有一個 bug ,在 updateManipulators 這一個 function 中 selectionIter = OpenMaya.MItSelectionList(selectionList, OpenMaya.MFn.kInvalid)用 OpenMaya.MFn.kInvalid 是沒辦法選到 Camera 的,需要改成 OpenMaya.MFn.kCamera 才行,執行以下的 script 可以在 Custom 的 shelf 做出一個按鈕,選一個 camera 後,按下按鈕,按鈕會被 highlight 然後就可以在 viewport 裡秀出這個 manipulator 來拖拉改變 camera 的設定。
import maya maya.cmds.spFilmMoveManipCtxCmd( 'spFilmMoveManipContext1' ) maya.cmds.setParent( 'Custom' ) maya.cmds.toolButton( 'spFilmMoveManip1', cl='toolCluster', t='spFilmMoveManipContext1', i1="filmMoveManip.xpm" )
我的 Maya Python scripted API 學習之旅 (一)
對我來說,最好的學習資料來源就是 Maya DevKit 裡的範例,每一次新版 Maya 更新,我都會先去瞧一瞧裡面有沒有什麼新東西,也常常會有意料之外的驚喜,但最近也突然發現自已對這些最好的研究資料掌握度並沒有很高,很多東西都只有一知半解(可能連半解都不到),想趁著自已有空閒的時間,好好的走過這些開發團隊的心血,
Sunday, April 24, 2011
Tetrix in Maya with PyQt
在瀏覽 PyQt 的範例時,意外發現有一個 tetrix 的範例,不知為什麼就很想看看在 Maya 裡玩 tetrix 是怎樣的感覺,雖然很久以前好像就知道有人做過類似的東西(用 mel 做的? 我是只有聽過啦),總之,帶著興奮的心情就開始了,
Subscribe to:
Posts (Atom)











