Cesium JS를 활용한 운석 낙하 시뮬레이션
이번 시간에는 Cesium JS를 활용하여 운석 낙하 시 피해 반경을 시뮬레이션 하겠습니다.
운석 낙하는 전 세계에서 가끔 일어나는 자연현상 입니다. 과거 2013년 러시아 첼랴빈스크 지역에 운석이 낙하하여 1600여명이 부상당하고 원화 기준으로 약 350억 원의 피해가 발생 했습니다. 떨어진 운석의 크기는 직경17m, 무게 1만 톤으로 추정되었고 대기권 돌입시 추정 속도는 초속 32.5km이었습니다.
또한 2014년 03월 경상남도 진주시에 운석이 낙하 중 폭발하였고 그 조각들이 다음날로부터 발견된 사례가 있었습니다.
<러시아 첼랴빈스크 지역에 운석이 낙하 중인 모습과 발견된 운석의 일부 (출처-Google image검색)>
<경남 진주시에 운석 조각이 낙하중인 모습과 발견된 운석 조각 (출처-Google image검색)>
이러한 사례와 참고자료를 발판삼아 가상으로 운석이 낙하하여 충돌할 시 피해 반경을 가늠하여 보았습니다.
샘플 프로그램 제작 당시 여의도 지역을 운석 낙하 지점으로 설정했습니다. 막상 만들고 보니 저희 나라에 운석이 떨어지는 것이 별로 좋지 않더라구요. 그래서 일본의 모 지역으로 낙하 지점을 변경했습니다. 정확한 시뮬레이션도 아니고 그저 CesiumJS를 활용하는 한 가지 사례로써 어떤 의도가 존재하지도 않습니다.
먼저 결과화면 보겠습니다.
> 서비스바로가기
운석은 50m급, 100m급 두 등급으로 정했습니다. 각 등급에 근접한 피해 반경을 구하기 위해 여러가지 공식과 참고자료를 활용했습니다. 하지만 참고자료 또한 추정치여서 실제와는 차이가 있습니다.
우주환경 감시기관(한국천문연구원)에서 참고한 운석의 크기와 그에 따른 충돌에너지에 대한 자료입니다.
(출처 - 우주환경 감시기관)
운석 시작 높이는 지상 100km로 설정했습니다. 대부분의 유성 및 운석이 고도 80~100km 부분 열권에서 연소가 되며 연소되지못한 운석들이 지구로 추락합니다.
낙하속도 산출은 자유낙하 속도 공식을 활용했습니다. (v: 속도 / g: 중력가속도 / t: 시간 / s: 높이)
시뮬레이션
시뮬레이션은 총 3단계로 진행 됩니다.
단계1. 운석 시뮬레이션 버튼을 클릭하여 시뮬레이션 시작
단계2. 운석이 지면에 추락한 후 피해반경 표출
단계3. 피해반경 전체를 가시화
먼저 시뮬레이션 동작을 위한 버튼입니다. 50m, 100m급 시뮬레이션 버튼으로 시뮬레이션을 진행 할 수 있으며 RESET버튼으로 각 시뮬레이션을 마친 후 맵을 초기화 할 수있습니다. (하나의 시뮬레이션 진행 후 RESET기능을 통해 맵을 초기화 하세요.)
50m급 시뮬레이션 장면입니다. (50m급의 피해 반경은 약 11km 입니다.)
운석이 낙하 지점을 향해 추락하는 모습입니다.
운석이 낙하지점에 추락 후 피해반경이 표출 된 모습입니다. (50m급 운석)
운석 피해 반경 전체를 볼 수 있게 가시화 된 모습입니다. 100m급 시뮬레이션 장면입니다. (100m급의 피해 반경은 약 1.100km입니다.)
프로그램 소스
시작점과 도착점을 지정하여 운석이 움직일 수 있도록 하였습니다. 이번 시뮬레이션의 기초 및 핵심이 되는 부분입니다.
|
/*
pos1 - 출발점 지정
pos2 - 도착점 지정
*/
var pos1 = Cesium.Cartesian3.fromDegrees(126.508749, 37.369581, 100000.0);
var pos2 = Cesium.Cartesian3.fromDegrees(126.913620, 37.519296, 0.0);
var position = new Cesium.SampledPositionProperty();
position.addSample(start, pos1);
position.addSample(stop, pos2);
|
cs |
setTimeout 콜백함수를 활용하여 시간에따른 시뮬레이션을 진행하는 부분입니다.
|
// 운석이 도착점에 도달할 시 피해반경 표출
setTimeout(function(){
viewer.entities.add({
position : meteorPosition,
ellipse : {
semiMinorAxis : 11000.0,
semiMajorAxis : 11000.0,
material : Cesium.Color.RED.withAlpha(0.5)
}
});
},23000);
// 피해반경 가시화
setTimeout(function(){
if(particleSystem != null){
scene.primitives.remove(particleSystem);
};
var staticPosition = Cesium.Cartesian3.fromDegrees(139.743903, 35.694363, 60000);
var orientation = new Cesium.HeadingPitchRange(0,300,0);
viewer.scene.camera.setView({
destination : staticPosition,
orientation : orientation,
endTransform : Cesium.Matrix4.IDENTITY
});
},26000);
|
cs |
semiMinorAxis 와 semiMajorAxis는 지름을 지정하는 파라미터입니다. 단위는 m입니다.
마치며
본 시뮬레이션을 구현하는 작업은 흥미로웠습니다. 하지만 운석낙하에 대한 자료가 한참 부족하고 대부분 추정치만 존재하다보니 실제의 값에 근접한 값을 도출하는데 수 일의 노력을 기울였습니다.
하지만 프로그웍스와 독자분들을 위한 유령개구리의 노력은 멈추지 않을것입니다. 감사합니다~!
'꿀팁 - CesiumJS, nullschool' 카테고리의 다른 글
Cesium JS에서 Camera FlyTo 기능 활용하기 (1) | 2019.05.10 |
---|---|
Cesium js 와 Qgis를 활용한 3D 건물 구현하기 (0) | 2019.04.01 |
Cesium JS에서 MouseMove 이벤트를 통한 위,경도 표출 (0) | 2019.03.06 |
Cesium JS에서 gltf 포맷 활용 및 HeadingPitchRange 설정 (0) | 2019.02.26 |
Cesium JS 3D 객체에 마우스 이벤트 연동 (4) | 2019.02.19 |