DEKI/ENGINE 문서
Deki 0.19.0
임베디드 디스플레이와 데스크톱을 위한 모듈식 C++ 2D 엔진
로딩중...
검색중...
일치하는것 없음
단위

단위를 기록하는 곳은 이 페이지 하나뿐입니다. 이 엔진에서 어떤 숫자에 단위가 있다면, 그 단위는 이 페이지에 있습니다.

규칙

저장되는 값은 SI 단위입니다. 언제나. 미터, 라디안, 초, 킬로그램, 섭씨 온도. 컴포넌트, 씬 파일, 패키지 API의 float은 이 페이지에 적힌 단위이며, 예외도 없고 프로젝트마다 다르지도 않습니다.

변환은 정확히 한 경계, 즉 표시에서만 일어납니다. 인스펙터는 거리를 픽셀로, 각도를 도로, 온도를 화씨로 보여 줄 수 있습니다. 씬 파일과 계산에 도달하는 것은 SI 단위입니다.

이것은 스타일 취향이 아닙니다. 이 규칙이 없으면 세 가지가 깨집니다.

  1. 직렬화된 씬이 모호해집니다. 누가 저장했느냐에 따라 미터일 수도 있고 픽셀일 수도 있는 width: 4.0은 확실하게 다시 읽어 들일 수 없습니다.
  2. 계산에서 스케일이 조용히 섞입니다. px/s 단위의 속도를 미터 단위의 위치에 더해도 컴파일되며, 그럴듯한 틀린 답이 나옵니다.
  3. 패키지끼리 상호 운용되지 않습니다. deki-2d와 물리 패키지는 서로를 참조하지 않고도 float이 무엇을 뜻하는지 합의해야 합니다.

저장되는 것

물리량 저장 단위 PhysicalUnit 인스펙터 표시
거리 미터 Distance px (× pixelsPerMeter) 또는 m
속도 미터 매 초 Velocity px/s 또는 m/s
가속도 미터 매 초 제곱 Acceleration px/s² 또는 m/s²
각도 라디안 Angle 항상 도
각속도 라디안 매 초 AngularVelocity 항상 도/s
온도 섭씨 온도 Temperature °C 또는 °F
시뮬레이션 시간 float인 초 - -
지속 시간, 타임아웃 정수인 밀리초 - -
주파수 헤르츠 - -
데이터 크기 바이트 - -
질량 킬로그램 - 예약됨. 아직 사용하는 곳 없음

PhysicalUnit은 저장 방식에 대한 명시가 아니라 표시 힌트입니다. 생략하면 인스펙터에 단위 없는 숫자가 표시될 뿐이며, 값의 의미는 결코 바뀌지 않습니다.

시간에 두 가지 규약이 있는 이유

둘 다 의도된 것이며, 어느 쪽인지는 타입이 알려 줍니다.

초 단위의 float은 시뮬레이션 델타, 즉 한 프레임에 월드 시간이 얼마나 진행되는지입니다. 초를 쓰면 숫자가 float 정밀도가 가장 좋은 1.0 근처에 머물며, 적분 단계에서 곱하는 값도 이것입니다.

밀리초 단위의 정수는 실제 시간입니다. 타임아웃, 애니메이션 프레임 지속 시간, 타임스탬프 같은 것입니다. 정확하고, 적분하지 않고 비교하며, 보통 밀리초를 쓰는 플랫폼 API를 거칩니다.

이름이 Ms로 끝나면 밀리초의 정수 개수입니다. 단위 표시가 없는 시간 float은 초입니다.

데이터시트는 SI를 쓰지 않으며, 그래도 괜찮습니다

센서 데이터시트는 g와 초당 도를 씁니다. 그런 값을 반환하는 API가 잘못된 것은 아닙니다. 잘못된 것은 이름에 그렇다고 밝히지 않은 메서드에서 그런 값을 반환하는 API입니다. IDekiIMU가 그 패턴을 보여 줍니다.

// SI, and the only virtual: this is what the engine stores
virtual DekiVec3f ReadGyroRadiansPerSecond() const = 0;
// the datasheet's unit, derived and NOT virtual, so a driver cannot make
// the two disagree
DekiVec3f ReadGyroDegreesPerSecond() const;

두 이름 모두 단위를 담고 있으므로 어느 쪽도 잘못 읽힐 수 없습니다. 칩의 ±245 dps 수치와 대조하며 디버깅할 때는 데이터시트식 이름을 쓰고, 측정값을 적분하는 것은 모두 SI를 씁니다. 변환은 드라이버의 스케일 상수에 한 번만 있으며, 식 안에 데이터시트 수치가 그대로 보입니다.

float m_GyroScale = (245.0f / 32768.0f) * Deki::Math::kDegToRad; // LSB -> rad/s

ReadAccelMetersPerSecondSquared()와 ReadAccelG()에도 똑같이 적용됩니다.

센서 API를 추가한다면 메서드 이름에 단위를 넣으십시오. 단위 없는 벡터를 반환하는 ReadGyro()야말로 이 규칙이 막으려는 것입니다. 이 메서드는 엔진의 다른 모든 각도 값이 라디안인데도 dps로 문서화되어 있었고, 잘못된 가정으로 회전에 입력된 측정값은 57.3× 어긋납니다.

표시 변환

모두 deki-editor/src/core/Units.h에 있습니다. 파일 하나이므로 단위를 추가할 때는 한 곳만 편집하면 됩니다.

  • GetUnitDisplay(unit) - 배율, 오프셋, printf 형식, 드래그 속도.
  • ToDisplay(stored, ud) / FromDisplay(shown, ud) - 함께 관리되는 역변환 쌍입니다. 모든 변환이 단순 곱셈이던 때에는 호출하는 쪽에서 인라인으로 역변환할 수 있었지만, 화씨의 오프셋이 생긴 지금은 직접 작성한 shown / multiplier가 32도 틀리면서도 여전히 그럴듯해 보입니다.
  • CanonicalUnitSymbol(unit) - 값이 저장되는 SI 기호로, 기계가 읽는 출력용입니다. 표시 설정의 영향을 받지 않습니다. 메타데이터 덤프에 "px"를 쓰면 덤프가 거짓말을 하게 됩니다.
  • SnapMetersToPixel / ShouldSnapToPixel - 거리에만, 픽셀 모드에서만.

이를 제어하는 프로젝트 설정이며, 모두 표시 전용입니다.

설정 효과
inspectorUnit 거리 계열에 대한 Pixels 또는 Meters
pixelsPerMeter px↔m 계수, 기본값 16
temperatureUnit Celsius 또는 Fahrenheit

이 중 무엇을 바꿔도 디스크나 메모리에서는 아무것도 바뀌지 않습니다.

프로퍼티에 단위 추가하기

DEKI_EXPORT
DEKI_UNIT(Distance)
float width; // metres, like every other Distance