天天看點

圖形學變換中的Homogenize方法_艾孜爾江撰

Vector4 Transform::Homogenize(Vector4& result, const Vector4& vec4ToBeHomogenized)
  {
    if (vec4ToBeHomogenized.getW() == 0.f) {
      return Vector4();
    }
    float rhw = 1 / vec4ToBeHomogenized.getW();
    result.setX((1.f + vec4ToBeHomogenized.getX() * rhw) * canvasWidth * 0.5f);  // screen coordinate
    result.setY((1.f - vec4ToBeHomogenized.getY() * rhw) * canvasHeight * 0.5f); //screen coordinate ---> top down
    result.setZ(vec4ToBeHomogenized.getZ() * rhw);
    result.setW(rhw);
    return result;
  }      

它的逆變換如下(逆變換主要用于求陰影時候的反求過程):

Vector4 Transform::HomogenizeInvertion(Vector4 & result, const Vector4 & vec4ToBeInverted)
  {
    if (vec4ToBeInverted.getW() == 0.f) {
      return Vector4();
    }

    float rhw = 1.f / vec4ToBeInverted.getW();
    
    float reciprocalOfCanvasHeight = 1.f / canvasHeight;
    float reciprocalOfCanvasWidth = 1.f / canvasWidth;

    result.setX(((2 * vec4ToBeInverted.getX() * reciprocalOfCanvasWidth) - 1.f) * rhw);
    result.setY((1.f - (2 * vec4ToBeInverted.getY() * reciprocalOfCanvasHeight)) * rhw);
    result.setZ(vec4ToBeInverted.getZ() * rhw);
    result.setW(rhw);

    return result;
  }      
o