주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

Virtual Reality Animation 객체를 통해 항공기 이륙을 시각화하세요

이 예제에서는 virtual reality animation 객체를 사용하여 항공기의 이륙과 헬리콥터 추격을 시각화하는 방법을 보여줍니다. 이 예에서는 Aero.VirtualRealityAnimation 객체를 사용하여 asttkoff.wrl 파일을 기반으로 가상 현실 애니메이션을 설정할 수 있습니다. 이 장면은 항공기 이륙을 시뮬레이션합니다. 이 예제에서는 시뮬레이션에 추격 비행체를 추가하고 새 비행체와 관련된 추격 시점을 추가합니다.

참고: 이 예제는 MATLAB Online에서는 지원되지 않습니다.

Animation 객체 생성

이 코드는 Aero.VirtualRealityAnimation 객체의 인스턴스를 생성합니다.

h = Aero.VirtualRealityAnimation;

animation 객체 속성 설정

이 코드는 초당 프레임 수와 초당 애니메이션 데이터의 초 단위 시간 스케일링을 설정합니다. 'FramesPerSecond'는 Figure 창에 프레임이 표시되는 속도를 제어합니다. 'TimeScaling'는 초당 애니메이션 데이터의 초 단위 시간 스케일링입니다.

'TimeScaling''FramesPerSecond' 속성은 시뮬레이션의 시간 단계를 결정합니다. 이 예제의 설정에 따르면 시간 단계는 약 0.5초가 됩니다. 방정식은 다음과 같습니다.

(1/초당 프레임 수)*시간 스케일링 + 초 단위 정밀도를 처리하기 위한 추가 항목.

h.FramesPerSecond = 10;
h.TimeScaling = 5;

이 코드는 가상 현실 애니메이션에 사용할 .wrl 파일을 설정합니다.

h.VRWorldFilename = "asttkoff.wrl";

Virtual Reality Animation 객체 초기화

initialize 메서드는 animation 객체의 'VRWorldFilename' 필드에 설명된 애니메이션 세계를 로드합니다. 세계를 구문 분석할 때, DEF 이름을 가진 기존 노드에 대한 노드 객체가 생성됩니다. initialize 메서드는 Simulink 3D Animation 뷰어도 엽니다.

h.initialize();

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

추가 노드 정보 설정

이 코드는 시뮬레이션 시계열 데이터를 설정합니다. takeoffData.mat에는 로깅된 시뮬레이션 데이터가 포함됩니다. takeoffData는 기본 데이터 형식 중 하나인 'StructureWithTime'로 설정됩니다.

load takeoffData
[~, idxPlane] = find(strcmp('Plane', h.nodeInfo));
h.Nodes{idxPlane}.TimeseriesSource = takeoffData;
h.Nodes{idxPlane}.TimeseriesSourceType = 'StructureWithTime';

좌표 변환 함수 설정

virtual reality animation 객체에는 항공우주 동체 좌표에서의 위치와 회전이 필요합니다. 입력 데이터가 다르면 가상 세계의 주변 객체에 위치 및 회전 데이터를 올바르게 정렬하기 위해 좌표 변환 함수를 만들어야 합니다. 이 코드는 가상현실 애니메이션에 대한 좌표 변환 함수를 설정합니다.

이 특정한 경우, 입력 변환 좌표가 [x1,y1,z1]인 경우 다음과 같이 조정해야 합니다. [X,Y,Z] = -[y1,x1,z1].

사용자 정의 변환 함수는 vranimCustomTransform.m 파일에서 볼 수 있습니다.

h.Nodes{idxPlane}.CoordTransformFcn = @vranimCustomTransform;

체이스 헬리콥터 추가

이 코드는 animation 객체에 추격 헬리콥터를 추가하는 방법을 보여줍니다.

nodeInfo 메서드를 사용하면 현재 virtual reality animation 객체에 있는 모든 노드를 볼 수 있습니다. 출력 인수 없이 호출하면 이 메서드는 노드 정보를 명령 창에 출력합니다. 출력 인수를 사용하면 메서드는 노드 정보를 해당 인수로 설정합니다.

h.nodeInfo;
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1

이 코드는 가상 현실 Figure의 카메라 각도를 움직여 항공기를 봅니다.

set(h.VRFigure,'CameraDirection',[0.45 0 -1]);

addNode 메서드를 사용하여 객체에 다른 노드를 추가합니다. 기본적으로 노드나 경로를 추가하거나 제거할 때마다, 또는 saveas 메서드를 호출할 때마다 Aerospace Toolbox는 현재 .wrl 파일 위치에 대한 메시지를 표시합니다. 이 메시지를 비활성화하려면 VirtualRealityAnimation 객체에서 'ShowSaveWarning' 속성을 설정합니다.

