Имитация плавания корабля в воде волны в Matlab - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть проект, в котором я должен имитировать корабль, плывущий по водной волне.Я решил сделать это с помощью 3D-графика поверхности.Я создал волны воды, но у меня проблемы с созданием корабля, который должен сидеть прямо в центре участка.Ниже приведен мой код симуляции водной волны:

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);
for i = 1:100
    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);
    hold on;
    shading interp;
    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);
    shading interp;
    hold off;
    drawnow;
    pause(dt);
end

Пожалуйста, направьте меня в правильном направлении, если я делаю это неправильно.

1 Ответ

0 голосов
/ 24 февраля 2019

Я только что сделал простую модель парусной лодки, которая состоит из четырехугольников.Это позволяет нам использовать функцию surf, чтобы нарисовать ее тоже.Это должно послужить отправной точкой, чтобы увидеть, как вы могли бы сделать это.Но имейте в виду, что это, вероятно, не лучший способ сделать это.Как уже упоминалось в комментарии, MATLAB на самом деле не самое лучшее программное обеспечение для этого, Blender, вероятно, гораздо лучший вариант, но все же мы можем сделать хороший маленький корабль.

Первым шагом является создание фиксированной модели влокальная система координат.NaN просто предназначены для разделения различных компонентов корабля, потому что в противном случае у нас были бы дополнительные квадроциклы, соединяющие, например, корпус с парусами, которые выглядели бы неуместно.(Если неясно, просто замените их произвольными координатами, чтобы увидеть, что происходит.)

Затем, чтобы придать ему некоторое движение, мы должны включить временную составляющую.Я просто добавил небольшое колебательное движение в плоскости yz, а также небольшое подпрыгивание в направлении z, чтобы придать ему вид корабля, движущегося сквозь волны.Я удостоверился, что использовал ту же частоту w/2, что вы уже использовали для волн.Это важно, чтобы лодка пришла в движение с волнами.

row, row, row your boat...

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

hull construction

...