Попробовал я тут как-то на цилиндр текстуру наложить. Как это сделать без glut я так и не понял. Пришлось использовать, как бы мне этого не хотелось glut. Но дело не в этом, а в том, что все текстуры меняют свою цветовую гамму на синеву . а должно быть так 
| Код | #include <QtGui> #include "scene3D.h" #include <math.h> #include <GL/glu.h>
Scene3D::Scene3D(QWidget *parent) : QGLWidget(parent) { //setMouseTracking(true); yRotate = 0.0; //angle = 0.0; radius = 652; quad = 32; hight = 1024; }
void Scene3D::initializeGL() { qglClearColor(Qt::gray);
LoadTextures(); glEnable(GL_TEXTURE_2D); }
void Scene3D::resizeGL(int w, int h) { glMatrixMode(GL_PROJECTION); glLoadIdentity();
glViewport(0, 0, (GLint)w, (GLint)h); glOrtho(-w, w, -h, h, -w, w); }
void Scene3D::paintGL() { glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt(0, -500, -1, 0, -500, 0, 0, 1, 0); glRotatef(90, 1.0f, 0.0f, 0.0f);
glRotatef(yRotate, 0.0f, 1.0f, 0.0f);
drawCylinder(); }
void Scene3D::drawCylinder() { glBindTexture(GL_TEXTURE_2D, text[0]);
GLUquadric* quadObj = gluNewQuadric(); gluQuadricTexture(quadObj, GL_TRUE);
gluCylinder(quadObj, radius, radius, 1024, quad, quad); // цилиндр // const float PI2 = 3.141593 * 2;
// glBegin(GL_TRIANGLE_STRIP); // for(float i = 0.0; i <= quad; i++) // { // angle = PI2 * (float)i / (float)quad; // qglColor(Qt::green); // glVertex3f(radius*cos(angle), 0, radius*sin(angle)); // qglColor(Qt::blue); // glVertex3f(radius*cos(angle), hight, radius*sin(angle)); // } // glEnd(); }
void Scene3D::mousePressEvent(QMouseEvent *mousePress) { mouseLastPosition = mousePress->pos(); }
void Scene3D::mouseMoveEvent(QMouseEvent *mouseMove) { yRotate += (mouseMove->y() - mouseLastPosition.y());
updateGL(); mouseLastPosition = mouseMove->pos(); } void Scene3D::LoadTextures() { QImage im = QImage(":/Icons/bullshit.jpg");
if (!im.isNull()) { glGenTextures(1, &text[0]); glBindTexture(GL_TEXTURE_2D, text[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 4, im.width(), im.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, im.bits()); } else { QMessageBox::warning(this, "ERROR", "error", 0, 1); } }
|
|