c++ - OpenGL VC++ 初学者中的 gluProject() 设置

标签 c++ visual-c++ opengl 2d glu

我正在尝试将 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();
}

最佳答案

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

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

但请确保在任何投影更改之前执行它(例如,用于在您返回的坐标位置上绘制的 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

关于c++ - OpenGL VC++ 初学者中的 gluProject() 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11891481/

相关文章:

c++ - 如何将 .so 文件链接到 cpp 程序

winforms - 错误 C2039 : 'Dispose' : is not a member of 'System::Windows::Forms::ErrorProvider'

C++ 函数在不同类中不起作用

c++ - 多个值可以隐式转换为一个对象吗?

c++ - 在 VC++ 中将常量 char 分配给结构内部的字符数组

OpenGL 透明度/半透明

c++ - 获取 glFrustum 的坐标

使用 DirectX 或 OpenGL 的 C# 2D 矢量图形游戏?

c++ - 如何编写使用临时容器的范围管道?

c++ - int[ ] 中未分配的值