ビューポート変換の式
2次元ワールド座標から2次元ディスプレイ座標への変換式のメモです。
行列を使わずに直接計算しています。
class ViewportTransform{ protected: //Device(Screen)座標系における原点座標 float m_screenOriginX; float m_screenOriginY; //倍率 screen / world float m_xScale,m_yScale; public: //例えばこんなコンストラクタとか ViewportTransform(float screenOriginX,float screenOriginY,float screenWidth,float screenHeight,float worldWidth,float worldHeight); //Device(screen)座標系へ変換を行う float toScreenX(float x); float toScreenY(float y); //World座標系へ変換を行う float toWorldX(float x); float toWorldY(float y);
ViewportTransform::ViewportTransform(float screenOriginX,float screenOriginY,float screenWidth,float screenHeight,float worldWidth,float worldHeight): //原点座標の初期化 m_screenOriginX(screenOriginX), m_screenOriginY(screenOriginY), m_xScale(screenWidth/worldWidth),//x座標の倍率 m_yScale(screenHeight/worldHeight)//y座標の倍率 { }
World to Device
float ViewportTransform::toScreenX(float x){ return x*m_xScale+m_screenOriginX; } float ViewportTransform::toScreenY(float y){ return m_screenOriginY-y*m_yScale; }
Device to World
float ViewportTransform::toWorldX(float x){ return (x-m_screenOriginX)/m_xScale; } float ViewportTransform::toWorldY(float y){ return (m_screenOriginY-y)/m_yScale; }