Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расположение камеры 
V
    Опции темы
idsp
Дата 10.6.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



Есть цилиндр - необходимо разместить так камеру, что бы она находилась внутри него.
Приведу аналогию из жизни что бы было понятно.

Когда шлем мотоциклетный надеваешь на голову и смотришь через отверстие
для глаз. 

Вот тут также: глаза - это камера. Шлем - это цилиндр. Нужно видеть при этом бока цилиндра - там текстура будет.

Помогите, очень надо!

Код

#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);
    }
}



Это сообщение отредактировал(а) idsp - 10.6.2011, 17:27
PM MAIL   Вверх
Vetos
Дата 10.6.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Так а в чем проблема gluLookAt и юзай.


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
idsp
Дата 10.6.2011, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет




Увы, но мне не удалось реализовать с ее помощью задуманное.

PM MAIL   Вверх
Vetos
Дата 10.6.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Ну незнаю, что там такого задуманного, команда выполняет функции позиционирования камеры, подругому только Rotate Translate


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
idsp
Дата 10.6.2011, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



Вот выкладываю полностью код. Поверьте, если б я знал, как это сделать, то сделал бы. Я уже смотреть не могу на это все... 
Если это возможно, не могли бы вы запустить у себя дома данный код и причесать его к моем требованиям? Спасибо.

Scene3D.h
Код

#include <QGLWidget>

class Scene3D : public QGLWidget
{

public:
    Scene3D(QWidget *parent = 0); 

protected:
    void initializeGL();        
    void resizeGL(int w, int h); 
    void paintGL();              

    void mousePressEvent(QMouseEvent *mousePress); 
    void mouseMoveEvent(QMouseEvent *mouseMove);  

private:
    float    xRotate; 
    float    yRotate; 
    float    zRotate; 
    GLdouble quad;    
    GLdouble radius;  
    GLdouble hight;   
    GLuint   text[1];
    float angle;   

    QPoint mouseLastPosition; 

    void drawCylinder();  
    void LoadTextures();
};



scene3D.cpp
Код

#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);
    }
}


PM MAIL   Вверх
Vetos
Дата 11.6.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Выложи скрин что именно у тебя не выходит


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
idsp
Дата 11.6.2011, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



user posted image

это скрин цилиндра - вид сзади.

А мне нужно что бы камера находилась в этом же положении, но внутри цилиндра. 
У меня получалось заезжать в цилиндр, но его бока как бы расстворялись. то ли порт просмотра был маловат и часть цилиндра уходила за его пределы, толи еще чего, я так и не понял.
PM MAIL   Вверх
Vetos
Дата 11.6.2011, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



скорее нужно использовать gluPerspective вместо glOrtho, ближнюю плоскость отсечения задать ближе к 0.0


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
idsp
Дата 11.6.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.5.2011

Репутация: нет
Всего: нет



Проблема решена!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.