A
Andersen1313
В общем вот код(не мой):
Этот пример реализует рисование 3d сферы.
Ни как не могу разобраться, какие функции отвечают за задание 2d и 3d надо ли вообще что то менять в функциях перед тем как рисовать в Draw() на плоскости или нет.
Прочитал справку, но не могу понять, что задает функция glMatrixMode().
И как я понимаю если что то и надо предварительно менять перед рисованием не в пространстве, а на плоскости, то это надо делать или в этих функциях:
или в этих функциях:
В общем поясните различие в рисование на плоскости и в пространстве.
Добавлено: Если можно переделайте этот код в рисование треугольника на плоскости, а дальше я сам разберусь, что и как делается
C++:
//---------------------------------------------------------------------------
#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().
И как я понимаю если что то и надо предварительно менять перед рисованием не в пространстве, а на плоскости, то это надо делать или в этих функциях:
C++:
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);
или в этих функциях:
C++:
glMatrixMode( GL_PROJECTION ); //??? Определение типа матрицы
glLoadIdentity();
glOrtho(-5,5, -5,5, -12,12);
gluLookAt(0,0,5, 0,0,0, 0,1,0);
glMatrixMode( GL_MODELVIEW );
В общем поясните различие в рисование на плоскости и в пространстве.
Добавлено: Если можно переделайте этот код в рисование треугольника на плоскости, а дальше я сам разберусь, что и как делается