Пролет - это эффект, создаваемый перемещением камеры через трёхмерное пространство, создающий впечатление, что вы летите вместе с камерой как будто в самолёте. Можно выполнять полеты по областям сцены, которые в противном случае могут быть скрыты объектами в сцене, или можно выполнять полеты по сцене, оставляя камеру сфокусированной на определенной точке.
Для выполнения этих эффектов камера перемещается по определенной траектории, например по оси X, последовательно. Чтобы выполнить пролет, одновременно переместите и положение камеры, и цель камеры.
В следующем примере используется эффект fly-through для просмотра внутренней части изоповерхности, нарисованной в объеме, определяемом векторным полем скоростей ветра. Эти данные отражают воздушные течения над Северной Америкой.
В этом примере используется ряд методов визуализации. Он использует
Графики изо-поверхностей и конуса для иллюстрации потока через объем
Освещение для освещения изоповерхности и конусов в объеме
Потоковые линии для определения пути камеры по объему
Координированное перемещение положения камеры, цели камеры и света
Первым шагом является рисование изоповерхности и построение графика воздушного потока с использованием конических графиков.
Посмотрите isosurface, isonormals, reducepatch, и coneplot для получения информации об использовании этих команд.
Установка пропорции данных (daspectКому [1,1,1] перед рисованием конусного графика позволяет программному обеспечению MATLAB ® правильно рассчитать размер конусов для конечного вида.
load wind wind_speed = sqrt(u.^2 + v.^2 + w.^2); figure p = patch(isosurface(x,y,z,wind_speed,35)); isonormals(x,y,z,wind_speed,p) p.FaceColor = [0.75,0.25,0.25]; p.EdgeColor = [0.6,0.4,0.4]; [f,vt] = reducepatch(isosurface(x,y,z,wind_speed,45),0.05); daspect([1,1,1]); hcone = coneplot(x,y,z,u,v,w,vt(:,1),vt(:,2),vt(:,3),2); hcone.FaceColor = 'blue'; hcone.EdgeColor = 'none';
Для правильного отображения сцены необходимо определить параметры просмотра:
Выбор перспективной проекции обеспечивает восприятие глубины при прохождении камеры через внутреннюю часть изоповерхности (camproj).
Установка фиксированного значения угла обзора камеры не позволяет MATLAB автоматически регулировать угол так, чтобы он охватывал всю сцену, а также изменять масштаб изображения в требуемом размере (camva).
camproj perspective
camva(25)
Позиционирование источника света в месте расположения камеры и изменение характеристик отражения изоповерхности и конусов повышает реалистичность сцены:
Создание источника света в положении камеры обеспечивает «фару», которая перемещается вместе с камерой через изоповерхностный интерьер (camlight).
Установка отражательных свойств изоповерхности дает вид темного интерьера (AmbientStrength установлено на 0,1) с высокоотражающим материалом (SpecularStrength и DiffuseStrength установите значение 1).
Установка SpecularStrength конусов к 1 делает их сильно отражающими.
hlight = camlight('headlight'); p.AmbientStrength = 1; p.SpecularStrength = 1; p.DiffuseStrength = 1; hcone.SpecularStrength = 1; set(gcf,'Color','k') set(gca,'Color',[0,0,0.25])
Использовать gouraud освещение для более плавного освещения:
lighting gouraud
Линии потока указывают направление потока в векторном поле. В этом примере используются данные координат x, y и z одной линии потока для отображения пути через том. Затем камера перемещается по этой траектории. Задачи включают:
Создание линии потока, начинающейся в точке x = 80, y = 30, z = 11.
Получение данных координат x, y и z линии потока.
Удалить линию потока (можно также использовать stream3 для вычисления данных линии потока без фактического построения линии потока).
hsline = streamline(x,y,z,u,v,w,80,30,11); xd = hsline.XData; yd = hsline.YData; zd = hsline.ZData; delete(hsline)
Для создания сквозного пролета переместите положение камеры и цель камеры на один и тот же путь. В этом примере цель камеры размещается на пять элементов дальше вдоль оси x, чем камера. Небольшое значение добавляется к положению цели камеры x для предотвращения того, чтобы положение камеры и цели не становилось одной и той же точкой, если условие xd(n) = xd(n+5) должны иметь место:
Обновите положение камеры и цель камеры таким образом, чтобы они двигались вдоль координат линии потока.
Переместите свет вместе с камерой.
Звонить drawnow для отображения результатов каждого перемещения.
for i=1:length(xd)-5 campos([xd(i),yd(i),zd(i)]) camtarget([xd(i+5)+min(xd)/500,yd(i),zd(i)]) camlight(hlight,'headlight') drawnow end
Посмотрите coneplot для фиксированной визуализации одних и тех же данных.