I хотел бы реализовать эффект пролета, как показано в этот хороший пример. Сначала я создал фигуру из матрицы hm, матрицы 300X300, используя функцию surf:
surf(hm);
Затем я определил анимированную строку из переменных x, y и z и отобразил на рисунке следующим образом:
curve = animatedline;
curve.LineWidth = 6;
curve.Color = [ 1 0 1];
for i = 1:length(x)
addpoints(curve, x(i), y(i), z(i));
drawnow;
end
Затем я хотел реализовать эффект пролета, чтобы камера двигалась вдоль линии. Я попробовал этот фрагмент кода, взятый из приведенного выше примера, и немного изменил его:
for i = 1:length(x)
campos([(x(i) -5), (y(i)-5), 0]);
camtarget([x(i), y(i), z(i)]);
drawnow;
end
Но камера движется не так, как я планировал. Что я делаю неправильно?





Если вы хотите имитировать поведение связанного примера, вам необходимо, чтобы положение камеры а также цели камеры перемещалось вдоль вашей кривой, определенной (x, y, z). Как вы написали выше, цель камеры движется по кривой, но положение камеры всегда смещено от цели на (-5, -5) в плоскости xy и сидит на z = 0. Если вы хотите, чтобы камера двигалась по кривой позади цели, попробуйте что-то вроде этого:
for iPoint = 6:numel(x)
campos([x(iPoint-5) y(iPoint-5) z(iPoint-5)]); % Note the index is shifted, not the value
camtarget([x(iPoint) y(iPoint) z(iPoint)]);
drawnow;
end
Если вы не хотите, чтобы камера двигалась по одной и той же кривой, а вместо этого хотите, чтобы она всегда находилась с фиксированным смещением от движущейся цели камеры, вы можете попробовать следующее:
offset = [-5 -5 0]; % X, Y, and Z offset from target
for iPoint = 1:numel(x)
campos([x(iPoint)+offset(1) y(iPoint)+offset(2) z(iPoint)+offset(3)]);
camtarget([x(iPoint) y(iPoint) z(iPoint)]);
drawnow;
end
Наконец, если вы хотите контролировать скорость анимации, вы можете заменить команду drawnow вызовом pause. Обратите внимание, что звонок в pause эквивалентен звонку в drawnow вызывает обновление графических объектов. Вы также можете анимировать графику с помощью объект таймера, как я проиллюстрировал в этом ответе.
Я отредактировал свой вопрос и добавил фигуру с анимированной линией, чтобы пояснить свое намерение. Я пытаюсь заставить камеру следовать за линией, но немного позади нее. Было бы здорово, если бы я мог изменять скорость, чтобы он двигался медленно. Спасибо за вашу помощь!
@Newprogrammer: Все еще немного неясно, какое именно движение камеры вы хотите, но я добавил к своему ответу еще один вариант, а также то, как вы можете контролировать скорость.
Я попробовал ваше предложение, но камера все еще движется не так, как я планировал.