標籤:

說說一個美工寫代碼的感受

最近越來越多的時間花在寫各種工具上,有一些感慨想要寫一寫。同時也算是給自己留下一些文字的記錄和總結。

我知道我寫代碼的能力還不夠好,但是對這方面的認知水準也很低,所以反而可以樂在其中,搞出點啥都很興奮很開心。反面的例子就是我的渲染水平,說實話已經不低了,然而眼光也高得嚇人,高到覺得不管做什麼都不夠好,以至於還沒動手之前就已經泄氣了。反而沒有寫工具有意思,現在就深陷這個泥沼之中啊。

▉ 最開始的時候:

我最開始迷戀程序是以前做遊戲項目的時候,發現幾行簡單的代碼就可以讓我做的角色聽從自己的命令在場景里到處跑,實在是太有意思了,然後就一發而不可收拾;除了完成自己本職的美術工作(模型、綁定、動作)以外的時間,都拿來嘗試自己寫遊戲了。

那時候自己還在做遊戲,就拿遊戲里用的模型動作直接放到自己寫的遊戲框架里,本來一個跑酷遊戲,硬生生變成了動作遊戲,我自己也是玩得不亦樂乎,特別開心。最誇張的時候,一天時間,從早上七點多到晚上十一點多,除了中間吃飯喝水上廁所,就沒離開過電腦前;上廁所還要跑著去。

雖然最後我們的遊戲產品沒做出什麼成績,不過我自己倒算是開始接觸了編程方面的知識。那種打開新世界大門的感覺,和最開始學渲染一樣興奮,甚至更有趣得多。

ps:當時做遊戲留下的殘骸,某一版資料片的宣傳片:

brodic_frozenPurgatory遊戲宣傳片第二彈

瘋狂發展期

之後 遊戲行業的泡沫破了之後,就到南京原力公司做影視了。同樣也是我非常喜歡的方向,參與的項目也特刺激。只不過做的工作的話,重複性特別地高,搞到後面人就疲了;每天就是打開文件、導燈、分層、調、渲、調、渲、提交、改、提交、渲序列,這麼個流程。

人都說,懶是推動人類進步的核心動力。天天面對枯燥的流程我就犯懶了,希望讓聰明的電腦自動幫我完成枯燥的流程。那個時候只有一些做遊戲的時候學的C#的底子,還不知道怎麼在maya里寫工具。

然而我太懶了,非常渴望把自己從重複勞動中解放出來。於是等渲染的間隙,我就自己學習python,學習怎麼在maya中使用python來實現一些功能。很快,我學到的知識就轉化成了一些可以使用的小腳本工具了,大大節省了重複勞動的時間,有的時候要加班到半夜的工作,下班之前就完成了,我開始品嘗到寫工具的甜頭,上了癮。

我在這裡說的很輕描淡寫,彷彿就那麼幾天我就立即學會了怎麼在maya中寫工具一樣。實際上這是一個萬分痛苦的過程,你想像一下你最開始接觸maya的時候,連轉動攝像機都不會的時候,整個世界於你來說是一隻陌生的洪水猛獸;做什麼都不對,動動滑鼠按按鍵盤都犯錯;舉步維艱這個詞放在這裡特別對。

記得去年的有一天,我在公司通宵做鏡頭,同時寫一個優化角色的工具。那天是TI6結束的一天,是Wings決賽的一天,是我們的電影離上映時間不足一月的一天。我一邊做渲染、一邊寫工具、一邊用手機流量看wings決賽,心裡五味陳雜。

最後,wings奪冠了,我把工具完好地寫出來了,當時做的電影最後居然也按時上映了。瘋狂努力流下的苦澀汗水混雜著目標達成的出乎意料、難以置信 混雜在一起形成的一股特殊味道濃烈地鐫刻在2016年的盛夏;至今難忘。

人生或許總需要這種戲劇性的片段 給平淡的日常生活帶來一些生機,從那之後我寫工具的能力也奇妙地走上了正軌,再沒有最開始時候的磕磕絆絆,逐漸變得輕車熟路起來。想要實現的功能,多花點時間思考和查找總是能實現。這對一個半道出家寫程序的美工來說,確實是振奮人心的事情。

最近的一點總結(含大量邏輯思考過程,可以換台了)

後來我順著高漲的寫工具熱情,結合自己的需求,寫出了SP2M 工具 SP2M工具相關介紹 ,因為很多人也和我有一樣的需求,所以得到了大家的贊同。

