더북(TheBook)

추가로, 모든 성분이 -1에서 1 사이 값이므로 고정소수점으로 표시하면 압축 효율을 더 높일 수 있다. 단 약간의 정밀도 손실이 수반되기는 한다. 대개 16비트의 정밀도면 납득할 만한 수준인데, -1에서 1 사이 값을 65535가지의 값으로 표현한다. 이로써 원래 네 성분으로 구성되어 128비트를 차지하는 사원수 하나를, 정밀도를 크게 훼손하지 않고도 단 49비트 만으로 직렬화할 수 있다.

void OutputMemoryBitStream::Write(const Quaternion& inQuat)
{
    float precision = (2.f / 65535.f);
    Write(ConvertToFixed(inQuat.mX, -1.f, precision), 16);
    Write(ConvertToFixed(inQuat.mY, -1.f, precision), 16);
    Write(ConvertToFixed(inQuat.mZ, -1.f, precision), 16);
    Write(inQuat.mW < 0);
}
 
void InputMemoryBitStream::Read(Quaternion& outQuat)
{
    float precision = (2.f / 65535.f);
 
    uint32_t f = 0;
 
    Read(f, 16);
    outQuat.mX = ConvertFromFixed(f, -1.f, precision);
    Read(f, 16);
    outQuat.mY = ConvertFromFixed(f, -1.f, precision);
    Read(f, 16);
    outQuat.mZ = ConvertFromFixed(f, -1.f, precision);
 
    outQuat.mW = sqrtf(1.f -
        (outQuat.mX * outQuat.mX +
        outQuat.mY * outQuat.mY +
        outQuat.mZ * outQuat.mZ));
 
    bool isNegative;
    Read(isNegative);
 
    if (isNegative)
        outQuat.mW *= -1;
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.