2013-12-19 203 views
1

当我从openCV图像制作纹理时,它总是旋转180度,这是为什么?有我的代码,它绑定纹理并在屏幕上显示它。 如果代码规范,建议我如何正确旋转纹理,我无法得到它。旋转纹理openGL C++

glBindTexture(GL_TEXTURE_2D, slice.texture); 
glLoadIdentity(); 
glEnable(GL_TEXTURE_2D); //enable 2D texturing 

glBegin (GL_QUADS); 

float nullX = slObj->rect.x/400.0; 
float nullY = slObj->rect.y/300.0; 

float sliceWidth = slObj->rect.width/400.0; 
float sliceHeight = slObj->rect.height/300.0; 

//with our vertices we have to assign a texcoord 
//so that our texture has some points to draw to 
glTexCoord2d(0.0,0.0); glVertex2f(nullX, nullY); 
glTexCoord2d(1.0,0.0); glVertex2f(nullX + sliceWidth, nullY); 
glTexCoord2d(1.0,1.0); glVertex2f(nullX + sliceWidth, nullY + sliceHeight); 
glTexCoord2d(0.0,1.0); glVertex2f(nullX, nullY + sliceHeight); 
glEnd(); 
glFlush(); 

UPDATE:

// initialize 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
glutInitWindowSize(screenWidth, screenHeight); 
glClearColor(0.3,0.3,0.3,0.0); 
glMatrixMode(GL_PROJECTION); 
glOrtho(-400.0 ,400.0 ,-300.0 ,300.0 ,0 ,1.0); 

回答

1

如何为您的投影矩阵设置?

这些坐标是正确的,假设您有一个传统的投影矩阵,Y轴从屏幕的底部到顶部增加。另一方面,如果您颠倒了投影矩阵,使得(0,0)实际上是屏幕的左上角,那么您有问题。

如果是这种情况,纹理并不真正旋转,而是被镜像。没有轮换可以产生这种情况,这就是所谓的chirality (also known as handedness)的变化。您可以使用传统的投影矩阵,其中Y轴的行为如前所述,或者在通过翻转第二个纹理坐标(T)计算纹理坐标时进行补偿。

+0

我更新了我的问题,请看看 – gronzzz

+1

@gronzzz:你的投影矩阵是正确的。我开始怀疑OpenCV将图像的原点(0,0)定义为左上角,而OpenGL使用左下角。我对API不熟悉,但许多图像API和格式允许您重新定义原点和/或跨一个轴镜像/翻转图像。如果你不能这样做,你总是可以用glScale(1.0,-1.0,1.0);'来重新定义原点。注意这只适用于固定功能的OpenGL。 –

0

因为我用openCV加载和切片图像,我只是简单地翻转图像。

IplImage *source = cvLoadImage("space.png",1); 
if(source == NULL) source = cvLoadImage("C://space.png",1); 

cvFlip(source, source, 0); 

谢谢大家的帮忙!