matlab 根据高度、数量生成共球面的穹顶光源
在光度立体中,光源位姿对于法向量求解具有重要意义。为了方便光源结构设计,通常会模拟测试光源位姿。一般用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:
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)