对原文:https://blog.csdn.net/libing_zeng/article/details/60160279错误点进行了修改。
椭球面是球面通过仿射变换T得到的。
现在我们的问题是:怎么ray trace变换后的椭球面?
(先重申一点:经过仿射变换之后,直线还是直线,光线还是光线)
我们应该这么做:
1,将光线通过仿射变换的逆变换得到“逆变换光线”;
2,用“逆变换光线”去撞击球面,得到球面上的撞击点p和法向量n;
3,通过球面上的撞击点p计算椭球面上对应撞击点p’;
4,通过球面上的法向量n计算椭球面上对应的法向量n’;
(接下来,只是简单地列出相关的结论。至于“推导过程”,参考《Ray Tracing from the Ground Up. 2007》和《Fundamentals ofComputer Graphics. 3rd. 2009》的相关章节)
77.1.1将光线通过仿射变换的逆变换得到“逆变换光线”
要对光线进行仿射变换的逆变换,则需要对光线的起点和方向向量分别进行仿射变换的逆变换。
设:原光线的起点为o,方向向量为d;“逆变换光线”的起点为o’,方向向量为d’。
分别对光线的起点和方向向量进行仿射变换的逆变换:
o’ = T-1o “式子1”
d’ = T-1d “式子2”
这里需要重点说明的是:点的仿射变换是考虑仿射变换(Translation)的,而向量的仿射变换是不考虑平移的(即齐次坐标的最后一维为0)。
77.1.2用“逆变换光线”去撞击球面,得到球面上的撞击点p和法向量n
最近的撞击点对应着“离‘逆变换光线’起点最短距离t”。
通过撞击点p很容求得球面上撞击点p处的法向量n。
77.1.3通过球面上的撞击点p计算椭球面上对应撞击点p’
球面上撞击点p到“逆变换光线”起点的最短距离为t;
椭球面上撞击点p’到原光线起点的最短距离为t0。
则有t0=t。
所以,可以直接将t代入原光线的方程得到椭球面上的撞击点p’。
77.1.4通过球面上的法向量n计算椭球面上对应的法向量n’
设:球面上撞击点p处的法向量为n,椭球面上对应撞击点p’处的法向量为n’。
则有:
n’=(T-1)Tn “式子3”
其中(T-1)T表示仿射变换的逆变换矩阵的转置。
推导过程,参考:《Fundamentals of Computer Graphics. 3rd. 2009》的第六章。
作业的一个结果:
使用的文本为
PerspectiveCamera {
center 13 11 30
direction -.16 -.12 -.5
up 0 1 0
angle 30
}
Lights {
numLights 1
DirectionalLight {
direction -0.2 -0.4 -0.8
color 0.8 0.8 0.8
}
}
Background {
color 0 0 0
ambientLight 0.2 0.2 0.2
}
Materials {
numMaterials 4
Material { diffuseColor 1 0 0 }
Material { diffuseColor 0 1 0 }
Material { diffuseColor 0 0 1 }
Material { diffuseColor 1 1 1 }
}
Group {
numObjects 2
Group {
numObjects 3
MaterialIndex 0
Transform {
Translate 5 0 0
Scale 5 0.2 0.2
TriangleMesh {
obj_file cube.obj
}
}
MaterialIndex 1
Transform {
Translate 0 5 0
Scale 0.2 5 0.2
TriangleMesh {
obj_file cube.obj
}
}
MaterialIndex 2
Transform {
Translate 0 0 5
Scale 0.2 0.2 5
TriangleMesh {
obj_file cube.obj
}
}
}
MaterialIndex 3
Transform {
Translate 4 3 1
XRotate 10
YRotate 20
ZRotate 30
Scale 2 0.5 3
TriangleMesh {
obj_file cube.obj
}
}
}