Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Mi primer Cubo 3D con OpenGL y GLEW Library (https://www.clubdelphi.com/foros/showthread.php?t=96903)

navbuoy 18-10-2024 15:54:02

Mi primer Cubo 3D con OpenGL y GLEW Library
 
Excitante, por fin consegui hacer algo en 3D que siempre habia sido una cosa que me motivaba pero no acababa de pillarle el tranquillo

asi que ahora con OpenGL y GLEW lo consegui y sin demasiado esfuerzo

aqui teneis el codigo fuente (compila perfecto en C++ Builder y se ve el cubo incluso rotando en 3D)

Unit1.h:

Código:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TPanel *Panel1;
        void __fastcall FormDestroy(TObject *Sender);
private:        // User declarations
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
void __fastcall Timer1Timer(TObject *Sender);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Unit1.cpp:

Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>

#include <GL/glew.h>
// Incluir GLFW
#include <GL/glfw3.h>

// Incluir GLM
#include <glm/glm.hpp>

using namespace glm;

#include <GL/glut.h>
#include <GL/gl.h>    // OpenGL
#include <GL/glu.h>  // Utilidades de OpenGL

//Estos include puede que no sean del todo necesarios ya que los planeo usar para cuando texturice
#include <iostream>
#include <fstream> // Necesario para std::ifstream
#include <vector>  // Necesario para std::vector
#include <algorithm> // Necesario para std::swap
#include <string>


#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

// Variables globales para el manejo del contexto de OpenGL
HDC hdc;
HGLRC hrc;


void InitializeOpenGL(TPanel* Panel);
void DrawCube(void);
void CloseOpenGL(void);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  InitializeOpenGL(Panel1);

          TTimer *Timer1 = new TTimer(this);
        Timer1->Interval = 16;  // Aproximadamente 60 fps
        Timer1->OnTimer = Timer1Timer;
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    DrawCube();  // Dibuja el cubo cada vez que el temporizador se activa
}
//---------------------------------------------------------------------------
 void InitializeOpenGL(TPanel* Panel) {
    hdc = GetDC(Panel->Handle);

        PIXELFORMATDESCRIPTOR pfd = {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        24,
        0, 0, 0, 0, 0, 0,
        0,
                0,
        0, 0, 0, 0,
        32,
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0, 0, 0
        };

    int iPixelFormat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, iPixelFormat, &pfd);

    hrc = wglCreateContext(hdc);
    wglMakeCurrent(hdc, hrc);

        GLenum err = glewInit();
    if (GLEW_OK != err) {
        ShowMessage("Error al inicializar GLEW");
        return;
    }

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    gluPerspective(45.0, (double)Panel->Width / (double)Panel->Height, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);
}

void DrawCube(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    // Trasladar y rotar el cubo
    glTranslatef(0.0f, 0.0f, -5.0f);
    static float angleX = 0.0f, angleY = 0.0f;
    glRotatef(angleX, 1.0f, 0.0f, 0.0f);  // Rotación en el eje X
    glRotatef(angleY, 0.0f, 1.0f, 0.0f);  // Rotación en el eje Y

    // Actualizar ángulos para la animación
        angleX += 1.0f;
    angleY += 1.0f;

    // Dibujo del cubo
    glBegin(GL_QUADS);

    // Cara frontal (rojo)
    glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-0.5f, -0.5f, 0.5f);
    glVertex3f( 0.5f, -0.5f, 0.5f);
    glVertex3f( 0.5f,  0.5f, 0.5f);
    glVertex3f(-0.5f,  0.5f, 0.5f);

    // Cara trasera (verde)
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-0.5f, -0.5f, -0.5f);
        glVertex3f(-0.5f,  0.5f, -0.5f);
    glVertex3f( 0.5f,  0.5f, -0.5f);
    glVertex3f( 0.5f, -0.5f, -0.5f);

    // Cara izquierda (azul)
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(-0.5f, -0.5f,  0.5f);
    glVertex3f(-0.5f,  0.5f,  0.5f);
        glVertex3f(-0.5f,  0.5f, -0.5f);
    glVertex3f(-0.5f, -0.5f, -0.5f);

    // Cara derecha (amarillo)
    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f(0.5f, -0.5f,  0.5f);
    glVertex3f(0.5f, -0.5f, -0.5f);
    glVertex3f(0.5f,  0.5f, -0.5f);
        glVertex3f(0.5f,  0.5f,  0.5f);

        // Cara superior (magenta)
        glColor3f(1.0f, 0.0f, 1.0f);
        glVertex3f(-0.5f,  0.5f,  0.5f);
        glVertex3f( 0.5f,  0.5f,  0.5f);
        glVertex3f( 0.5f,  0.5f, -0.5f);
        glVertex3f(-0.5f,  0.5f, -0.5f);

        // Cara inferior (cian)
        glColor3f(0.0f, 1.0f, 1.0f);
        glVertex3f(-0.5f, -0.5f,  0.5f);
        glVertex3f(-0.5f, -0.5f, -0.5f);
        glVertex3f( 0.5f, -0.5f, -0.5f);
        glVertex3f( 0.5f, -0.5f,  0.5f);

        glEnd();

        // Intercambiar buffers
        SwapBuffers(hdc);
}

void CloseOpenGL(void) {
        wglMakeCurrent(NULL, NULL);
        wglDeleteContext(hrc);
        ReleaseDC(NULL, hdc);
}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
        CloseOpenGL();  // Cierra OpenGL al cerrar el formulario
}
//---------------------------------------------------------------------------


Utilizo un TPanel como contenedor del dibujado de la salida de pantalla:

aqui se ve como salio el EXE (se ve girando en 3D en funcionamiento)

os adjunto los includes (copiar en donde tengais los include de Embarcadero compiler en Archivos de programa (x86)/Embarcadero/studio/versioncompilador/include:

https://www.quazardev.net/Stardust/i...s_GL_y_glm.rar



La franja horaria es GMT +2. Ahora son las 20:11:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi