Iâve read up on the gluPerspective function and decided none of the parameters were causing this âreceeding viewâ.
I changed all the parameters anyways (individually) just in case, and other than changing the view angles, and distance from object, the âreceeding viewâ remained.
I am posting my code in the hopes that someone can see what is happening and help me out.
(Iâve tried to figure it out myself, but I am honestly stuck)
The code below is complete and will build in an empty VC++ project.
edit
The code tags seems to have deleted all the blank lines between functions, etc.
It doesnât look this confusing in my code editor.
#include <windows.h> // must include this before GL/gl.h
#include <GL/gl.h> // OpenGL header file
#include <GL/glu.h> // OpenGL utilities header file
#include <stdio.h>
#pragma comment(lib, "opengl32.lib") // This is our basic software OpenGL library
#pragma comment(lib, "glu32.lib") // This is our glu32 library
enum
{
PAN = 1, // pan state bit
ROTATE, // rotate state bits
ZOOM // zoom state bit
};
HDC hDC; // device context
HPALETTE hPalette = 0; // custom palette (if needed)
GLfloat trans[3]; // current translation
GLfloat rot[2]; // current rotation
bool keys[256];
GLfloat zoom = 0.0f;
GLfloat Vertex[2][12];
GLfloat Length;
LONG WINAPI WindowProc(HWND, UINT, WPARAM, LPARAM);
HWND CreateOpenGLWindow(char* , int, int, int, int, BYTE, DWORD);
void init();
void display();
void reshape(int, int);
static void update(int, int, int, int, int);
static void GenerateCrossSection();
static void GenerateBeam3D();
int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst,
LPSTR lpszCmdLine, int nCmdShow)
{
HGLRC hRC; // opengl context
HWND hWnd; // window
MSG msg; // message
DWORD buffer = PFD_DOUBLEBUFFER; // buffering type
BYTE color = PFD_TYPE_RGBA; // color type
hWnd = CreateOpenGLWindow("OpenGL", 0, 0, 256, 256, color, buffer);
if (hWnd == NULL)
exit(1);
hDC = GetDC(hWnd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
init();
ShowWindow(hWnd, nCmdShow);
while(GetMessage(&msg, hWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
wglMakeCurrent(NULL, NULL);
ReleaseDC(hWnd,hDC);
wglDeleteContext(hRC);
DestroyWindow(hWnd);
if (hPalette) DeleteObject(hPalette);
return msg.wParam;
}
LONG WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static PAINTSTRUCT ps;
static GLuint state = 0; // mouse state flag
static int omx, omy, mx, my;
switch(uMsg)
{
case WM_PAINT:
display();
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_CREATE:
GenerateCrossSection();
return 0;
case WM_SIZE:
reshape(LOWORD(lParam), HIWORD(lParam));
PostMessage(hWnd, WM_PAINT, 0, 0);
return 0;
case WM_CHAR:
switch (wParam)
{
case 27: // "ESC" key
PostQuitMessage(0); // Quit
break;
case 65: // "A" key
zoom +=0.05f; // Zoom In
PostMessage(hWnd, WM_PAINT, 0, 0);
break;
case 90: // "Z" key
zoom -=0.05f; // Zoom Out
PostMessage(hWnd, WM_PAINT, 0, 0);
break;
}
return 0;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
SetCapture(hWnd);
mx = LOWORD(lParam);
my = HIWORD(lParam);
if (uMsg == WM_LBUTTONDOWN)
state |= PAN;
if (uMsg == WM_RBUTTONDOWN)
state |= ROTATE;
return 0;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
ReleaseCapture();
state = 0;
return 0;
case WM_MOUSEMOVE:
if (state)
{
omx = mx;
omy = my;
mx = LOWORD(lParam);
my = HIWORD(lParam);
if(mx & 1 << 15) mx -= (1 << 16);
if(my & 1 << 15) my -= (1 << 16);
update(state, omx, mx, omy, my);
PostMessage(hWnd, WM_PAINT, 0, 0);
}
return 0;
case WM_PALETTECHANGED:
if (hWnd == (HWND)wParam)
break;
case WM_QUERYNEWPALETTE:
if (hPalette)
{
UnrealizeObject(hPalette);
SelectPalette(hDC, hPalette, FALSE);
RealizePalette(hDC);
return TRUE;
}
return FALSE;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
HWND
CreateOpenGLWindow(char* title, int x, int y, int width, int height,
BYTE type, DWORD flags)
{
int n, pf;
HWND hWnd;
WNDCLASS wc;
LOGPALETTE* lpPal;
PIXELFORMATDESCRIPTOR pfd;
static HINSTANCE hInstance = 0;
if (!hInstance)
{
hInstance = GetModuleHandle(NULL);
wc.style = CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL";
if (!RegisterClass(&wc))
{
MessageBox(NULL, "RegisterClass() failed: "
"Cannot register window class.", "Error", MB_OK);
return NULL;
}
}
hWnd = CreateWindow("OpenGL", title, WS_OVERLAPPEDWINDOW |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
x, y, width, height, NULL, NULL, hInstance, NULL);
if (hWnd == NULL)
{
MessageBox(NULL, "CreateWindow() failed: Cannot create a window.",
"Error", MB_OK);
return NULL;
}
hDC = GetDC(hWnd);
memset(&pfd, 0, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | flags;
pfd.iPixelType = type;
pfd.cDepthBits = 32;
pfd.cColorBits = 32;
pf = ChoosePixelFormat(hDC, &pfd);
if (pf == 0)
{
MessageBox(NULL, "ChoosePixelFormat() failed: "
"Cannot find a suitable pixel format.", "Error", MB_OK);
return 0;
}
if (SetPixelFormat(hDC, pf, &pfd) == FALSE)
{
MessageBox(NULL, "SetPixelFormat() failed: "
"Cannot set format specified.", "Error", MB_OK);
return 0;
}
DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
ReleaseDC(hWnd,hDC);
return hWnd;
}
void init()
{
glEnable(GL_DEPTH_TEST);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(trans[0], trans[1], trans[2]);
glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
glScalef(.05,.05,.05); // scale to 5%
glTranslatef(0.0f, -0.0f, zoom);
GenerateBeam3D(); // my cap & extrude function
glPopMatrix();
glFlush();
SwapBuffers(hDC); // nop if singlebuffered
}
void reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
MessageBox(NULL, "Pause!", "Debug", MB_OK);
gluPerspective(60.0, (float)width/height, 0.001, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -3.0f);
}
static void update(int state, int ox, int nx, int oy, int ny)
{
int dx = ox - nx;
int dy = ny - oy;
switch(state)
{
case PAN:
trans[0] -= dx / 100.0f;
trans[1] -= dy / 100.0f;
break;
case ROTATE:
rot[0] += (dy * 180.0f) / 500.0f;
rot[1] -= (dx * 180.0f) / 500.0f;
#define clamp(x) x = x > 360.0f ? x-360.0f : x < -360.0f ? x+=360.0f : x
clamp(rot[0]);
clamp(rot[1]);
break;
case ZOOM:
trans[2] -= (dx+dy) / 100.0f;
break;
}
}
static void GenerateCrossSection()
{
Length=20;
Vertex[0][ 0] = 7; Vertex[1][ 0] = 9;
Vertex[0][ 1] = -7; Vertex[1][ 1] = 9;
Vertex[0][ 2] = -7; Vertex[1][ 2] = 6;
Vertex[0][ 3] = -1; Vertex[1][ 3] = 6;
Vertex[0][ 4] = -1; Vertex[1][ 4] = -6;
Vertex[0][ 5] = -7; Vertex[1][ 5] = -6;
Vertex[0][ 6] = -7; Vertex[1][ 6] = -9;
Vertex[0][ 7] = 7; Vertex[1][ 7] = -9;
Vertex[0][ 8] = 7; Vertex[1][ 8] = -6;
Vertex[0][ 9] = 1; Vertex[1][ 9] = -6;
Vertex[0][10] = 1; Vertex[1][10] = 6;
Vertex[0][11] = 7; Vertex[1][11] = 6;
}
static void GenerateBeam3D()
{
glBegin(GL_QUADS);
//glBegin(GL_POLYGON);
// Cap
// front face
glColor3f(0.0f,1.0f,0.0f); // green
glVertex3f(Vertex[0][ 0],Vertex[1][ 0],(Length/2));
glVertex3f(Vertex[0][ 1],Vertex[1][ 1],(Length/2));
glVertex3f(Vertex[0][ 2],Vertex[1][ 2],(Length/2));
glVertex3f(Vertex[0][11],Vertex[1][11],(Length/2));
glVertex3f(Vertex[0][ 3],Vertex[1][ 3],(Length/2));
glVertex3f(Vertex[0][ 4],Vertex[1][ 4],(Length/2));
glVertex3f(Vertex[0][ 9],Vertex[1][ 9],(Length/2));
glVertex3f(Vertex[0][10],Vertex[1][10],(Length/2));
glVertex3f(Vertex[0][ 8],Vertex[1][ 8],(Length/2));
glVertex3f(Vertex[0][ 5],Vertex[1][ 5],(Length/2));
glVertex3f(Vertex[0][ 6],Vertex[1][ 6],(Length/2));
glVertex3f(Vertex[0][ 7],Vertex[1][ 7],(Length/2));
// back face
glColor3f(0.0f,1.0f,0.0f); // green
glVertex3f(Vertex[0][ 0],Vertex[1][ 0],-(Length/2));
glVertex3f(Vertex[0][ 1],Vertex[1][ 1],-(Length/2));
glVertex3f(Vertex[0][ 2],Vertex[1][ 2],-(Length/2));
glVertex3f(Vertex[0][11],Vertex[1][11],-(Length/2));
glVertex3f(Vertex[0][ 3],Vertex[1][ 3],-(Length/2));
glVertex3f(Vertex[0][ 4],Vertex[1][ 4],-(Length/2));
glVertex3f(Vertex[0][ 9],Vertex[1][ 9],-(Length/2));
glVertex3f(Vertex[0][10],Vertex[1][10],-(Length/2));
glVertex3f(Vertex[0][ 8],Vertex[1][ 8],-(Length/2));
glVertex3f(Vertex[0][ 5],Vertex[1][ 5],-(Length/2));
glVertex3f(Vertex[0][ 6],Vertex[1][ 6],-(Length/2));
glVertex3f(Vertex[0][ 7],Vertex[1][ 7],-(Length/2));
// extrude
// top flange outside
glColor3f(0.0f,0.0f,1.0f); // blue
glVertex3f(Vertex[0][ 0],Vertex[1][ 0], (Length/2));
glVertex3f(Vertex[0][ 0],Vertex[1][ 0],-(Length/2));
glVertex3f(Vertex[0][ 1],Vertex[1][ 1],-(Length/2));
glVertex3f(Vertex[0][ 1],Vertex[1][ 1], (Length/2));
// top flange left side
glColor3f(1.0f,1.0f,0.0f); // yellow
glVertex3f(Vertex[0][ 1],Vertex[1][ 1], (Length/2));
glVertex3f(Vertex[0][ 1],Vertex[1][ 1],-(Length/2));
glVertex3f(Vertex[0][ 2],Vertex[1][ 2],-(Length/2));
glVertex3f(Vertex[0][ 2],Vertex[1][ 2], (Length/2));
// top flange underside left
glColor3f(1.0f,0.0f,1.0f); // violet
glVertex3f(Vertex[0][ 2],Vertex[1][ 2], (Length/2));
glVertex3f(Vertex[0][ 2],Vertex[1][ 2],-(Length/2));
glVertex3f(Vertex[0][ 3],Vertex[1][ 3],-(Length/2));
glVertex3f(Vertex[0][ 3],Vertex[1][ 3], (Length/2));
// web left side
glColor3f(1.0f,0.5f,0.0f); // orange
glVertex3f(Vertex[0][ 3],Vertex[1][ 3], (Length/2));
glVertex3f(Vertex[0][ 3],Vertex[1][ 3],-(Length/2));
glVertex3f(Vertex[0][ 4],Vertex[1][ 4],-(Length/2));
glVertex3f(Vertex[0][ 4],Vertex[1][ 4], (Length/2));
// btm flange inside left
glColor3f(1.0f,0.0f,1.0f); // violet
glVertex3f(Vertex[0][ 4],Vertex[1][ 4], (Length/2));
glVertex3f(Vertex[0][ 4],Vertex[1][ 4],-(Length/2));
glVertex3f(Vertex[0][ 5],Vertex[1][ 5],-(Length/2));
glVertex3f(Vertex[0][ 5],Vertex[1][ 5], (Length/2));
// btm flange left side
glColor3f(1.0f,1.0f,0.0f); // yellow
glVertex3f(Vertex[0][ 5],Vertex[1][ 5], (Length/2));
glVertex3f(Vertex[0][ 5],Vertex[1][ 5],-(Length/2));
glVertex3f(Vertex[0][ 6],Vertex[1][ 6],-(Length/2));
glVertex3f(Vertex[0][ 6],Vertex[1][ 6], (Length/2));
// btm flange outside
glColor3f(0.0f,0.0f,1.0f); // blue
glVertex3f(Vertex[0][ 6],Vertex[1][ 6], (Length/2));
glVertex3f(Vertex[0][ 6],Vertex[1][ 6],-(Length/2));
glVertex3f(Vertex[0][ 7],Vertex[1][ 7],-(Length/2));
glVertex3f(Vertex[0][ 7],Vertex[1][ 7], (Length/2));
// btm flange right side
glColor3f(1.0f,1.0f,0.0f); // yellow
glVertex3f(Vertex[0][ 7],Vertex[1][ 7], (Length/2));
glVertex3f(Vertex[0][ 7],Vertex[1][ 7],-(Length/2));
glVertex3f(Vertex[0][ 8],Vertex[1][ 8],-(Length/2));
glVertex3f(Vertex[0][ 8],Vertex[1][ 8], (Length/2));
// btm flange inside right
glColor3f(1.0f,0.0f,1.0f); // violet
glVertex3f(Vertex[0][ 8],Vertex[1][ 8], (Length/2));
glVertex3f(Vertex[0][ 8],Vertex[1][ 8],-(Length/2));
glVertex3f(Vertex[0][ 9],Vertex[1][ 8],-(Length/2));
glVertex3f(Vertex[0][ 9],Vertex[1][ 9], (Length/2));
// web right side
glColor3f(1.0f,0.5f,0.0f); // orange
glVertex3f(Vertex[0][ 9],Vertex[1][ 9], (Length/2));
glVertex3f(Vertex[0][ 9],Vertex[1][ 9],-(Length/2));
glVertex3f(Vertex[0][10],Vertex[1][10],-(Length/2));
glVertex3f(Vertex[0][10],Vertex[1][10], (Length/2));
// top flange inside right
glColor3f(1.0f,0.0f,1.0f); // violet
glVertex3f(Vertex[0][10],Vertex[1][10], (Length/2));
glVertex3f(Vertex[0][10],Vertex[1][10],-(Length/2));
glVertex3f(Vertex[0][11],Vertex[1][11],-(Length/2));
glVertex3f(Vertex[0][11],Vertex[1][11], (Length/2));
// top flange right side
glColor3f(1.0f,1.0f,0.0f); // yellow
glVertex3f(Vertex[0][11],Vertex[1][11], (Length/2));
glVertex3f(Vertex[0][11],Vertex[1][11],-(Length/2));
glVertex3f(Vertex[0][ 0],Vertex[1][ 0],-(Length/2));
glVertex3f(Vertex[0][ 0],Vertex[1][ 0], (Length/2));
glEnd();
}