function FireWorks3D
% @author : slandarer
ax=gca;hold on;grid on;view(-55,12)
ax.XLim=[0,20];
ax.YLim=[0,20];
ax.ZLim=[0,20];
ax.DataAspectRatio=[1,1,1];
ax.Projection='perspective';
ax.LooseInset=[0,0,0,0];
ax.Color=[0,0,0];
ax.Position=[-1/6,-1/6,1+1/3,1+1/3];
ax.XColor='none';
ax.YColor='none';
ax.ZColor='none';
fig=gcf;
fig.Position(1:2)=fig.Position(1:2)/5;
fig.Position(3:4)=fig.Position(3:4).*2;
fig.Color=[0,0,0];
[X,Y]=meshgrid(linspace(0,20,25));
scatter3(X(:),Y(:),X(:).*0+rand(length(X(:)),1)./10,5,'white','filled','MarkerEdgeColor','none','MarkerFaceAlpha',.6)
% 基础数据
baseNum=100;
interpNum=15;
fwSound=load('splat.mat');
while true
randFW(baseNum,interpNum,rand(3,3)./2+.5,randi(3))
delete(findobj('type','patch'))
ax.View(1)=ax.View(1)+1;
pause(.5)
ax.View(1)=ax.View(1)+1;
end
function randFW(num1,num2,C,N)
randC=rand(N,3).*[16,16,10]+[2,2,8];
% 绘制升空过程
scHdl=scatter3(randC(:,1),randC(:,2),randC(:,3).*0,25,'filled','CData',C(1:N,:));
sound(fwSound.y(1:7200),fwSound.Fs/1.2)
for k=0:.02:1
ax.View(1)=ax.View(1)+.5;
pause(.02)
scHdl.ZData=randC(:,3).*k;
drawnow;
end
delete(scHdl)
% 随机生成数据并绘制渐变烟花
randXSet=zeros(num2,num1,N);
randYSet=zeros(num2,num1,N);
randZSet=zeros(num2,num1,N);
for n=1:N
randTheta=rand(1,num1).*2.*pi;
randPhi=rand(1,num1).*pi;
randR=rand(1,num1).*3+2;
randX=cos(randTheta).*sin(randPhi).*randR;
randY=sin(randTheta).*sin(randPhi).*randR;
randZ=cos(randPhi).*randR;
randX=randX.*linspace(0,1,num2)';
randY=randY.*linspace(0,1,num2)';
randZ=randZ.*linspace(0,1,num2)';
randX(end,:)=nan;
randY(end,:)=nan;
randZ(end,:)=nan;
randXSet(:,:,n)=randX;
randYSet(:,:,n)=randY;
randZSet(:,:,n)=randZ;
end
for n=1:N
ax.View(1)=ax.View(1)+1;
for i=1:num1
fwHdl(n,i)=fill3(randXSet(:,i,n)+randC(n,1),randYSet(:,i,n)+randC(n,2),...
randZSet(:,i,n)+randC(n,3),linspace(0,1,num2),'EdgeColor','interp',...
'LineWidth',2,'EdgeAlpha',.5,'FaceVertexCData',C(n,:).*linspace(0,1,num2)');
end
end
sound(fwSound.y(7201:10001),fwSound.Fs)
% 烟花绽放过程
for k=.1:.05:1
ax.View(1)=ax.View(1)+1;
for n=1:N
for i=1:num1
fwHdl(n,i).XData=randXSet(:,i,n).*k+randC(n,1);
fwHdl(n,i).YData=randYSet(:,i,n).*k+randC(n,2);
R2=(randXSet(:,i,n).*k).^2+(randYSet(:,i,n).*k).^2+(randZSet(:,i,n).*k).^2;
fwHdl(n,i).ZData=randZSet(:,i,n).*k+randC(n,3)-R2./20;
end
end
pause(.001)
drawnow;
end
end
end
参考文献:https://zhuanlan.zhihu.com/p/595718636
开发工具:MATLAB 2022b
gifcam