再後來就是前幾天,我自己做模型的時候,因為要把一些不規則的點變成完美的圓形,以前都是建一個圓柱一個點一個點去吸附的。當時覺得老這樣操作好麻煩啊,不如自己寫個工具以後可以一直用,而且心裡想的是,應該很快吧,大概一個小時?

嗯,結果可怕的事情就發生了。我估計很多朋友也有類似的經歷——嚴重錯誤低估任務的複雜程度 + 盲目樂觀 + 超級不服軟的完美主義 ,導致了你想要做的事情無限期延長,甚至直到永遠。

我從一開始的一個小時,到花了一下午,到花了兩天,到整整花了一個星期,才完美解決了所有的問題。

說起來基本演算法和功能真的簡單,但是我把基本功能實現了之後,我心裡的完美主義就開始耐不住寂寞了。

完美主義小人說:「不行不行,你現在只是實現了在平面上變圓的效果,如果是傾斜平面呢?寫工具不就是要面面俱到嗎?」

我一聽覺得完美主義小人說的對,於是就去找旋轉平面的方法;之前就一直有了解線性代數是解決三維旋轉問題的利器,於是去惡補了一下線性代數的很多知識,這一下子就用掉了兩天。然後寫了一個class,可以處理矩陣的一些問題,可以處理平面旋轉了。[1]

有些朋友一定會說,不是有現成的庫做算矩陣做旋轉的嗎?你怎麼不用?

這個時候我心裡的完美主義小人又跳出來,趾高氣揚地叫喚開了:「不行不行,別人寫的東西,你知道怎麼實現的嗎?你自己都搞不清楚情況,怎麼能用得問心無愧呢?還有啥能比自己寫的東西更好的?寫工具不就是要面面俱到嗎?」

好不容易解決了旋轉的問題,我感覺差不多可以日常使用了。這個時候完美主義小人又跳了出來:「不行不行,你現在只能處理全部在同一個平面里的點,如果點的位置很不規則,起伏不定呢? 寫工具不就是要面面俱到嗎? 」

我一聽覺得完美主義小人說的對,但是要處理隨機點的問題就難得多,我最終肯定還是要把所有點放在同一個平面里,並且排列成一個完美的圓。關鍵就是這個平面怎麼算呢?經過一番夯吃夯吃地查找,我發現解決這個問題需要用到最小二乘法來擬合三維平面。這玩意兒就只聽說過從來沒弄過啊,最後又花了兩天時間查各種原理以及演算法,最終寫了個簡單的最小二乘法演算法可以擬合三維平面,攻克了這個問題。[2]

這下我覺得完美小人終於可以滿足了,結果使用過程中還發現了問題。就是有的時候會出現奇怪的旋轉。

有一些朋友說變圓的功能在dtools工具里也有,同時dtools也有如圖所示的問題。

這次完美小人沒說話,只是用達康書記一樣的眼神蔑視我……

好的,我知道了,我去改就是了。

問題就出在變圓的演算法,我是預先就定義了一個圓,把模型的點都吸附到這個圓上面去。並且第一個點肯定出現在圖中的正6點鐘方向,所以有的時候圓就會歪了。

最後我想到的解決方法還是從最小二乘法的思路里來的 : 用選中的模型上每一個點,到 目標點的旋轉, 平方 ,累加在一起,求最小偏差。

算的過程我內心有點狂野,有點激動,我覺得這個思路理論上可行,但很有可能不行,我也就死馬當活馬醫,不行的話我也不當回事兒,我再想想辦法。好好地安慰著自己的同時,我不停地計算著,最後算出了一個看起來還挺美麗的公式,感覺好像有點希望。轉換成代碼以後執行……

嗯哼?

完美!

當時我都驚呆了。這就像裸寫了幾百行代碼,準備查一下bug的時候,結果居然運行流暢時的感受。

我彷彿看到了完美小人偷偷對我投來了讚許的眼光。

參考資料:

[1] 矩陣變換:沿任意軸旋轉及其推導 - zsq306650083的專欄 - 博客頻道 - CSDN.NET

[2] Fitting a plane to many points in 3D


推薦閱讀:

VRay for SketchUp工業產品表現之煤油燈
VRay for SketchUp環境阻光(AO)的簡介與應用
##譯## The Comprehensive PBR Guide by Allegorithmic — Vol.2

TAG:编程 | 渲染 |