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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [OpenGL, Builder] Проблема с отсечением граней 
:(
    Опции темы
Urvin
Дата 15.4.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте!

Сразу к сути: на форме имеется четыре компнента типа TOpenGLPanel,
в каждом рисуется одно и то же, но вид с разных сторон. (это в идеале так)

Все панели имеют общие функции:
Код

void __fastcall TfrmMain::glPro3dInit(TObject *Sender)
{
        glViewport(0,0,(GLsizei)glPro3d->Width,(GLsizei)glPro3d->Height);
        kglInit();
}

void __fastcall TfrmMain::glPro3dResize(TObject *Sender)
{
        glViewport(0,0,(GLsizei)glPro3d->Width,(GLsizei)glPro3d->Height);
        kglResize();
}

void __fastcall TfrmMain::glPro3dPaint(TObject *Sender)
{
        glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

        glOrtho(-MaxSize,MaxSize,-MaxSize,MaxSize,-MaxSize,MaxSize);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();

        glTranslated(0.0, 0.0, -Dal);
        glRotatef(RotX, 1.0, 0.0, 0.0);
        glRotatef(RotY, 0.0, 1.0, 0.0);
        glRotatef(RotZ, 0.0, 0.0, 1.0);

        kglPaint();


        glPopMatrix();
}


RotX,RotY,RotZ - устанавливаются ползунками
MaxSize считатеся при перерисовке. в принципе такой же параметр.

Используемые функции:
Код

void __fastcall TfrmMain::kglInit()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

        glOrtho(-MaxSize,MaxSize,-MaxSize,MaxSize,-MaxSize,MaxSize);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_DEPTH_TEST);
        glClearColor(1.0,1.0,1.0,1.0);

        if (optVerticies->Checked)
                glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
        else if (optWireframe->Checked)
                glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
        else if (optSolid->Checked)
                glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
                
        if(chkAliasing->Checked)
    {
                glEnable(GL_LINE_SMOOTH);
                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

                glEnable(GL_POINT_SMOOTH);
                glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
                glEnable(GL_LINE_SMOOTH);
                glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
                glEnable(GL_POLYGON_SMOOTH);
                glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);
                glLineWidth(1.0);
    }
        else
        {
                glDisable(GL_LINE_SMOOTH);
                glDisable(GL_BLEND);
                glDisable(GL_POINT_SMOOTH);
                glDisable(GL_LINE_SMOOTH);
                glDisable(GL_POLYGON_SMOOTH);
                glLineWidth(1.0);
    }

        glShadeModel(GL_SMOOTH);
}

void __fastcall TfrmMain::kglResize()
{
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        glOrtho(-MaxSize,MaxSize,-MaxSize,MaxSize,-MaxSize,MaxSize);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void __fastcall TfrmMain::kglPaint()
{
        // Оси координат
        glColor3f(0.0,0.0,0.0);
        glBegin(GL_LINES);
                glVertex3f(-MaxSize,0.0,0.0);
                glVertex3f( MaxSize,0.0,0.0);
        glEnd();
        glBegin(GL_LINES);
                glVertex3f(0.0,-MaxSize,0.0);
                glVertex3f(0.0, MaxSize,0.0);
        glEnd();
        glBegin(GL_LINES);
                glVertex3f(0.0,0.0,-MaxSize);
                glVertex3f(0.0,0.0, MaxSize);
        glEnd();

        
        //Рисование куба
        glBegin(GL_POLYGON);
                glColor3f(0.0,0.0,1.0);
                glVertex3f(  1.0,  1.0,  1.0);
                glVertex3f( -1.0,  1.0,  1.0);
                glVertex3f( -1.0, -1.0,  1.0);
                glVertex3f(  1.0, -1.0,  1.0);
        glEnd();

        glBegin(GL_POLYGON);
                glColor3f(0.0,1.0,0.0);
                glVertex3f( -1.0, -1.0,  1.0);
                glVertex3f( -1.0,  1.0,  1.0);
                glVertex3f( -1.0,  1.0, -1.0);
                glVertex3f( -1.0, -1.0, -1.0);
        glEnd();

        glBegin(GL_POLYGON);
                glColor3f(0.0,1.0,1.0);
                glNormal3f(  0.0, -1.0,  0.0);
                glVertex3f( -1.0, -1.0,  1.0);
                glVertex3f(  1.0, -1.0,  1.0);
                glVertex3f(  1.0, -1.0, -1.0);
                glVertex3f( -1.0, -1.0, -1.0);
        glEnd();

        glBegin(GL_POLYGON);
                glColor3f(1.0,0.0,0.0);
                glVertex3f(-1.0, 1.0,-1.0);
                glVertex3f( 1.0, 1.0,-1.0);
                glVertex3f( 1.0,-1.0,-1.0);
                glVertex3f(-1.0,-1.0,-1.0);
        glEnd();

        glBegin(GL_POLYGON);
                glColor3f(1.0,0.0,1.0);
                glVertex3f( 1.0, 1.0, 1.0);
                glVertex3f( 1.0,-1.0, 1.0);
                glVertex3f( 1.0,-1.0,-1.0);
                glVertex3f( 1.0, 1.0,-1.0);
        glEnd();

        glBegin(GL_POLYGON);
                glColor3f(1.0,1.0,0.0);
                glVertex3f(  1.0,  1.0,  1.0);
                glVertex3f( -1.0,  1.0,  1.0);
                glVertex3f( -1.0,  1.0, -1.0);
                glVertex3f(  1.0,  1.0, -1.0);
        glEnd();
}


И на картинке показано что у меня выходит: http://www.funkyimg.com/u/453/414/scrgl.gif
Первые два рисунка одинаковые, четвертый - тот же, но в рисовании стоит glTranslated(0.0, 0.0, -10);
Как видно, происходит отсечение граней. как бы от этого избавиться?
PM MAIL   Вверх
DigitSphinx
Дата 17.4.2008, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как я понял из картинки, надо увеличить MaxSize. Т.е. заднюю грань отсечения.

Это сообщение отредактировал(а) DigitSphinx - 17.4.2008, 08:12


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
FIaR
Дата 17.4.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Действительно, как то интересно сделано
Код

glOrtho(-MaxSize,MaxSize,-MaxSize,MaxSize,-MaxSize,MaxSize);


Перепиши на что нить такое
Код

glOrtho(pLeft, pRight, pTop, pBottom, pNear, pFar);


Код

void glOrtho(
  GLdouble left,
  GLdouble right,
  GLdouble bottom,
  GLdouble top,
  GLdouble near,
  GLdouble far
);

Параметры

left
right
    Координаты левой и правой вертикальных плоскостей отсечения.
bottom
top
    Координаты нижней и верхней горизонтальных плоскостей отсечения.
near
far
    Координаты ближней и дальней плоскостей отсечения по глубине. Когда требуется расположить их позади наблюдателя, необходимо задавать отрицательные значения этих величин. 

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

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

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


 




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


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

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