지난 번까지는 지구 부근 궤도를 따라 움직이는 비행기를 화면에 띄우는 것까지 해보았다. 이번에는 이 비행기의 자세를 바꿔줄 것이다. 자세를 나타내는 방법과 다루는 방법에는 여러가지가 있다. 자세히 공부한 것은 다음에 따로 기록해두도록 하겠다.
1. Rate 이용하기
2. Quaternion 이용하기
Quaternion 은 Euler 회전을 활용하면 계산하는 과정에서 theta = 90 degree 일 때, sec(theta) = infinity 가 되는 문제가 발생하기 때문에 Euler 의 대안으로 다양한 분야에서 활용하는 회전 변환이다.
주로 작업한 부분은 ECI 기준의 인공위성 Body frame 의 Quaternion 이 주어졌을 때, 이를 Cesium 의 entity orientation 에 적용하여 인공위성의 자세를 잡아주는 것이다. Cesium 의 orientation 은 ECEF 를 기반으로 하기 때문에 ECI 기준 Quaternion 을 ECEF 기준 Quaternion 으로 변환하는 것이 필요하다.
내가 생각한 아이디어는 ECEF -> ECI Quaternion 을 알아내어, ECI -> Body frame Quaternion 과 multiply 해주는 것이다. 이렇게 Quaternion 곱을 해주게 되면, ECEF -> Body frame 하나의 Quaternion 이 생성된다.
const EarthAngRadian = 7.27221e-5; //지구의 자전 각속도 (radian)
const hrtosec = 86400; //24시간을 sec로 변환
const Radiandiff = ((hrtosec*i)/positionData.length)*(EarthAngRadian); //데이터 개수만큼 for 문을 돌면서 시간에 따른 각도 변화를 계산
const RotatMrx_Z = new Cesium.Matrix3.fromRotationZ(Radiandiff); //-Z축 기준 회전
const RotatMrx = new Cesium.Matrix3.transpose(RotatMrx_Z, new Cesium.Matrix3()); //Transpose
const ECFtoECIQuaternion = Cesium.Quaternion.fromRotationMatrix(RotatMrx); //ECEF 에서 ECI 로의 Quaternion
const orientationECEF = new Cesium.Quaternion(); //아래 값을 저장하기 위해 만든 변수
Cesium.Quaternion.multiply(ECFtoECIQuaternion, Satellite_Qtn, orientationECEF); //Quaternion 의 곱
우선, Cesium 이 제공하는 Z 축 회전 행렬은 -Z 축을 기준으로 하는 회전 행렬이기 때문에 +Z축 회전 행렬을 구해야하는 나는 이를 Transpose 해주었다. 위의 식에서 언급한 for문은 주어진 position이나 Quaternion에 관한 데이터를 하나씩 읽어들인다.
const attitudeProperty = new Cesium.SampledProperty(Cesium.Quaternion);
회전 변환을 해준 Quaternion은 entity에 넣어주어야하기 때문에 for문 밖에서 Cesium의 SampledProperty 함수에 Quaternion 형태로 넣어주고 이를 attitudeProperty라고 하자.
attitudeProperty.addSample(time, orientationECEF);
그 후에 for문 안에서 attitudeProperty를 불러와 addSample로 시간에 따른 Quaternion 을 넣어준다.
const SatelliteUri = await Cesium.IonResource.fromAssetId(모델id넣어주기);
const SatelliteEntity = viewer.entities.add({
orientation: attitudeProperty,
});
다양한 member 들이 있겠지만, orientation을 기준으로 하면 위와 같은 식에 attitudeProperty를 지정해줌으로써 원하는 위치, 원하는 시간에서의 자세를 설정할 수 있게 되었다.
'Cesium JS' 카테고리의 다른 글
Cesium JS 활용하기 (0) | 2023.01.07 |
---|---|
Cesium JS 개발 환경 구축 (2) | 2022.12.29 |