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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> scalling in OpenGL, scalling in OpenGL 
:(
    Опции темы
Aram
Дата 30.11.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня такая проблема у меня есть 4 окна три из них для проекций и одна для трехмерного отображения. И соответственно у меня 4 класса COpenGLxy, COpenGLxz, COpenGL yz, COpenGLxyz, 
Все эти классы порождены от COpenGL, которая в свою очередь порождена от CScrollView.  В классе COpenGL я реализовал функцию для масштабирования осей координат: следующим образом
Код
COpenGL::CoordinatProperty(CClientDC *CleintDC)
{
CleintDC->SetMapMode(MM_ANISOTROPIC);
CleintDC->SetWindowExt(750,750);
CleintDC->SetViewportExt(240,-240);
CleintDC->SetWindowOrg(-750,750);
}

Код
void COpenGL::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();
CClientDC dc(this); // device context for painting

SetScrollSizes(MM_LOMETRIC,CSize(1500,1500));
}
void COpenGLxyz::OnInitialUpdate()
{
    COpenGL::OnInitialUpdate();
    pFrame=(CMainFrame *) GetParentOwner();

    dc=new CClientDC(this);
     OnPrepareDC(dc);
    CoordinatProperty(dc);

Скажите пожалуйста как мне нарисовать в окне представления COpenGLxyz
Используя выше указанное масштабирование.
Я сделал следующим образом но у меня ничего не рисуется:
Код
BOOL COpenGLxyz::PreCreateWindow(CREATESTRUCT& cs) 
{
    // TODO: Add your specialized code here and/or call the base class
    cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
    return COpenGL::PreCreateWindow(cs);
}

int COpenGLxyz::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (COpenGL::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    PIXELFORMATDESCRIPTOR pfd = {
                 sizeof(PIXELFORMATDESCRIPTOR), // Structure size
                 1,                             // Version number
                 PFD_DRAW_TO_WINDOW |           // Property flags
                 PFD_SUPPORT_OPENGL |
                    PFD_DOUBLEBUFFER|
            PFD_SUPPORT_GDI|
            PFD_GENERIC_FORMAT,          // (remove if no double buf)
                 PFD_TYPE_RGBA,                 // PixelType
                 24,                            // 24-bit color
                 0, 0, 0, 0, 0, 0,              // Color bits and shift
                 0, 0, 0, 0, 0, 0, 0,           // Alpha and accum buffer bits
                 32,                            // 32-bit depth buffer
                 0, 0,                          // No stencil or aux buffer
                 PFD_MAIN_PLANE,                // Layer type
                 0,                             // Reserved
                 0, 0, 0                        // Unsupported
    };

    CClientDC dcClient(this);
    int iPixelFormat = ChoosePixelFormat(dcClient.m_hDC,&pfd);
     DescribePixelFormat(dcClient.m_hDC,iPixelFormat,    sizeof(pfd),&pfd);    
   m_hRC = wglCreateContext(dcClient.m_hDC);
    wglMakeCurrent(dcClient.m_hDC,m_hRC);
    glClearColor(0.0f,0.0f,0.0f,0.0f); // black
    wglMakeCurrent(dcClient.m_hDC,NULL);

    return 0;
}

Код
void COpenGLxyz::OnDraw(CDC* pDC)
{

GLfloat x=2.0f, y=2.0f, z=3.0f;
wglMakeCurrent(dc->m_hDC, m_hRC);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glTranslatef(0.5f,-0.5f,0.0f);
glRotatef(20.0f,1.0f,0.0f,0.0f);
glRotatef(-30.0f,0.0f,1.0f,0.0f);
glLineWidth(4.0f);

glBegin(GL_LINES);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(x,0.0f,0.0f);

glColor3f(1.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,y,0.0f);


glColor3f(0.0f,8.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,z);

glEnd();
glPopMatrix();
glFinish();
SwapBuffers(::wglGetCurrentDC())
}


PM MAIL   Вверх
baldina
Дата 6.12.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



В OpenGL все эти CClientDC никакой роли не играют.
Оси координат надо функциями OpenGL устанавливать.

Например, класс COpenGL содержит данные поворота и применяет их при рисовании:

Код

class COpenGL {
   double rot_X, rot_Y, rot_Z;
   COpenGL (double x, double y, double z) : rot_X(x), rot_Y(y), rot_Z(z) {}
   void OnDraw(CDC*)
   {
      wglMakeCurrent(m_hDC, m_hRC);
      .....
      glLoadIdentity ();
      glRotated (rot_X, rot_Y, rot_Z);
   }
};

class COpenGLxy : public COpenGL {
   COpenGLxy () : COpenGL (0,0,1)  {}
};


и т.д. в таком духе


а вот это
Код

CleintDC->SetMapMode(MM_ANISOTROPIC);
CleintDC->SetWindowExt(750,750);
CleintDC->SetViewportExt(240,-240);
CleintDC->SetWindowOrg(-750,750);


надо моменять на 
Код

  glViewport (0, 0, m_width, m_height);
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity ();
  glOrtho (left, right, bottom, top, m_zNear, m_zFar);


Это сообщение отредактировал(а) baldina - 6.12.2007, 01:20
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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