장면을 관통하여 카메라 이동하기
기법 요약
비행 시점은 3차원 공간을 관통해 카메라를 움직임으로써 생성되는 효과로, 마치 비행기를 타고서 카메라로 촬영하며 보는 것 같은 인상을 줍니다. 기존 카메라 기법으로는 장면 내 객체로 인해 시야가 가려질 수도 있는 장면의 여러 영역도 비행 시점을 사용하면 관통해 지나갈 수도 있고 특정한 지점에 계속 초점을 맞춘 상태로 장면 옆으로 지나갈 수 있습니다.
이러한 효과를 얻으려면 일련의 단계를 통해 특정한 경로(예: x축)를 따라 카메라를 움직이십시오. 비행 시점 효과를 얻으려면 카메라 위치와 카메라 대상을 동시에 움직이십시오.
다음 예제에서는 풍속의 벡터장으로 정의되는 볼륨 내에 그려진 등가곡면의 내부를 비행 시점 효과를 사용하여 볼 것입니다. 이 데이터는 북미 지역의 기류를 나타낸 것입니다.
이 예제에서는 다음과 같은 여러 가지 시각화 기법을 사용합니다.
볼륨을 통과하는 흐름을 설명하는 등가곡면과 원뿔 플롯
볼륨 내 등가곡면과 원뿔을 비추는 조명
볼륨을 관통해 이동하는 카메라의 경로를 정의하는 흐름선
카메라 위치, 카메라 대상, 조명에 대한 조율된 움직임
볼륨 데이터 그리기
첫 번째 단계는 등가곡면을 그리고 원뿔 플롯을 사용하여 기류를 플로팅하는 것입니다.
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';
보기 설정하기
장면이 올바로 표시되도록 하려면 보기 조작 파라미터를 정의해야 합니다.
광원 지정하기
광원을 카메라 위치에 배치하고 등가곡면과 원뿔의 반사율 특성을 수정하면 장면의 사실성이 향상됩니다.
카메라 위치에 광원을 생성하면 등가곡면 내부를 카메라와 함께 누비는 전조등이 생긴 것과 같은 효과를 얻을 수 있습니다(
camlight
).등가곡면의 반사 속성을 설정하면 반사율이 높은 재료(
SpecularStrength
와DiffuseStrength
를 1로 설정함)로 이루어진 어두운 내부(AmbientStrength
를 0.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축상에서 카메라보다 5개 요소만큼 떨어져 배치됩니다. 조건 xd(n) = xd(n+5)
가 충족되는 경우, 카메라 위치와 카메라 대상이 같은 점이 되지 않도록 카메라 대상 x 위치에 작은 값이 추가됩니다.
카메라 위치와 카메라 대상이 둘 다 흐름선의 좌표를 따라 이동하도록 업데이트합니다.
카메라와 함께 조명을 움직입니다.
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
을 참조하십시오.