Я только что сделал простую модель парусной лодки, которая состоит из четырехугольников.Это позволяет нам использовать функцию surf
, чтобы нарисовать ее тоже.Это должно послужить отправной точкой, чтобы увидеть, как вы могли бы сделать это.Но имейте в виду, что это, вероятно, не лучший способ сделать это.Как уже упоминалось в комментарии, MATLAB на самом деле не самое лучшее программное обеспечение для этого, Blender, вероятно, гораздо лучший вариант, но все же мы можем сделать хороший маленький корабль.
Первым шагом является создание фиксированной модели влокальная система координат.NaN
просто предназначены для разделения различных компонентов корабля, потому что в противном случае у нас были бы дополнительные квадроциклы, соединяющие, например, корпус с парусами, которые выглядели бы неуместно.(Если неясно, просто замените их произвольными координатами, чтобы увидеть, что происходит.)
Затем, чтобы придать ему некоторое движение, мы должны включить временную составляющую.Я просто добавил небольшое колебательное движение в плоскости yz, а также небольшое подпрыгивание в направлении z, чтобы придать ему вид корабля, движущегося сквозь волны.Я удостоверился, что использовал ту же частоту w/2
, что вы уже использовали для волн.Это важно, чтобы лодка пришла в движение с волнами.
clc; clear all ;
x_l = -20;
x_r = 20;
y_l = -20;
y_r = 20;
ds = 0.5;
A = 1;
k = 1;
dt = 0.05;
w = 1;
x = [x_l:ds:x_r];
y = [y_l:ds:y_r];
[X,Y] = meshgrid(x,y);
%sailboat
U = 0.7*[0,-1,-1,1,1,0;...%hull
0,0,0,0,0,0; NaN(1,6);...
0,0,NaN,0,0,NaN; %sails
0,-1,NaN,0,0,NaN];
V = 0.7*[3,1,-3,-3,1,3;%hull
1,1,-2,-2,1,1; NaN(1,6);...
3,0,NaN,0,-3,NaN; %sails
3,-1,NaN,0,-3,NaN];
W = 0.7*[1,1,1,1,1,1;%hull
0,0,0,0,0,0; NaN(1,6);...
2,6,NaN,7,2,NaN; %sails
2,2,NaN,2,2,NaN];
H = ones(2,6);
S = ones(3,3);
C = cat(3,[H*0.4;S*1,S*1],[H*0.2;S*0.6,S*0],[H*0;S*0.8,S*0]);
for i = 1:100
clf;
hold on;
Z = A*sin(k*Y+(w*i/2));
CO(:,:,1) = 0.3*ones((y_r-y_l)/ds + 1) + 0.3*cos(k*Y+(w*i/2));
CO(:,:,2) = 0.3*ones((y_r-y_l)/ds + 1) + 0.3*cos(k*Y+(w*i/2));
CO(:,:,3) = 0.7*ones((y_r-y_l)/ds + 1) + 0.3*cos(k*Y+(w*i/2));
surf(X,Y,Z,CO);
xlabel('x'); ylabel('y');
% rocking the boat
angle = 0.5*cos(w*i/2); %control rocking
Vs = V*cos(angle) - W*sin(angle);
Ws = V*sin(angle) + W*cos(angle) + 0.4 + 0.8*cos(w*(i - 0.5 * 2*pi)/2);%control amplitude
surf(U,Vs,Ws,C);
camproj('perspective');
xlim([x_l x_r]);
ylim([y_l y_r]);
zlim([y_l y_r]);
Zc = sqrt(X.^2+Y.^2);
%surf(X,Y,Zc);
%view([-100,20])
az = interp1([1,100],[-30, -120],i);
el = interp1([1,100],[1,30],i);
view([az,el]);
axis([-20,20,-20,20,-20,20]*0.5);
shading interp;
hold off;
drawnow;
pause(dt);
end
РЕДАКТИРОВАТЬ: ключ ксоздание этих «моделей» знает, как работает surf
. Для некоторых матриц X,Y,Z
каждая подматрица 2x2 этих матриц определяет вершины четырехугольника.Таким образом, идея состоит в том, чтобы разложить наши модели на четырехугольники (и добавить NaN
в эту матрицу, где мы не хотим каких-либо четырехугольников между ними).Проверьте следующий фрагмент, который показывает только корпус и четырехугольники.Отображаемые числа показывают индекс координат соответствующих точек в матрицах координат U,V,W
.Я добавил небольшое число e
, которое раздвигает швы, чтобы вы могли видеть четырехугольники.Установите значение 0
, чтобы увидеть исходную форму:
e = 0.2; %small shift to visualize seams
%sailboat
U = 0.7*[0-e,-1-e,-1-e,1+e,1+e,0+e;...%hull
0-e,0-e,0-e,0+e,0+e,0+e];
V = 0.7*[3+e,1,-3,-3,1,3+e;%hull
1+e,1,-2,-2,1,1+e];
W = 0.7*[1,1,1,1,1,1;%hull
0,0,0,0,0,0];
surf(U,V,W);
axis equal
view([161,30])
hold on
for i=1:2
for j=1:6
text(U(i,j),V(i,j),W(i,j),[num2str(i),',',num2str(j)]); %plot indices of points
end
end
xlabel('U')
ylabel('V')
zlabel('W')
title('i,j refers to the point with coordinates (U(i,j),V(i,j),W(i,j))')
hold off