2D-изображение в 3D-графике через поверхность, перпендикулярную углу обзора - PullRequest
0 голосов
/ 03 мая 2019

, поэтому я хочу включить двухмерную фигуру в трехмерный график и повернуть фигуру (с видом ([альфа-бета])). Как вы можете себе представить, это исказит поверхность сюжета. В общем, я пытаюсь выяснить, как настроить график поверхности так, чтобы он был перпендикулярен к углу обзора (чтобы увидеть рисунок таким, каким он должен быть) и по-прежнему центрироваться в исходном местоположении. Я нашел что-то вроде

img = imread('galileo3.png');     % Load a sample image
xImage = [...]   % The x data for the image corners
yImage = [...]             % The y data for the image corners
zImage = [...]   % The z data for the image corners
surf(xImage,yImage,zImage,...    % Plot the surface
     'CData',img,...
     'FaceColor','texturemap');
view([phi theta]);

Но в чем смысл углов изображения? И как бы я откорректировал исходные координаты, чтобы повернуть поверхность к углу обзора (но все еще центрировать в исходном местоположении)?

1 Ответ

0 голосов
/ 09 мая 2019

Вы можете использовать команду viewmtx для определения правильной матрицы преобразования. Чтобы это работало, вы берете все свои значения X, Y и Z и переформируете их в одну строку. Если ваши исходные данные не имеют значений Z, установите их на ноль.

Вы должны изменить свои преобразованные координаты обратно к их предыдущим формам, чтобы использовать их в командах «прибоя» и т. Д.

Матрица преобразования - это просто функция представления, поэтому вы можете применить одно и то же преобразование к нескольким наборам данных, просто создав новую переменную XYZ1 и снова умножив ее. Это также удобно, если вы хотите сделать анимацию, когда вы кружите вокруг сюжета. Вы можете просто повторно применить преобразование.

sizeX = size(X); % repeat for Y, Z;
X = reshape(X,1,numel(X)); % repeat for Y, Z;

XYZ1 = [X; Y; Z; ones(size(X))]; % it's important that you make this 4 rows

A = viewmtx(Azimuth, Elevation);
Transformed_XYZ = A * XYZ1; % you must left-multiply by A

X_Transformed = Transformed_XYZ(1,:); % rows 2 and 3 for Y and Z respectively
X_Transformed = reshape(X_transformed, sizeX); % putting X' into the same shape as X - repeat for Y and Z
...