UE4 和 Cesium 的坐标系统转换
Constants useful for transformation between Cesium and Unreal Engine coordinate systems.
用于在Cesium和UE4虚幻引擎坐标系之间转换的常量。
CesiumTransforms
- 单位:UE4使用的是厘米;cesium使用的米。
- 坐标系:UE4使用左手系,+x (forward),+y (right),+z(up);cesium使用右手系,+x(forward),+y(left),+z(up)。
如下图所示,红色代表X轴,绿色代表Y轴,蓝色代表Z轴。
cesium 的坐标轴:
UE4的坐标轴:
//CesiumTransforms.h
class CESIUMRUNTIME_API CesiumTransforms {
public:
/**
* The constant to multiply to transform meters to centimeters (100.0).
*/
static const double metersToCentimeters;
/**
* The constant to multiply to transform centimeters to meters (0.01).
*/
static const double centimetersToMeters;
/**
* A matrix to scale Cesium's meters up to Unreal's centimeters.
*/
static const glm::dmat4x4 scaleToUnrealWorld;
/**
* A matrix to scale down Unreal's centimeters into Cesium's meters.
*/
static const glm::dmat4x4 scaleToCesium;
/**
* A matrix to transform Cesium's right-handed, Z-up coordinate system to
* Unreal's left-handed, Z-up coordinate system by inverting the Y coordinate.
* This same transformation can also go the other way.
*/
static const glm::dmat4x4 unrealToOrFromCesium;
};
// CesiumTransforms.cpp
#include "CesiumTransforms.h"
//厘米<->米
const double CesiumTransforms::metersToCentimeters = 100.0;
const double CesiumTransforms::centimetersToMeters = 0.01;
// Scale Cesium's meters up to Unreal's centimeters.
const glm::dmat4x4 CesiumTransforms::scaleToUnrealWorld =
glm::dmat4x4(glm::dmat3x3(metersToCentimeters));
// Scale down Unreal's centimeters into Cesium's meters.
const glm::dmat4x4 CesiumTransforms::scaleToCesium =
glm::dmat4x4(glm::dmat3x3(centimetersToMeters));
// UE4和cesium坐标的转换,反转Y轴即可。
// We're initializing with a static function instead of inline to avoid an
// internal compiler error in MSVC v14.27.29110.
static glm::dmat4 createUnrealToOrFromCesium() {
return glm::dmat4x4(
glm::dvec4(1.0, 0.0, 0.0, 0.0),
glm::dvec4(0.0, -1.0, 0.0, 0.0),
glm::dvec4(0.0, 0.0, 1.0, 0.0),
glm::dvec4(0.0, 0.0, 0.0, 1.0));
}
// Transform Cesium's right-handed, Z-up coordinate system to Unreal's
// left-handed, Z-up coordinate system by inverting the Y coordinate. This same
// transformation can also go the other way.
const glm::dmat4x4 CesiumTransforms::unrealToOrFromCesium =
createUnrealToOrFromCesium();