• Remix
  • Share
  • New Entry

on 8 Nov 2023
  • 10
  • 115
  • 0
  • 2
  • 1580
drawframe(48);
Write your drawframe function below
function drawframe(f)
[B,E]=blob(f);
z = 0.015*sin(2*pi*f/48);
B.ZData = B.ZData+z;
E.ZData = E.ZData+z*1.3;
E.Visible= f<18 || f>20 && f<23 || f>25;
end
function [BB,EE]=blob(f)
persistent B
persistent E
if isempty(B)
% i valori di default.
def = [28 50 87 3 0 31 58 27 21]/100;
% -------------------------------------------------------------------
r1 = 0.28; % raggio sfera superiore (testa)
r2 = 0.5; % raggio sfera inferiore (pancia)
H = 0.85; % altezza del centro della testa
% decentramento del busto
cx = 0.03; % posizione del centro del busto (x)
cy = 0; % posizione del centro del busto (y)
r3 = 0.3; % raggio del busto
h3 = 0.58; % altezza del busto
s1 = 0.27; % filtro della pancia;
s2 = 0.11; % filtro della testa;
%----------------------------------------------------------------------
ang = 0:0.02:2*pi; % angolo phi 0-360
ang2 = (0:0.01:pi); % angolo psi 0-180
n = length(ang);
c = cos(ang);
s = sin(ang);
% disegno il busto
% subplot(1,2,1)
% plot3(c*r3+cx,s*r3+cy,ones(1,n)*h3,'-r');
hold on, axis equal,
set(gca,'XColor','w','YColor','w','ZColor','w','Color',[84 64 62]/100);
% coordinate sferiche generiche
p.x = sin(ang2).*cos(ang');
p.y = sin(ang2).*sin(ang');
p.z = cos(ang2).*ones(n,1);
% filtraggio
idx1 = p.z<s1; % sfera 1, prendo tutte le Z inferiori a s1
idx2 = p.z>s2; % sfera 2, prendo tutte le Z superiori a s2
% disegno testa e pancia
% plot3(p.x(idx2)*r1,p.y(idx2)*r1,p.z(idx2)*r1+H,'.');
% plot3(p.x(idx1)*r2,p.y(idx1)*r2,p.z(idx1)*r2 ,'.');
% il vettore di prova H (height, altezza) è il primo input
% il vettore ang (phi) è il secondo per una interpolazione 2D.
h = [p.z(1,idx2(1,:))*r1+H h3 p.z(1,idx1(1,:))*r2];
% il vettore va riordinato
[h,ord] = sort(h);
[hm, hM] = bounds(h);
% si farà una interpolazione per le ascisse, e una per le ordinate.
x = [p.x(:,all(idx2))*r1 c'*r3+cx p.x(:,all(idx1))*r2];
y = [p.y(:,all(idx2))*r1 s'*r3+cy p.y(:,all(idx1))*r2];
x = x(:,ord);
y = y(:,ord);
N = 300; % ridefinisco il Blob per 200 diversi valori di altezza
Znew = linspace(hm,hM,N);
metodo = "makima";
% ecco le coordinate del Blob
Xnew = interp2(h,ang,x,repmat(Znew,size(x,1),1),repmat(ang',1,N),metodo);
Ynew = interp2(h,ang,y,repmat(Znew,size(x,1),1),repmat(ang',1,N),metodo);
B = surf(Xnew,Ynew,f/10+repmat(Znew,size(x,1),1),'EdgeColor',"interp"); hold on
axis equal, grid off
% Cambiagli la texture!!!! :)
ax = gca;
set(gcf,'Color',ax.Color);
ax.XColor = 'none'; ax.YColor = 'none'; ax.ZColor = 'none';
ax.XLim = [-1 1]*1.5;
ax.YLim = [-1 1]*1.5;
ax.ZLim = [-.5 1.5];
view([59.21 25.09])
% GLI OCCHI
Heye=84; % altezza degli occhi (%)
big=18; % marker-Size degli occhi.
fov=42; % separazione degli occhi (deg)
Heye = Heye/100*(hM-hm)+hm;
asse = atan2d(cy,cx);
angoli = (asse+fov/2.*[-1 1])/180*pi;
% l'interpolazione funziona se gli occhi stanno tra 0° e 360°
angoli = mod(angoli,2*pi);
Xeye = interp2(h,ang,x,Heye*[1 1],angoli,metodo)*1.05;
Yeye = interp2(h,ang,y,Heye*[1 1],angoli,metodo)*1.05;
% subplot(1,2,2)
E = plot3(Xeye+0.05,Yeye+0.05,Heye*[1 1],'.','Color','k','MarkerSize',10);
colormap("pink")
end
BB=B; EE=E;
end
Animation
Remix Tree