纹理映射如此接近但不太正确

时间:2017-01-11 00:43:18

标签: c++ graphics 3d imagemagick textures

我正在构建一个光线跟踪器,我的纹理贴图并不完全正确。它非常接近。我在搅拌机中制作一个杯子并进行UV展开以显示纹理。我导出了对象并将其加载到具有相同纹理的光线跟踪器中。这是两张图片: img img

正如你所看到的那样,纹理看起来非常接近,但有些东西是关闭的。如果你看看两侧杯子的底部,你可以看到它们不一样,但是纹理都正确对齐,所以它看起来有点正确。计算纹理的方式是使用重心坐标。

    Vect n = getTriangleNormal();
    Vect ba = B.add(A.negative()).negative();
    Vect ca = C.add(A.negative()).negative();

    Vect ap = A.add(point.negative()).negative();
    Vect bp = B.add(point.negative()).negative();
    Vect cp = C.add(point.negative()).negative();


    double areaABC = n.dotProduct(ba.crossProduct(ca));
    double areaPBC = n.dotProduct(bp.crossProduct(cp));
    double areaPCA = n.dotProduct(cp.crossProduct(ap));

    if(areaABC < 0){areaABC = -areaABC;}
    if(areaPBC < 0){areaPBC = -areaPBC;}
    if(areaPCA < 0){areaPCA = -areaPCA;}

    double u = areaPBC / areaABC ; // alpha
    double v = areaPCA / areaABC ; // beta
    double w = 1.0f - u - v ; // gamma  

然后找到颜色我拿新点并将其映射到图像上

    Vect uv =  (textA.mult(u)).add(textB.mult(v)).add(textC.mult(w));
    int width = texture ->columns();
    int height = texture ->rows();


    double x = width * (uv.getX()) ; x = (int) x;
    double y = height * (1-uv.getY()) ; y = (int) y;

    //vector<unsigned int> c = texture -> getPixel(x,y); 

    //return Color(c[0]/255.0,c[1]/255.0,c[2]/255.0,0);

    int row = y;
    int column = x;

    Magick::PixelPacket *pixels = texture->getPixels(0, 0, width, height);
    Magick::Color color = pixels[width * row + column];

    double range = pow(2, texture -> modulusDepth());

    double r = color.redQuantum()/range ;
    double g = color.greenQuantum()/range ;
    double b = color.blueQuantum()/range ;

    return Color(r, g, b, 0);

0 个答案:

没有答案