Настройка gluProject() в начинающих OpenGL VC++

Я пытаюсь конвертировать 3D в 2D координаты. и я понимаю, что мне нужно использовать gluProject(), Но я сталкиваюсь с проблемами при настройке. Мне нужно использовать координаты пикселей

Мне нужна помощь в InitGL() как я могу правильно его инициализировать. Также в DrawGLScene() как можно это использовать? Мне нужно сохранить z переменная для создания слоев, поэтому я не хочу его отключать.

Это мой код:

#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#if defined(__APPLE__) && defined(__MACH__)
#include <OpenGL/gl.h>  // Header File For The OpenGL32 Library
#include <OpenGL/glu.h> // Header File For The GLu32 Library
#else
#include <GL/gl.h>  // Header File For The OpenGL32 Library
#include <GL/glu.h> // Header File For The GLu32 Library
#endif

#include "SDL.h"   // SDL library for managing input and window management (multipltform)
#include "SOIL.h"  // SOIL library for loading textures (multiplatform)

const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 480;
const char* WINDOW_TITLE = "RB Game Engine";

float position=0;
GLuint  texture[1];  // number of texture = 1


/* A general OpenGL initialization function.  Sets all of the initial parameters. */
void InitGL(int Width, int Height)          // We call this right after our OpenGL window is created.
{
  LoadGLTextures();                                 // Jump To Texture Loading Routine ( NEW )
  glEnable(GL_TEXTURE_2D);                          // Enable Texture Mapping ( NEW )
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // This Will Clear The Background Color To Black
  glClearDepth(1.0);                // Enables Clearing Of The Depth Buffer
  glDepthFunc(GL_LESS);             // The Type Of Depth Test To Do
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // Enables Smooth Color Shading

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();             // Reset The Projection Matrix

  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window

  glMatrixMode(GL_MODELVIEW);
}

/* The main drawing function. */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // Clear The Screen And The Depth Buffer
  glLoadIdentity();             // Reset The View


  glTranslatef(0.0f,0.0f,-6.0f);                // Move Right 3 Units
  glBindTexture(GL_TEXTURE_2D, texture[0]); 
  // draw a square (quadrilateral)
  glBegin(GL_QUADS);                // start drawing a polygon (4 sided)
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f+position, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f+position, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f+position,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f+position,  1.0f,  1.0f);
  glEnd();                  // done with the polygon



  // swap buffers to display, since we're double buffered.
  SDL_GL_SwapBuffers();
}

1 ответ

Вы можете использовать код ниже внутри DrawGLScene(), после InitGL(),

Это не потребует никакой другой инициализации.

Но убедитесь, что вы выполняете его перед любым изменением проекции (например, 2D проекция для рисования на позиции coords ты вернешься).

GLdouble x, y, z; // target 2d coords (z is 'unused')
GLdouble coords[] = { 1.0, 1.0, 1.0 }; // current 3d coords

GLdouble model_view[16];
glGetDoublev(GL_MODELVIEW_MATRIX, model_view);

GLdouble projection[16];
glGetDoublev(GL_PROJECTION_MATRIX, projection);

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

// get window coords based on 3D coordinates
gluProject( coords[0], coords[1], coords[2],
            model_view, projection, viewport,
            &x, &y, &z);

Описание параметров gluProject

Пример gluUnproject, где у меня есть код из

Другие вопросы по тегам