2021年12月23日 星期四

Support Function

看了這篇文章,很好奇為什麼

Support(v,-B) = (-1) * Support(-v,B)

於是就打開Geogebra玩看看


上圖的黃色區域叫CSO 
把刷子「水藍B」的每個頂點*(-1) 
可以得到刷子「草綠C」
C = -B

把「草綠C」的local原點(刷子柄)平移到M點
那麼「草綠C」就會平移到上圖的位置

把「草綠C」的local原點(刷子柄)在「粉紅A」區域移動
就可以製造出黃色的CSO了 像這樣
影片裡「草綠C」還是「黃色」的
如果你也想自己刷刷看的話 Link

Support(v,A) 幾何意義是:
找出A在v方向的最遠的點

所以
Support(v,A) + Support(v,-B) 
就是:
找出CSO在v方向的最遠的點

當你拿著「草綠C」的刷子柄
在「粉紅A」區域移動(不能轉動刷柄)

Support(v,A):
在「粉紅A」區域沿著v方向最遠的點是M

Support(v,-B):
刷子「草綠C」沿著v方向最遠的點是F'
C = -B

點F' 對映到的點是F
F是刷子「水藍B」沿著-v方向最遠的點
但點F乘上(-1)才會變成「草綠C」上的點F'

所以
Support(v,-B) = (-1) * Support(-v,B)

//////////////

用「點」對人眼比較直觀
但上面的Support function其實是用「向量」在計算
比如說,把向量F和向量-v做內積
(如果是圓的Support function
只要從圓心延著射線方向走半徑距離就可以了)

2021年12月15日 星期三

四元數轉旋轉矩陣

如果你有1個正規化的4元數

q=(cos(θ/2),sin(θ/2) U)

q=(w,x,y,z)

這是它的共軛 

q*=(cos(θ/2),-sin(θ/2) U)

q*=(w,-x,-y,-z)

要怎麼得到等效的旋轉矩陣呢?


如果是左乘的話 vM

那旋轉矩陣M就是 

Xx Xy Xz

Yx Yy Yz

Zx Zy Zz


用四元數旋轉一個向量v

就是對向量v做三明治運算

 q (0,v) q* = (0,v')

這樣得到的v'

就是v繞著U軸轉θ的結果


這是單位旋轉矩陣

X軸:1 0 0

Y軸:0 1 0

Z軸:0 0 1

分別對這3軸做1次三明治運算

 q (0,X軸) q* = (0,X軸') 

 q (0,Y軸) q* = (0,Y軸')

 q (0,Z軸) q* = (0,Z軸')

X軸'、Y軸'、Z軸'分別是

X軸、Y軸、Z軸繞U軸轉θ的結果


現在,你可以拿這個旋轉矩陣

X軸':? ? ?

Y軸':? ? ?

Z軸':? ? ?

來旋轉向量v了


2021年12月11日 星期六

Texture2D Bilinear

我當時用比較搞工的觀點

方法1

後來想過,其實可以用更簡單的觀點

方法2
需要把邊界也包含進來(上圖沒畫出來)

我發現TinySoftRendwrer
定義uv值(0,0)、(1,0)、(0,1)、(1,1)
位在貼圖最邊緣的像素上
(我是定義在黑色框框上)

所以他只要
把u mapping到0~(w-1)之間
把v mapping到0~(h-1)之間
uv mapping to u'v'

對 u'、v'取整數值,就能知道
雙線性內插左下角的像素索引了

2021年12月6日 星期一

6參數版本的Projection Matrix

一直以來都是Fov派

突然有點好奇 6參數的版本

他推導的這1步 我覺得不是很直覺

所以想了一下,還是換成自己好理解的版本


Oblique Matrix 推導的疑惑

為什麼Eric先生 (Thank U
要用(sgn(C'.x),sgn(C'.y),1,1)
而不是F * (sgn(C'.x),sgn(C'.y),1,1)呢?

--------------

在projectin space
right平面和top平面會相交在1條線b
在b上的點,只有(F,F,F,F)是4個值相等的
而(F,F,F,F)/w之後
會得到 (1,1,1,1)

--------------

P是projection matrix (OpenGL Right Hand Fov version 
P的逆矩陣是 P^-1
P^-1 (F,F,F,F)=( Ratio F tan(θ), F tan(θ),-F,1 )=QF
P^-1 (1,1,1,1)=( Ratio tan(θ), tan(θ), -1,1/F )=Q

Matrix (Thank U

calculate

在view space , w =1
Q = Q/Q.w =QF
Q和QF其實是同1個點

用Q和QF算出來的 a 也是同1個東西
(因為上下都有1/F,最後就互相消掉了

--------------

3D平面 vs 4D平面
平面在3D的定義是
(X-P)。N=0
X、P、N都是3維的向量
。是內積;P是位在平面上的1點

X。N-P。N=0
X。N+d=0
展開來就是
(x,y,z,1)。(Nx,Ny,Nz,d)=0

Eric文章裡C指的是(Nx,Ny,Nz,d)
把平面當成了1個4D向量
view space C變換到Projection space的結果是C'

fov=2θ(half fov=θ)
Right裁切平面的情況為(以下為右手座標)
C'  = (-1,0,0,1)
C  = (-1/(R*tan(θ)),0,-1,0)

在view space是
(x,y,z,1)。(-1/(R*tan(θ)),0,-1,0) =0
-x/(R*tan(θ))+z=0

在projection space(4D)是
(x',y',z',w)。(-1,0,0,1) =0
-x'+w =0