在光度立体中,光源位姿对于法向量求解具有重要意义。为了方便光源结构设计,通常会模拟测试光源位姿。一般用zenith(天顶角)、azimuth(方位角)来定义光源方向,或者分别用slant 和 tilt:
θ
l
:
一
般
称
为
天
顶
角
或
极
角
,
分
别
对
应
z
e
n
i
t
h
和
s
l
a
n
t
;
φ
l
:
一
般
称
为
方
位
角
或
偏
角
,
分
别
对
应
a
z
i
m
u
t
h
和
t
i
l
t
\theta_l:一般称为天顶角或极角,分别对应zenith和slant ; \\ \varphi_l:一般称为方位角或偏角,分别对应azimuth和tilt
θl:一般称为天顶角或极角,分别对应zenith和slant;φl:一般称为方位角或偏角,分别对应azimuth和tilt
不难得到光源方向L的表达式:
L
⃗
=
(
sin
θ
l
cos
φ
l
,
sin
θ
l
sin
φ
l
,
cos
θ
l
)
\vec{L}=\left(\sin \theta_{l} \cos \varphi_{l}, \sin \theta_{l} \sin \varphi_{l}, \cos \theta_{l}\right)
L=(sinθlcosφl,sinθlsinφl,cosθl)
假设模拟的光源共球面,一般设计穹顶式光源结构:
给定球半径,以及不同高度的圆环及其均匀分布的光源数量,即可通过上述光源方向表达式,绘制穹顶式光源结构图。
clc
close all
clear all
R = 100; % 球半径
heightLists = [20,40,60,80]; % 圆环高度
lightNums = [20,16,12,8]; % 对应圆环分布的光源个数 高度越低,圆半径越大,分布光源数量越多
lens = length(lightNums);
lightPoints = [];
mark = [];
index = 0;
bias = 3; % text标记位置偏差
for i = 1:lens
r = sqrt(R^2 - heightLists(i)^2);
slant = atan2(r,heightLists(i));
tiltStep = 2*pi / lightNums(i);
for j = 1:lightNums(i)
index = index + 1;
tilt = tiltStep * (j - 1);
x = r * cos(tilt) * sin(slant);
y = r * sin(tilt) * sin(slant);
lightPoints = [lightPoints;[x y heightLists(i)]];
mark = [mark;num2str(index,'%02d')];
end
end
figure
scatter3(lightPoints(:,1),lightPoints(:,2),lightPoints(:,3),100,lightPoints(:,3),"filled")
xlabel('X')
ylabel('Y')
zlabel('Z')
xlim([-100 100])
ylim([-100 100])
zlim([0 100])
text(lightPoints(:,1) + bias,lightPoints(:,2) + bias,lightPoints(:,3),mark,'color','r','FontSize',13) % z轴方向无偏差
h = colorbar;
set(get(h,'label'),'string','positions');%colorbar name
Reference: