Russian Qt Forum
Ноябрь 25, 2024, 00:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наложение текстуры на цилиндр  (Прочитано 8396 раз)
dsp
Гость
« : Апрель 16, 2011, 18:58 »

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

Вопрос еще актуален...
Записан
Denjs
Гость
« Ответ #2 : Апрель 18, 2011, 09:19 »

гм... так в чем вопрос-то?
у вас код какой есть ? ну вы же должны были для начала "с чем-то поиграться" что бы у вас "что-нибудь не получилось"?

________________
(ну я это.. что бы разговор поддержать...  Улыбающийся )
Записан
mutineer
Гость
« Ответ #3 : Апрель 18, 2011, 10:16 »

Если вопрос только в том, чтобы текстура была мордой внутрь, то просто сделай у полигонов цидиндра нормали внутрь
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 18, 2011, 11:38 »

Требуется наложить текстуру(3d панорамное изображение) на цилиндр, но картинкой вовнутрь с помощью OpenGL (т.е., как я предполагаю - на внутреннюю поверхность цилиндра). Для этого, может быть, какой-то флаг есть в функциях, связанных с наложением текстур, или параметр какой. Подскажите.
С "внутренней поверхностью" - то др. вопрос. А чтобы наложить цилиндром - такого параметра/ф-ции нет. Обычно рассчитывают UV для цилиндра (для каждого вертекса) и их подают (glTexCoord). Плюс там еще геморрой на "швах" - надо разбивать полигон.
Записан
dsp
Гость
« Ответ #5 : Апрель 18, 2011, 16:00 »

С графикой только разбираюсь, пока что осознал основные понятия и функции. В качестве упражнения сделал тетраэдр, который можно вращать мышкой. Вот нужно от этого плавно перейти к цилиндру, а потом к текстурам =) Буду пытаться делать, код оформлю сюда попозже...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 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;
 
Записан
dsp
Гость
« Ответ #7 : Апрель 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();

Теперь как-то надо от умения рисовать плоскость перейти к цилиндру =)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 25, 2011, 04:33 »

Правильно ли я понял, что цилиндр следует строить из полигонов?
Обсуждалось здесь http://www.prog.org.ru/index.php?topic=11086.msg67525#msg67525
Записан
dsp
Гость
« Ответ #9 : Май 12, 2011, 18:26 »

Привет.

Сделал цилиндр (он законспектирован пока), теперь пробую наложить текстуру на прямоугольник. Вроде бы получилось, но изменился цвет текстуры (появилась синева, если указывать парамент RGBA (как исправить?), вот оригинал ,а если RGB, то текстура "сама не своя" ). В начале изображение накладывалось перевернутым (пришлось его координаты сделать отрицательными (правильно ли так делать?) ).

Код:
#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);
      }
}
Как накладывать одну текстуру на несколько полигонов?

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 23.