Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
glReadPixels通过缩放移动坐标 我尝试通过使用C++代码的GLADITEN像素选择两个对角的像素来读取矩形像素。选择Y轴值时会出现问题_C++_Opengl_Coordinates_Glut_Glreadpixels - Fatal编程技术网

glReadPixels通过缩放移动坐标 我尝试通过使用C++代码的GLADITEN像素选择两个对角的像素来读取矩形像素。选择Y轴值时会出现问题

glReadPixels通过缩放移动坐标 我尝试通过使用C++代码的GLADITEN像素选择两个对角的像素来读取矩形像素。选择Y轴值时会出现问题,c++,opengl,coordinates,glut,glreadpixels,C++,Opengl,Coordinates,Glut,Glreadpixels,目前,我设法让glReadPixels工作到缩放。放大或缩小时,该工具从其他Y值读取像素,X值始终正常 我做错了什么 格洛托: IZDA = mCameraPosition.x - ((double)(rectangleDim.x/SCRARatio)) * mZoomFactor / 2; DCHA = mCameraPosition.x + ((double)(rectangleDim.x/SCRARatio)) * mZoomFactor / 2 ABAJO = mCameraPositi

目前,我设法让glReadPixels工作到缩放。放大或缩小时,该工具从其他Y值读取像素,X值始终正常

我做错了什么

格洛托:

IZDA = mCameraPosition.x - ((double)(rectangleDim.x/SCRARatio)) * mZoomFactor / 2;
DCHA = mCameraPosition.x + ((double)(rectangleDim.x/SCRARatio)) * mZoomFactor / 2
ABAJO = mCameraPosition.y - ((double)rectangleDim.y) * mZoomFactor / 2;
ARRIBA = mCameraPosition.y + ((double)rectangleDim.y) * mZoomFactor / 2;

glOrtho(IZDA, DCHA, ABAJO, ARRIBA, -1.0f, 1.0f);
GETSCREENCOORDS

realDim.x = dimension.x * (dimension.x * mZoomFactor / 2);
realDim.y = dimension.y * (dimension.y * mZoomFactor / 2);

GSC.x = (dimension.x*(x-mCameraPosition.x)) / realDim.x;
GSC.y = (dimension.y/realDim.y) * ((pow(dimension.y, 2)*mZoomFactor/2)+mCameraPosition.y + y - imgDim.y);
GETWORLDCOORDS

realDim.x = dimension.x * (dimension.x * mZoomFactor / 2);
realDim.y = dimension.y * (dimension.y * mZoomFactor / 2);

GWC.x =
    ((x * realDim.x) / dimension.x) + mCameraPosition.x;

GWC.y =
    ((y * realDim.y) / dimension.y)
    -((dimension.y * (dimension.y * mZoomFactor/2)) + mCameraPosition.y)
    + imgDim.y;
使用glReadPixels检查FillValue

ComplexData::Point a, b;

// Set points screen coordinates
getScreenCoords(FIP.x, FIP.y);
a.x = GSC.x;
a.y = GSC.y;
getScreenCoords(FEP.x, FEP.y);
b.x = GSC.x;
b.y = GSC.y;

// Set length and width to read (and write)
double RX_Length, RY_Length;
if (b.x < a.x) RX_Length = a.x - b.x;
else RX_Length = b.x - a.x;
if (b.y < a.y) RY_Length = a.y - b.y;
else RY_Length = b.y - a.y;

// Pixel data vector
float *tdata = new float[3*RX_Length*RY_Length];

double desp = (mZoomFactor*dvcamera)/dvzoom;

getScreenCoords(min(FIP.x, FEP.x), gHeight-FIP.y-2*(mCameraPosition.y-desp));
// Reading from the GET SCREEN COORDINATES global values (GSC)
glReadPixels(GSC.x, GSC.y, RX_Length, RY_Length, GL_RGB, GL_FLOAT, tdata);  // <---     Works great until zooming

glRasterPos2d(min(FIP.x, FEP.x), gHeight-max(FIP.y, FEP.y));
glDrawPixels(RX_Length, RY_Length, GL_RGB, GL_FLOAT, tdata);    // <--- Works great
delete[] tdata;
鼠标滚轮变焦

Drawing::Point pt = e->Location;
getWorldCoords(pt.X, pt.Y);

Initial_Zoom.X = rectangleDim.x - GWC.x;
Initial_Zoom.Y = GWC.y;

// ZOOM IN
if (e->Delta > 0){
    if (mZoomFactor > float::Epsilon * 1000.0f){
        mZoomFactor /= 1.15f;
    }
}
// ZOOM OUT
else {
    if (mZoomFactor < float::MaxValue / 1000.0f){
        mZoomFactor *= 1.15f;
    }
}

我设法找到了解决办法

替换:

getScreenCoords(min(FIP.x, FEP.x), gHeight-FIP.y-2*(mCameraPosition.y-desp));
glReadPixels(GSC.x, GSC.y, RX_Length, RY_Length, GL_RGB, GL_FLOAT, tdata);
与:

瞧。它起作用了^^

getScreenCoords(std::min(FIP.x, FEP.x), FIP.y);
glReadPixels(GSC.x, rectangleDim.y - GSC.y, RX, RY, GL_RGB, GL_FLOAT, tdata);