2012-08-09 75 views
0

我试图将3D转换为2D坐标。我知道我需要使用gluProject()。但我正面临着麻烦。我需要使用像素坐标在OpenGL VC++初学者中设置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(); 
} 

回答

3

您可以使用下面的代码里面DrawGLScene()InitGL()后。

它不需要任何其他初始化。

但是请确保在投影的任何改变之前(例如在你回来的coords的位置上绘制2D投影)执行它。

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); 

Description of gluProject parameters

An example of gluUnproject where I have the code from

+0

非常感谢你,但你可以帮助我做一些拉伸的例子吗? – 2012-08-09 21:37:21