h.ShowSaveWarning = 0;
h.addNode('Lynx',fullfile(pwd,"chaseHelicopter.wrl"));

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

nodeInfo에 대한 또 다른 호출은 새로 추가된 Node 객체를 보여줍니다.

h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline

새로 추가된 헬리콥터를 활주로에 놓이도록 조정합니다.

[~, idxLynx] = find(strcmp('Lynx',h.nodeInfo));
h.Nodes{idxLynx}.VRNode.translation = [0 1.5 0];

이 코드는 추격 헬리콥터에 대한 데이터 속성을 설정합니다. 'TimeseriesSourceType'는 기본 'Array6DoF'이므로 추가 속성 변경이 필요하지 않습니다. 이 노드에는 이전 노드와 동일한 좌표 변환 함수(vranimCustomTransform)가 사용됩니다. nodeInfo에 대한 이전 호출은 노드 인덱스(2)를 반환했습니다.

load chaseData
h.Nodes{idxLynx}.TimeseriesSource = chaseData;
h.Nodes{idxLynx}.CoordTransformFcn = @vranimCustomTransform;

새로운 시점 만들기

이 코드는 addViewpoint 메서드를 사용하여 'chaseView'라는 새로운 시점을 만듭니다. 새로운 시점은 가상 현실 창의 시점 풀다운 메뉴에 "헬리콥터에서 보기"로 나타납니다. nodeInfo에 대한 또 다른 호출은 새로 추가된 node 객체를 보여줍니다. 해당 노드는 체이스 헬리콥터의 자식으로 생성됩니다.

h.addViewpoint(h.Nodes{idxLynx}.VRNode,'children','chaseView','View From Helicopter');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

애니메이션 재생

play 메서드는 지정된 시계열 데이터에 대한 시뮬레이션을 실행합니다.

h.play();

기다리기

객체를 수정하기 전에 애니메이션 재생이 멈출 때까지 기다리세요.

h.wait();

헬리콥터에서 애니메이션 재생

이 코드는 시점의 노드 객체와 연관된 vrnode 객체를 통해 시점의 방향을 설정합니다. 이 경우, 헬리콥터의 왼쪽에서 비행기를 바라보는 시점이 변경됩니다.

[~, idxChaseView] = find(strcmp('chaseView',h.nodeInfo));
h.Nodes{idxChaseView}.VRNode.orientation = [0 1 0 convang(200,'deg','rad')];  
set(h.VRFigure,'Viewpoint','View From Helicopter');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

경로 추가

이 코드는 addRoute 메서드를 호출하여 ROUTE 명령을 추가하여 비행기 위치를 Camera1 노드에 연결합니다. 이를 통해 "비행기 탑승" 시점이 의도한 대로 작동할 수 있습니다.

h.addRoute('Plane','translation','Camera1','translation');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

이 코드는 애니메이션을 재생합니다.

h.play();
h.wait();

다른 동체 추가

이 코드는 장면에 또 다른 헬리콥터를 추가합니다. 또한 장면에 있는 세 개의 동체를 동시에 볼 수 있도록 다른 시점으로 변경됩니다.

set(h.VRFigure,'Viewpoint','See Whole Trajectory');
h.addNode('Lynx1',"chaseHelicopter.wrl");

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline
11	chaseView
12	Lynx1
13	Lynx1_Inline

새로 추가된 헬리콥터를 활주로 위에 놓이도록 조정합니다.

[~, idxLynx1] = find(strcmp('Lynx1',h.nodeInfo));
h.Nodes{idxLynx1}.VRNode.translation = [0 1.3 0];

동체 제거

이 코드는 removeNode 메서드를 사용하여 두 번째 헬리콥터를 제거합니다. removeNode는 노드 이름이나 노드 인덱스(nodeInfo에서 가져옴)를 사용합니다. 연관된 인라인 노드도 제거됩니다.

h.removeNode('Lynx1');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline
11	chaseView

원래 세계로 돌아가기

원래 파일 이름은 animation 객체의 'VRWorldOldFilename' 속성에 저장됩니다. 원래 세계를 불러오려면 'VRWorldFilename'를 원래 이름으로 설정하고 다시 초기화합니다.

h.VRWorldFilename = h.VRWorldOldFilename{1};  
h.initialize();

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

세계 닫기 및 삭제

닫고 delete를 수행하려면

h.delete();

참고 항목

| |

도움말 항목