Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: dsp от Апрель 16, 2011, 18:58



Название: Наложение текстуры на цилиндр
Отправлено: dsp от Апрель 16, 2011, 18:58
Требуется наложить текстуру(3d панорамное изображение) на цилиндр, но картинкой вовнутрь с помощью OpenGL (т.е., как я предполагаю - на внутреннюю поверхность цилиндра). Для этого, может быть, какой-то флаг есть в функциях, связанных с наложением текстур, или параметр какой. Подскажите.


Название: Re: Наложение текстуры на цилиндр
Отправлено: dsp от Апрель 18, 2011, 09:11
Вопрос еще актуален...


Название: Re: Наложение текстуры на цилиндр
Отправлено: Denjs от Апрель 18, 2011, 09:19
гм... так в чем вопрос-то?
у вас код какой есть ? ну вы же должны были для начала "с чем-то поиграться" что бы у вас "что-нибудь не получилось"?

________________
(ну я это.. что бы разговор поддержать...  :) )


Название: Re: Наложение текстуры на цилиндр
Отправлено: mutineer от Апрель 18, 2011, 10:16
Если вопрос только в том, чтобы текстура была мордой внутрь, то просто сделай у полигонов цидиндра нормали внутрь


Название: Re: Наложение текстуры на цилиндр
Отправлено: Igors от Апрель 18, 2011, 11:38
Требуется наложить текстуру(3d панорамное изображение) на цилиндр, но картинкой вовнутрь с помощью OpenGL (т.е., как я предполагаю - на внутреннюю поверхность цилиндра). Для этого, может быть, какой-то флаг есть в функциях, связанных с наложением текстур, или параметр какой. Подскажите.
С "внутренней поверхностью" - то др. вопрос. А чтобы наложить цилиндром - такого параметра/ф-ции нет. Обычно рассчитывают UV для цилиндра (для каждого вертекса) и их подают (glTexCoord). Плюс там еще геморрой на "швах" - надо разбивать полигон.


Название: Re: Наложение текстуры на цилиндр
Отправлено: dsp от Апрель 18, 2011, 16:00
С графикой только разбираюсь, пока что осознал основные понятия и функции. В качестве упражнения сделал тетраэдр, который можно вращать мышкой. Вот нужно от этого плавно перейти к цилиндру, а потом к текстурам =) Буду пытаться делать, код оформлю сюда попозже...


Название: Re: Наложение текстуры на цилиндр
Отправлено: Igors от Апрель 18, 2011, 16:14
С графикой только разбираюсь, пока что осознал основные понятия и функции. В качестве упражнения сделал тетраэдр, который можно вращать мышкой. Вот нужно от этого плавно перейти к цилиндру, а потом к текстурам =) Буду пытаться делать, код оформлю сюда попозже...
Там несложно. Для цилиндра вдоль оси Y с центром в (0, 0, 0) для каждой точки p(x, y, z) соответствующая точка имеджа вычисляется:
Код
C++ (Qt)
float h; // высота цилиндра
y_image = (h / 2 - p.y) / h * image_height;
x_image = atan2(p.z, p.x) / (PI * 2) * image_width;
 


Название: Re: Наложение текстуры на цилиндр
Отправлено: dsp от Апрель 24, 2011, 16:53
Правильно ли я понял, что цилиндр следует строить из полигонов?

вот попробовал просто плоскость сделать 10х10 из GL_QUADS (где v - ось Y, u - ось X):

Код:
void Ploskost::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_QUADS);
        for(GLfloat v = 0.0; v < 10.0; v++)
            for(GLfloat u = 0.0; u < 10.0; u++)
            {
                qglColor(Qt::green);
                  glVertex3f(u, v, 0.0f);
                qglColor(Qt::red);
                  glVertex3f(u, v+1, 0.0f);
                qglColor(Qt::green);
                  glVertex3f(u+1, v+1.0f, 0.0f);
                qglColor(Qt::red);
                  glVertex3f(u+1.0f, v, 0.0f);
            }
    glEnd();

Теперь как-то надо от умения рисовать плоскость перейти к цилиндру =)


Название: Re: Наложение текстуры на цилиндр
Отправлено: Igors от Апрель 25, 2011, 04:33
Правильно ли я понял, что цилиндр следует строить из полигонов?
Обсуждалось здесь http://www.prog.org.ru/index.php?topic=11086.msg67525#msg67525 (http://www.prog.org.ru/index.php?topic=11086.msg67525#msg67525)


Название: Re: Наложение текстуры на цилиндр
Отправлено: dsp от Май 12, 2011, 18:26
Привет.

Сделал цилиндр (он законспектирован пока), теперь пробую наложить текстуру на прямоугольник. Вроде бы получилось, но изменился цвет текстуры (появилась синева, если указывать парамент RGBA (http://s45.radikal.ru/i110/1105/5b/b7c41537403c.png) (как исправить?), вот оригинал (http://i065.radikal.ru/1105/67/7af62ffc8be9.png),а если RGB, то текстура "сама не своя" (http://i056.radikal.ru/1105/e0/8ac4231e4c48.png) ). В начале изображение накладывалось перевернутым (пришлось его координаты сделать отрицательными (правильно ли так делать?) ).

Код:
#include "scene3D.h"
#include <math.h>
#include <QtGui>

const static float PI2 = 3.141593 * 2;

scene3D::scene3D(QWidget *parent) : QGLWidget(parent)
{
    yRotate = 0.0;
    angle = 0.0;
    radius = 500;   // ?
    quad = 30;      // ?
    hight = radius; //?
}

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();   

    glRotatef(yRotate, 0.0f, 1.0f, 0.0f);

    drawCylinder();   
}

void scene3D::drawCylinder()
{
    glBindTexture(GL_TEXTURE_2D, text[0]);
    float x = 32.0f;
    float y = 32.0f;
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, -1.0f); glVertex3f(-x, y, 0.0f);
        glTexCoord2f(0.0f,  0.0f); glVertex3f(-x, -y, 0.0f);
        glTexCoord2f(1.0f,  0.0f); glVertex3f(x, -y, 0.0f);
        glTexCoord2f(1.0f, -1.0f); glVertex3f(x, y, 0.0f);
    glEnd();

//    float y = 1024.0f;
//    float x = 4096.0f;

//    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), y0, 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/64x64.jpg");
      if (!im.isNull())
      {
          glGenTextures(1, &text[0]);
          glBindTexture(GL_TEXTURE_2D, text[0]);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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);
      }
}
Как накладывать одну текстуру на несколько полигонов?