Main Content

장면을 관통하여 카메라 이동하기

기법 요약

비행 시점은 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';

보기 설정하기

장면이 올바로 표시되도록 하려면 보기 조작 파라미터를 정의해야 합니다.

  • 원근 투영을 선택하면 카메라가 등가곡면의 내부를 통과할 때 깊이를 인식할 수 있습니다(camproj).

  • 카메라 시야각을 고정 값으로 설정하면 MATLAB이 전체 장면을 담도록 각도를 자동으로 조정하지 못할 뿐 아니라, 원하는 정도만큼 확대하지도 못하게 됩니다(camva).

    camproj perspective
    camva(25)
    

광원 지정하기

광원을 카메라 위치에 배치하고 등가곡면과 원뿔의 반사율 특성을 수정하면 장면의 사실성이 향상됩니다.

  • 카메라 위치에 광원을 생성하면 등가곡면 내부를 카메라와 함께 누비는 전조등이 생긴 것과 같은 효과를 얻을 수 있습니다(camlight).

  • 등가곡면의 반사 속성을 설정하면 반사율이 높은 재료(SpecularStrengthDiffuseStrength를 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을 참조하십시오.