ONB视见坐标框架
ONB是在渲染器中看到的幾個概念,不過這玩意我還是為了放心在houdini可視化了下。
畢竟這玩意其實跟Houdini中copy的正交基完全一個概念。建立up向量,形成正交矩陣.
?
ONB其實就是一個簡單的正交基,但是只要是正交基就能表示在他作為 基的情況下的向量。 3個不相關向量 可以 唯一的線性表示任何向量.
作用:
(1),制作投射相機的投射光線方向
(2),lens_shader sampler points : 景深采樣點的變換,方便得出? ? 透鏡與焦平面? ?光線投射方向
?
下面主要看如何快速的將一些采樣點快速變換到 ONB坐標架下(2):
?
例如紅色球是攝像機的目標點(target_point),藍色點是眼睛的位置(eye)
藍色的線可以看成一個向量,但是我們要的方向w是從 <紅色點到藍色的方向> 來建立 ONB坐標架.主要是滿足右手坐標架
vector up = set(0,1,0); vector target_pos = point(1,"P",0);vector w = normalize(@P - target_pos); vector u = cross(up,w); vector v = cross(w,u);v@ww = w; v@uu = u; v@vv = v;現在可以看到ww,uu,vv向量構建的正交基.
?
?利用這個正交基可以快速的將采樣點變換到這個ONB框架下.例如在 景深 這章。在單位圓(xy平面)的點要變換到這個坐標下:
?
?
?
vector eye = point(1,"P",0); vector u = point(1,"uu",0); vector v = point(1,"vv",0);@P = eye + u*@P.x + v*@P.y;?
?
PBRT 2.2.5給出了一個從一個vector 構建一個coordinate system:
v1 是x軸向為圖中的紅色向量,v2是黃色,v3藍色.
?
vector v1 = set(1,0,0); v@v1 = normalize(v1);if(abs(v1.x) > abs(v1.y)){float invLen = 1.f / sqrt(v1.x * v1.x + v1.z*v1.z);v@v2 = set(-v1.z * invLen , 0.f , v1.x*invLen);} else {float invLen = 1.f / sqrt(v1.y * v1.y + v1.z*v1.z);v@v2 = set(0.0f, v1.z * invLen , -v1.y*invLen); }v@v3 = cross(@v1,@v2);?
轉載于:https://www.cnblogs.com/gearslogy/p/11011550.html
總結
- 上一篇: Python学习教程(Python学习路
- 下一篇: 纯 CSS 实现三角形尖角箭头的实例