2022年8月22日 星期一

Viewport豆知識:Untiy Vs Unreal

今天在Unreal把MousePosition映射到NDC

(Editor Mode)

-1 < Xn < 1

-1 < Yn < 1


再從NDC映射到Camera的近平面上的點P時

Field of View = θ

ratio = screen width / screen height


scaleU = Xn * tan(θ/2) * ratio

scaleV = Yn * tan(θ/2) 

P = CameraPos + CameraX

 + CameraY * scaleU

 + CameraZ * scaleV

(Unreal的Camera是X軸和近平面垂直)

發現不管怎麼結果都很奇怪


後來先把ratio拿掉

scaleU = Xn * tan(θ/2) 

scaleV = Yn * tan(θ/2) 

才看出Unreal和Unity處理NDC到P的做法是不一樣的


Unreal使用的是

scaleU = Xn * tan(θ/2) 

scaleV = Yn * tan(θ/2) /ratio

假設 ratio = 2、θ = π/2 (90度)

當 Yn = 0.5, 有 scalueV = 1 


Unity使用的是

scaleU = Xn * tan(θ/2) * ratio

scaleV = Yn * tan(θ/2) 

假設 ratio = 2、θ = π/2 (90度)

當 Xn = 1, 有 scalueU = 2 


這代表,在Unity裡

你把Screen Width拉長時

水平方向會看到更多的東西


而在Unreal裡

當你把Screen Width拉長時

水平方向看到的範圍不變

但垂直方向看到的東西會變少


乘下的2個Case

在Unity裡, 把Screen Height拉長時


在Unreal裡, 把Screen Height拉長時


2022年6月3日 星期五

色碼表

到底色碼表裡的值,是sRGB(Gamma)還是raw(Linear)呢?

raw(Linear) ➡️ 本色
sRGB(Gamma) ➡️ 提亮後的本色

為什麼要提亮
因為銀幕輸出時存在著衰減

就是1個後面出了包
前面只好跟著上補丁的概念
欸?

前置作業

打開色碼表

好 就決定是你了

在網路上找一張照片

好 就決定是你了

Texture 101

建立測試環境


建1個Texture Node,連到FragmentOutput Node

你知道的 一般的照片都是sRGB(Gamma)
我們讓它回到raw(Linear)

raw(弱)

因為raw用銀幕輸出會變暗
所以我們再把FragmentOutput做Gamma
亮回來

開始測試

#EBD3E8
aka rgb(234, 209, 231)
我們為它拉一個Color3 Node


整個實驗的邏輯是這樣的

假如 input 是 Raw(弱)
做了gamma (增強)
output 就會正常


現在我們讓
#EBD3E8
aka rgb(234, 209, 231)
變成input

可以發現output比原圖亮

這代表 ➡️
#EBD3E8
aka rgb(234, 209, 231)
不是Raw
是「提亮」過的數值

變換回raw後,output的結果就正常了

提亮 VS 本色

#EBD3E8
在sRGB界 aka rgb(234, 209, 231)

rgb(234, 209, 231)

但是在raw界
它是 rgb(211, 165, 205)

右邊是經螢幕衰減後看到的raw 

rgb(211, 165, 205)

🧐

加碼

PBRMetallicRoughness Node的結果
應該是Linear space

小畫家是你餵什麼給它
它就直接用銀幕輸出什麼
(HTML5也是這樣)

但一般遊戲都會在Linear 計算光照結果
最後輸出時再做提亮
(WebGL也需要這樣)

結語

色碼表的值是sRGB

2022年5月25日 星期三

All I Want for ImportMesh Is Node

用Babylon載入1個外部模型

就會多1個新的 Node

但是翻看文檔
沒看到怎麼取得這個 Node
該怎麼辦呢?

ImportMeshAsync

會給你1包像超商福袋的東東

ISceneLoaderAsyncResult

接著讓我們來瞧瞧
福袋裡有些什麼

Mesh

Mesh就是艾姆的皮
也就是遊戲角色的外貌

可以看到艾姆在Babylon有2個Mesh

在Blender裡只有1個

其中1個Mesh是不包含Geometry和Material的假皮

Bone

Bone就是模型的骨架



Skeleton

Skeleton就是最上層的骨架


AnimationGroup

記錄著每根bone的animation
bone的演出又影響著Mesh外觀的改變



福袋看完了

Babylon會把福袋的東西
放到1個Node底下

再把這個Node
放進Scene.rootNodes裡

rootNodes的個數 由原本的2變成了3

Where is my Node?

看吧 我們要的Node不就在這裡

就是m[0]

這到底什麼奇葩設計?我不懂 🤔🤠

文檔

最後看一下
Node、TransformNode、Mesh的繼承關系
結束這1回合



Special Thanks

要不是有debugLayer
現在1定還在雲裡霧裡吧

2022年5月17日 星期二

Static Function and Blueprintcallable

當SetWahCarTime的參數 WashCarTime
和Static變數 WashCarTime 同名
Comiper會過不了 並告訴你錯誤的地方


人家C#、Java、Typescript都沒這問題
就你毛最多


但是當你把 WashCarTime 
從 float 改成 dobule 時
它什麼毛都不會告訴你



為什麼要把WashCarTime
宣告成dobule呢?

不是
FTimespan回傳給你的就是dobule阿



但就算你把參數
改成pWahCarTime
還是Comiper不過就是了



倒敘法大概就是這麼1回事吧

2022年5月7日 星期六

Unreal Delegate 初體驗

5:10 自動完成 阿就是出不來


定義Delegate


宣告Delegate物件


自動完成出不來 不要以為少了那個步驟
(因為它是用Marco定義 VS不一定認的出來)

曾幾何時

對Unity Programminer來說

「想當然耳」要有的「自動完成」

(Code completion)

也變成了「可遇不可求」


Unity 

我好想你 我好想你 就深藏在心





2022年4月8日 星期五

丟骰子

有一年尾牙
公司安插了一個小遊戲
骰子丟贏老闆就可以拿現金

我就想
老闆玩遊戲都這麼佛系嗎?

像老闆一樣思考


W fro Win

比大小 ➡️ 大的贏

這麼多種可能,我那時候是寫程式去跑


遊戲進入尾聲的時候,老闆又說
比大小這樣太無聊了
6 > 5 > 4 > 3 > 2 > 1
不刺激 Boring
我們改一下規則,讓 1 > 6

但這其實也是set好的

1比6大的情況 ➡️ 輸贏的機率完全一樣

2022年4月4日 星期一

魔球

拋體的垂直方向初速 ➡️ V0

拋體上升到最高點花了 tup
從最高點下降到Target花了 tdown
 tall  tup +  tdown

X ➡️ 拋體移動的水平距離
拋體的水平方向速度 Vx = X / tall

因為 X = Vx t
➡️ t = X / Vx

使用 t 就能畫出拋物線的路徑了
Y = Vy t + gravity  t2 / 2 ➡️ path(x)
拋物線射門 (改變時間t 球就會動了) 

如果是香蕉球呢?

拋物線在地面的投影路徑是1條線
如果讓投影是拋物線呢?
如果讓投影是sin呢?
魔球 (改變時間t 球就會動了) 

periodNumber = 0.5

periodNumber = 1 

消失線 feat. 3ds Max