題目如下:
已知角1及角2、邊長a及b,還有向量OC,試求向量OA及OB。
續上一篇,我把我的idea介紹給有志創作好遊戲的朋友們,希望大家一起向理想邁進。
首先,先了解一下我畫的這張3D切面示意圖。XY軸是指遊戲中攝影機的座標軸,分別是水平軸X與垂直軸Y,另外有個Z軸,是在垂直於示意圖的方向。
三角形OEF是攝影機,O是攝影機的位置,角EOF是攝影機的能見視角,角2是角EOF的一半,而角1是攝影機的仰角。
理論上,天空若是一個平面,這個平面應該與X軸平行,並向無限遠延伸出去,OK,讓我們將天空的高度設為b。
天空會和X軸相交,但是在無限遠處(數學很有哲理吧!)。我將這個理想中的狀態做了點小改變,讓天空和X軸提前在G點相交,這樣一來,我的天空就只剩下HG這一段了,而落在攝影機內的DG就是我們準備畫出來的部分。
首先求出點D與G的座標,但這兩個點並不是我們最後用來畫平面的點(兩個點也畫不出個蛋),我們需要的是D與G在Z軸與攝影機的四角錐分別相交的 四個點。為了求出D需要在Z軸平移多少會和攝影機相交,我們需要知道OA的向量長(至於如何用OA去算平移量,這又是另外一課了)。
在由OA及OB算出最後平面的四個點,我們就能畫出天空了。當然G點要做個小修飾,不過也不困難,就是將天空平面的透明度由D點的0%加到G點的100%,如此就能讓天空像是無限延伸並融入背景的霧色。
如果你還有疑惑,大概會是想問,HG明明這麼斜看起來怎會像和X軸平行。這個問題問得好,但我們控制b/a的比值,這個值若小到某個程度,基本上是看不出來和平行有什麼差別。
另外a長可以縮到剛好在攝影機的鏡頭前,這樣DG就可以非常非常小。好,我知道你又有問題了,DG既然這麼靠近鏡頭,那不就把其他的3D物件都擋 住了。這也很容易解決,我們只要在畫圖的一開始就把天空畫完,並把這張圖當成背景,然後再開始畫上其他的3D物件,那看起來就Perfect了!
最後談談這個方法的限制。
第一點並不算是個限制,在攝影機爬到很高的地方,G點以下需要再做一些處理,b/a的比值最好也隨著調整,看起來比較擬真。
第二點是個小限制,攝影機不能以OC軸旋轉,不過這也不是個大問題,因為這種情況不多見,而且還是有辦法算出正確的平面,只是複雜很多。
第三點呢,仰角1最好不要超過(90度-角2),因為這樣攝影機要跨過Y軸,我們必需再多畫另一面的天空,不過still not a big deal.
目前我實作出來的效果真的蠻不錯的,若有什麼建議可以再與我討論。
沒有留言:
張貼留言