..

光线投影的一些计算

光线求交

首先实现了不同几何类与光线的求交点算法

使用光线的参数表示

P(t)=R0+tRd

注意距离 t 并非真实单位距离,而是与 Rd 相匹配的 t,归一化 Rd 时要避免影响

交点处法向量应与光线方向 Rd 成钝角

平面

隐式表示平面为

nP+D=0

则点到平面距离为

t=(D+nR0)/(nRd)

验算是否满足

t>0

其中平面法向量即为

n

三角形

用顶点表示三角形为

P0,P1,P2

设光线与三角形平面交点

P=(1βγ)P0+βP1+γP2

E1=P0P1

E2=P0P2

S=P0R0

则有

(tβγ)=1det(Rd,E1,E2)(det(S,E1,E2)det(Rd,S,E2)det(Rd,E1,S))

验算是否满足

t>0

0β,γ1

β+γ1

其中三角形法向量为

E1×E2

球体

用隐式方程表示球体为

|PPc|r=0

由光源指向球心的向量

l=PcR0

从而可以通过 l2r2 大小关系判断光源是否位于球体内部

球心到光线所在直线的投影点

tp=lRd

验算是否光源在球体内部或

tp>0

球心到光线所在直线的距离

d2=l2tp2

验算是否满足

dr

投影点到光线与球面的距离

t0=r2d2

如果光源在球体外部则

t=tpt0

如果在内部则

t=tp+t0

其中球体交点处法向量为

PcP(t)

相机模型

透视相机

相机模型

为了计算图片空间射线,使用相机空间变换

空间缩放系数

fx=fy=width2tan(angle/2)

相机空间下射线

dRc=(ucxfx,vcyfy,1)T

其中 u, v 为像素坐标

cx, cy 为相机位置,一般取图像中心即 width/2, height/2

坐标变换得到

Rd=RdRc

其中过渡矩阵

R=[horizontal,up,direction]

模型着色

Phong 模型

使用 Phong 模型计算局部光强

Ipixel=cαkα+xcx(kdReLu(LxN)+ksReLu(VRx)s)

其中 cx 为光源颜色,不考虑环境光时 cα=kα=0kd, kα 为材质属性

N 为相机到相交处的法向量,Lx 为相交处到光源的方向向量,V 为光线方向

ReLu(x)=max(0,x)

反射光线方向

Rx=2(LxN)NLx

图片处理

从文件中读取配置文件,循环像素点分别计算相机出射光线是否和场景有交点:找到最近交点后叠加来自所有光源的光强影响并累加局部光强,若不存在交点则返回背景色。