Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2013, 11:51   #1
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию OpenGL 2d/3d

В общем вот код(не мой):
Код:
//---------------------------------------------------------------------------

#include <vcl.h>

#include <GL/gl.h>
#include <GL/glu.h>
//#include <GL/glaux.h>
#pragma hdrstop

#include "UMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}

BOOL bSetupPixelFormat(HDC hdc)
{
	PIXELFORMATDESCRIPTOR pfd, *ppfd;
    int pixelformat;

	ppfd = &pfd;

	ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
	ppfd->nVersion = 1;
	ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
	ppfd->dwLayerMask = PFD_MAIN_PLANE;
	ppfd->iPixelType = PFD_TYPE_RGBA;
	ppfd->cColorBits = 16;
	ppfd->cDepthBits = 16;

	ppfd->cAccumBits = 0;
	ppfd->cStencilBits = 0;

    if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
    {
        MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
        return FALSE;
    }
    if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
    {
        MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
        return FALSE;
    }
    return TRUE;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	ghDC = GetDC(Handle);
	if (!bSetupPixelFormat(ghDC)) {
		Close();
    }
	ghRC = wglCreateContext(ghDC);
	wglMakeCurrent(ghDC, ghRC);

	glClearColor(0.0, 255.0, 255.0, 255.0);

	FormResize(Sender);

	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_DEPTH_TEST);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	float p[4]={3,3,3,1}, d[3]={-1,-1,-3};
	glLightfv(GL_LIGHT0,GL_POSITION,p);
	glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
	if(ghRC) {
		wglMakeCurrent(ghDC,0);
		wglDeleteContext(ghRC);
	}
	if(ghDC) {
		ReleaseDC(Handle, ghDC);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
	Draw();
}
//---------------------------------------------------------------------------
void TForm1::Draw()
{
	glClear(GL_DEPTH_BUFFER_BIT |  GL_COLOR_BUFFER_BIT);

	GLUquadricObj *quadObj;
	quadObj = gluNewQuadric();

	gluQuadricDrawStyle(quadObj, GLU_FILL);
	glColor3f(1,0,0);
	gluSphere(quadObj, 3,20,20);
	glRotatef(3, 0,1,0);
	gluDeleteQuadric(quadObj);

  	SwapBuffers(ghDC);
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
	Form1->ClientWidth = Form1->ClientHeight;
	glViewport( 0, 0, Form1->ClientWidth, Form1->ClientHeight); //Определяем размеры области рисование
	glMatrixMode( GL_PROJECTION ); //??? Определение типа матрицы
	glLoadIdentity();
	glOrtho(-5,5, -5,5, -12,12);
	gluLookAt(0,0,5, 0,0,0, 0,1,0);
	glMatrixMode( GL_MODELVIEW );
}
//---------------------------------------------------------------------------
Этот пример реализует рисование 3d сферы.

Ни как не могу разобраться, какие функции отвечают за задание 2d и 3d надо ли вообще что то менять в функциях перед тем как рисовать в Draw() на плоскости или нет.

Прочитал справку, но не могу понять, что задает функция glMatrixMode().

И как я понимаю если что то и надо предварительно менять перед рисованием не в пространстве, а на плоскости, то это надо делать или в этих функциях:
Код:
glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_DEPTH_TEST);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	float p[4]={3,3,3,1}, d[3]={-1,-1,-3};
	glLightfv(GL_LIGHT0,GL_POSITION,p);
	glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
или в этих функциях:

Код:
glMatrixMode( GL_PROJECTION ); //??? Определение типа матрицы
	glLoadIdentity();
	glOrtho(-5,5, -5,5, -12,12);
	gluLookAt(0,0,5, 0,0,0, 0,1,0);
	glMatrixMode( GL_MODELVIEW );
В общем поясните различие в рисование на плоскости и в пространстве.
Andersen1313 вне форума Ответить с цитированием
Старый 11.10.2013, 12:21   #2
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Помогите переделать код, чтобы нарисовать на плоскости треугольник, а дальше я разберусь, что мне делать
Andersen1313 вне форума Ответить с цитированием
Старый 11.10.2013, 13:12   #3
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Или если этот код совершенно не подходит для рисование на плоскости, то дайте полный пример от начала до конца не от glBegin и до glEnd а целиком с подключением библиотеки, установкой контекста и рисованием.. я не могу ни как понять как на плоскости нарисовать..
Andersen1313 вне форума Ответить с цитированием
Старый 11.10.2013, 15:53   #4
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

По памяти накидал, посмотри.
Код:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, Width, Height, 0);


// здесь рисуй 2D


glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
Nuklon вне форума Ответить с цитированием
Старый 15.10.2013, 17:15   #5
darksun
Новичок
Джуниор
 
Регистрация: 15.10.2013
Сообщений: 1
По умолчанию

Цитата:
какие функции отвечают за задание 2d и 3d
glVertex2d(x,y); // координаты для 2d
glVertex3d(x,y,z); // координаты для 3d
darksun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt+OpenGL. Qt "не видит" функции OpenGL EnterFix Qt и кроссплатформенное программирование С/С++ 4 29.01.2013 18:59
OpenGL + C++ GuardianSpirit Visual C++ 1 12.01.2013 07:45
OpenGL artscorp Мультимедиа в Delphi 1 17.04.2012 22:31
OpenGl Valera Помощь студентам 3 09.11.2011 23:49
OpenGl Freer Помощь студентам 1 25.05.2009 17:57