基于openGl的三维旋转魔方源代码/*
* This Code Was Created By Jeff Molofee 2000
* A HUGE Thanks To Fredric Echols For Cleaning Up
* And Optimizing The Base Code, Making It More Flexible!
* If You've Found This Code Useful, Please Let Me Know.
* Visit My Site At https://www.doczj.com/doc/6a2271710.html,
*/
// Header File For Standard Input/Output
#include "MoFang.h"
HDC hDC=NULL; // Private GDI Device Context
HGLRC hRC=NULL; // Permanent Rendering Context
HWND hWnd=NULL; // Holds Our Window Handle
HINSTANCE h Instance; // Holds The Instance Of The Application
bool keys[256]; // Array Used For The Keyboard Routine
bool active=TRUE; // Window Active Flag Set To TRUE By Default
bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
GLfloat xrot; // X Rotation ( NEW )
GLfloat yrot; // Y Rotation ( NEW )
GLfloat zrot; // Z Rotation ( NEW )
GLfloat RX;
GLfloat RY;
GLuint texture[24]; // Storage For One Texture ( NEW )
GLboolean b_RX,b_RY;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
FILE *File=NULL; // File Handle
if (!Filename) // Make Sure A Filename Was Given
{
return NULL; // If Not Return NULL }
File=fopen(Filename,"r"); // Check To See If The File Exists
if (File) // Does The File Exist?
{
fclose(File); // Close The Handle
return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer }
return NULL; // If Load Failed Return NULL
}
int LoadGLTextures() // Load Bitmaps And Convert To Textures {
int Status=FALSE; // Status Indicator
AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
{
Status=TRUE; // Set The Status To TRUE
glGenTextures(1, &texture[0]); // Create The Texture
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) // If Texture Exists
{
if (TextureImage[0]->data) // If Texture Image Exists
{
free(TextureImage[0]->data); // Free The Texture Image Memory }
free(TextureImage[0]); // Free The Image Structure }
return Status; // Return The Status
}
int LoadGLTextures(char *file,int index) // Load Bitmaps And Convert To Textures
{
int Status=FALSE; // Status Indicator
AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP(file))
{
Status=TRUE; // Set The Status To TRUE
glGenTextures(1, &texture[index]); // Create The Texture
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[index]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) // If Texture Exists
{
if (TextureImage[0]->data) // If Texture Image Exists
{
free(TextureImage[0]->data); // Free The Texture Image Memory }
free(TextureImage[0]); // Free The Image Structure }
return Status; // Return The Status
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
{
if (height==0) // Prevent A Divide By Zero By
{
height=1; // Making Height Equal One }
glViewport(0,0,width,height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
int InitGL(GLvoid) // All Setup For OpenGL Goes Here {
if (!LoadGLTextures("Data/y1.bmp",0)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y2.bmp",1)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y3.bmp",2)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y4.bmp",3)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y5.bmp",4)) // Jump To Texture Loading
Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y6.bmp",5)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y7.bmp",6)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
if (!LoadGLTextures("Data/y8.bmp",7)) // Jump To Texture Loading Routine ( NEW )
{
return FALSE; // If Texture Didn't Load Return FALSE }
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}
void DrawObject1(GLfloat X,GLfloat Y,GLfloat Z)
{
glBegin(GL_QUADS);
// Front Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);
// Back Face
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);
// Top Face
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);
// Bottom Face
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);
// Right face
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);
// Left Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);
glEnd();
}
void DrawObject(int ID)
{
stPoint *CubePoint = Cube[ID].CubePoint;
glBegin(GL_QUADS);
// Front Face
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[0].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[1].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[2].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[3].p);
// Back Face
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[4].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[5].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[6].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[7].p);
// Top Face
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[5].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[3].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[2].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[6].p);
// Bottom Face
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[4].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[7].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[1].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[0].p);
// Right face
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[7].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[6].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[2].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[1].p);
// Left Face
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[4].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[0].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[3].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[5].p);
glEnd();
}
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
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,-12.0f);
glTranslatef(RX,0.0f,0.0f);
glTranslatef(0.0,RY,0.0);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);
//
glBindTexture(GL_TEXTURE_2D, texture[0]);
DrawObject(0);
glBindTexture(GL_TEXTURE_2D, texture[1]);
DrawObject(1);
glBindTexture(GL_TEXTURE_2D, texture[2]);
DrawObject(2);
glBindTexture(GL_TEXTURE_2D, texture[3]);
DrawObject(3);
glBindTexture(GL_TEXTURE_2D, texture[4]);
DrawObject(4);
glBindTexture(GL_TEXTURE_2D, texture[5]);
DrawObject(5);
glBindTexture(GL_TEXTURE_2D, texture[6]);
DrawObject(6);
glBindTexture(GL_TEXTURE_2D, texture[7]);
DrawObject(7);/**/
xrot+=0.15f;
yrot+=0.1f;
zrot+=0.2f;
return TRUE; // Keep Going
}
GLvoid KillGLWindow(GLvoid) // Properly Kill The Window
{
if (fullscreen) // Are We In Fullscreen Mode?
{
ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop
ShowCursor(TRUE); // Show Mouse Pointer }
if (hRC) // Do We Have A Rendering Context?
{
if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts?
{
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?
{
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // Set RC To NULL }
if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC
{
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // Set DC To NULL }
if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window?
{
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // Set hWnd To NULL }
if (!UnregisterClass("OpenGL",hInstance)) // Are We Able To Unregister Class
{
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hInstance=NULL; // Set hInstance To NULL }
}
/* This Code Creates Our OpenGL Window. Parameters Are: *
* title - Title To Appear At The Top Of The Window *
* width - Width Of The GL Window Or Fullscreen Mode *
* height - Height Of The GL Window Or Fullscreen Mode *
* bits - Number Of Bits To Use For Color (8/16/24/32) *
* fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat; // Holds The Results After Searching For A Match
WNDCLASS w c; // Windows Class Structure
DWORD dwExStyle; // Window Extended Style
DWORD dwStyle; // Window Style
RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values
WindowRect.left=(long)0; // Set Left Value To 0
WindowRect.right=(long)width; // Set Right Value To Requested Width
WindowRect.top=(long)0; // Set Top Value To 0
WindowRect.bottom=(long)height; // Set Bottom Value To Requested Height
fullscreen=fullscreenflag; // Set The Global Fullscreen Flag
hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window.
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages wc.cbClsExtra = 0; // No Extra Window Data
wc.cbWndExtra = 0; // No Extra Window Data
wc.hInstance = hInstance; // Set The Instance
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer
wc.hbrBackground = NULL; // No Background Required For GL
wc.lpszMenuName = NULL; // We Don't Want A Menu
wc.lpszClassName = "OpenGL"; // Set The Class Name
if (!RegisterClass(&wc)) // Attempt To Register The Window Class
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE }
if (fullscreen) // Attempt Fullscreen Mode?
{
DEVMODE dmScreenSettings; // Device Mode
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure
dmScreenSettings.dmPelsWidth = width; // Selected Screen Width
dmScreenSettings.dmPelsHeight = height; // Selected Screen Height
dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.
if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE; // Windowed Mode Selected. Fullscreen = FALSE
}
else
{
// Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
return FALSE; // Return FALSE
}
}
}
if (fullscreen) // Are We Still In Fullscreen Mode?
{
dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
dwStyle=WS_POPUP; // Windows Style
ShowCursor(FALSE); // Hide Mouse Pointer }
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style }
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size
// Create The Window
if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window
"OpenGL", // Class Name
title, // Window Title
dwStyle | // Defined Window Style
WS_CLIPSIBLINGS | // Required Window Style
WS_CLIPCHILDREN, // Required Window Style
0, 0, // Window Position
WindowRect.right-WindowRect.left, // Calculate Window Width
WindowRect.bottom-WindowRect.top, // Calculate Window Height
NULL, // No Parent Window
NULL, // No Menu
hInstance, // Instance
NULL))) // Dont Pass Anything To WM_CREATE
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be {
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
bits, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored };
if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
ShowWindow(hWnd,SW_SHOW); // Show The Window
SetForegroundWindow(hWnd); // Slightly Higher Priority
SetFocus(hWnd); // Sets Keyboard Focus To The Window
ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen
reset_model();
if (!InitGL()) // Initialize Our Newly Created GL Window {
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
return TRUE; // Success
}
static int iii=0;
LRESULT CALLBACK WndProc( HWND hWnd, // Handle For This Window
UINT uMsg, // Message For This Window
WPARAM wParam, // Additional Message Information
LPARAM lParam) // Additional Message Information {
switch (uMsg) // Check For Windows Messages
{
case WM_ACTIVATE: // Watch For Window Activate Message
{
if (!HIWORD(wParam)) // Check Minimization State
{
active=TRUE; // Program Is Active
}
else
{
active=FALSE; // Program Is No Longer Active
}
return 0; // Return To The Message Loop }
case WM_SYSCOMMAND: // Intercept System Commands
{
switch (wParam) // Check System Calls
{
case SC_SCREENSAVE: // Screensaver Trying To Start?
case SC_MONITORPOWER: // Monitor Trying To Enter Powersave?
return 0; // Prevent From Happening
}
break; // Exit
}
case WM_CLOSE: // Did We Receive A Close Message?
{
PostQuitMessage(0); // Send A Quit Message
return 0; // Jump Back
}
case WM_KEYDOWN: // Is A Key Being Held Down?
{
keys[wParam] = TRUE; // If So, Mark It As TRUE
return 0; // Jump Back
}
case WM_KEYUP: // Has A Key Been Released?
{
keys[wParam] = FALSE; // If So, Mark It As FALSE
return 0; // Jump Back
}
case WM_SIZE: // Resize The OpenGL Window
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height
return 0; // Jump Back
}
case WM_TIMER:
{
if(rotAngle != 0)
{
if(rotZ)
Rotate_ZM();
if(rotY)
Rotate_YM();
if(rotX)
Rotate_XM();
}
}
}
// Pass All Unhandled Messages To DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
if( idEvent==2)
{
srand(dwTime);
int r = rand();
if( r%6==0)
enable_X_roatate(1);
else if( r%6==1)
enable_Y_roatate(1);
else if( r%6==2)
enable_Z_roatate(1);
else if( r%6==3)
enable_X_roatate(-1);
else if( r%6==4)
enable_Y_roatate(-1);
else if( r%6==5)
enable_Z_roatate(-1);
}
}
VOID CALLBACK CubeWalk(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
if( idEvent==3)
{
/*
int i = RX*100;
if( i==560)
Vx = -0.02;
else if( i==-560)
Vx = 0.02;
RX += Vx;*/
}
}
int WINAPI WinMain( HINSTANCE h Instance, // Instance
HINSTANCE h PrevInstance, // Previous Instance
LPSTR lpCmdLine, // Command Line Parameters
int nCmdShow) // Window Show State
{
MSG msg; // Windows Message Structure
BOOL d one=FALSE; // Bool Variable To Exit Loop
// Ask The User Which Screen Mode They Prefer
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE; // Windowed Mode
}
// Create Our OpenGL Window
if (!CreateGLWindow("3D MagicCube-杨文涛",1280,768,16,fullscreen))
{
return 0; // Quit If Window Was Not Created }
::SetTimer(hWnd,1,10,NULL);
::SetTimer(hWnd,2,1500,TimerProc);
::SetTimer(hWnd,3,10,CubeWalk);
while(!done) // Loop That Runs While done=FALSE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
{
if (msg.message==WM_QUIT) // Have We Received A Quit Message?
{
done=TRUE; // If So done=TRUE
}
else // If Not, Deal With Window Messages
{
TranslateMessage(&msg); // Translate The Message
DispatchMessage(&msg); // Dispatch The Message
}
}
else // If There Are No Messages
{
// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) // Active? Was There A Quit Received?
{
done=TRUE; // ESC or DrawGLScene Signalled A Quit
}
else // Not Time To Quit, Update Screen
{
SwapBuffers(hDC); // Swap Buffers (Double Buffering) }
if (keys[VK_F1]) // Is F1 Being Pressed?
{
keys[VK_F1]=FALSE; // If So Make Key FALSE
KillGLWindow(); // Kill Our Current Window
fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window
if (!CreateGLWindow("NeHe's Texture Mapping Tutorial",640,480,16,fullscreen))
{
return 0; // Quit If Window Was Not Created
}
}
if(keys[VK_LEFT])
{
keys[VK_LEFT]=FALSE;
RX -= 0.05f;
b_RY = true;
}
if(keys[VK_RIGHT])
{
keys[VK_RIGHT]=FALSE;
RX += 0.05f;
b_RY = true;
}
if(keys[VK_UP])
{
keys[VK_UP]=FALSE;
RY += 0.05f;
b_RX = true;
}
if(keys[VK_DOWN])
{
keys[VK_DOWN]=FALSE;
RY -= 0.05f;
b_RX = true;
}
if(keys[VK_F2])
{
keys[VK_F2] = FALSE;
enable_X_roatate(1);
}
if(keys[VK_F3])
{
keys[VK_F3] = FALSE;
enable_Y_roatate(1);
}
if(keys[VK_F4]) //control Z direction
{
keys[VK_F4] = FALSE;
enable_Z_roatate(1);
}
}
}
// Shutdown
KillGLWindow(); // Kill The Window return (msg.wParam); // Exit The Program
}
#include
XXXXXXXX大学(计算机图形学)实验报告 实验名称利用OpenGL实现图形的平移、旋转、缩放 实验时间年月日 专业姓名学号 预习操作座位号 教师签名总评 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() { glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glV ertex2f( 0.0, -0.2); glV ertex2f( 0.2, 0.0); glV ertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp()
达尔文档 分享知识传播快乐 ABAQUS三维无限元模型建立 本资料为原创 2017年7月达尔文档|DareDoc原创 本教程目的实现无限元单元的建立,从而用于无限元人工边界当中。 现以6m*6m*50m柱体为例,在其四周和底部建立一层无限单元。外层柱尺寸 12m*12m*56m,仅划分一层单元,内部柱体网格划分为1m*1m*1m。建立完后的模型如下图所示。 图1 外层无限元,有限元柱体和无限元-有限元模型 1.创建内部柱体和外部包裹柱体 在part模块中,建立Part-1和Part-2。先创建内部柱体part,在草图中建立一个 6m*6m的方框。 图2 草图中创建方形截面6*6 对截面进行拉伸,深度为50(图3)。同理,创建外部包裹柱体Part-2,截面尺寸为6*6,拉伸深度为56。 图3 拉伸深度及创建的part1 2.对两个柱体进行装配并切割 在装配模块中,将两个part进行装配。装配后,由于两者位置不对,需要将内部柱体的顶面与外部柱体顶面平齐,所以进行平移实例操作。平移完成后,用外部part 减去内部part,形成Part-3。 图4 装配效果图及平移后切割 图5 平移后两柱体位置,切割完成后模型 3.对包裹体切割,重新建立Part 为使后面能够顺利划分网格,需要对形成的Part-3进行切割,重新建立底部。先将part分割成四部分。可采用切割命令,使用三点切割体,如下图所示。 图6 切割part示意图 切割完毕后,底部块已经被切碎,需要通过“创建切削放样”进行删除,并重新建立。创建切削放样时建立两个截面,第一个截面为内部截面,按住shift键选择四个边完成,如图7所示,第二个截面为模型最底部正方形。两个截面创建完成后按确定按钮,底部便被切削去掉(图8左)。此时,模型底部需要根据形状填补,采用“创建实体放样”生成补块,过程与切削放样基本相同,需要注意创建时要勾选“保留内部边界”,否则后续网格不能划分(图8右)。 图6 切割完模型,对模型底部进行切削放样 图7 切削放样时选择的内外两个截面 图8 切削完毕后模型,创建实体放样 4.对无限元和有限元两部分进行装配,网格划分 在装配模块中,对Part-1和Part-3进行装配,装配完毕后进行合并,如图9。
◆由三维实体生成三视图和轴测图简要步骤 1、将三维模型以二维线框显示。 2、进入图纸空间 可选择打印设备、图纸大小,或不选任何选项,按“确定”后,生成一个浮动视口。 删除该浮动视口。 重新设置四个浮动视口:主视、俯视、左视、西南轴测图。 3、创建实体轮廓线 方法见教材P284 4.创建实体轮廓,对四个视口的图形均进行创建实体轮廓的操作 自动生成PH-XX和PVX-X八个图层 4、调整显示在视口中视图的比例 命令:mvsetup↙ 输入选项 [对齐(A)/创建(C)/缩放视口(S)/选项(O)/标题栏(T)/放弃(U)]: s↙ (缩放视口:调整对象在视口中显示的缩放比例因子。缩放比例因子是边界在图纸空间中的比例和图形对象在视口中显示的比例之间的比率。)选择所有视口 设置视口缩放比例因子为:<统一(U)>: 5、将自动生成的前三个PH-XX图层的线型设置成dashed,并修改颜色。 将轴测图的PH-XX图层关闭(一般最后生成轴测图,因此是最后一个PH-XX 图层)。 6、关闭或冻结0层 7、绘制中心线、调整线型比例等 8、标注尺寸(与二维标注方式相同) ◆构建场景的简要步骤 注:所有尺寸仅用于方便作图,做作业时不必标注。 一、台阶 1、绘制台阶平面图,见图1
图1 2、实体拉伸命令制作台阶,相邻两个台阶的高度为25,如图2 图2、 3、布尔并集将各台阶合成一个实体,见图3 图3 二、制作建筑主体
1、新建UCS,如图4 图4 2、制作内空的长方体 (1)用实体长方体命令制作,尺寸长、宽、高为:800,800,450,见图5。 (2)在此长方体内再作长方体,尺寸:长、宽、高为700、700、450,见图6。(3)再用布尔差减去中间长方体。 图5
#pragma comment(lib, "glut32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "opengl32.lib") #include
} glEnd(); glBegin(GL_LINE_LOOP); //绘制原点小圆for (i = 0; i < circle_points; i++) { angle = 2*PI*i/circle_points; glVertex2f(cos(angle), sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPointSize(1); glBegin(GL_POINTS); //绘制秒针刻度 for (i = 0; i < circle_point; i++) { angle = 2*PI*i/circle_point; glVertex2f(95*cos(angle), 95*sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPointSize(5); glBegin(GL_POINTS); //绘制时针刻度 for (i = 0; i < 12; i++) { angle = 2*PI*i/12; glVertex2f(95*cos(angle), 95*sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1.f,1.f,0.f); glPushMatrix(); //绘制秒针 glRotatef(m_rotAngle, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 10.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0, -100, 0); glVertex3f(1, 0, 0); glVertex3f(-1, 0, 0); glEnd(); glPopMatrix(); //绘制分针 glColor3f(1.f,0.f,0.f); glPushMatrix();
(计算机图形学)实验报告 实验名称使用OpenGL画球体 实验时间年月日 专业班级学号姓名 成绩教师评语: 一、实验目的 1、了解并学习open GL的编程; 2、掌握在open GL生成图形的基本思想和基本步骤; 3、使用open GL具体生成简单的三维立体图形; 二、实验原理 简单的说,该实验就是使用数学函数与OpenGL库中的函数实现图形的生成,比如生成球的函数为x=sin(thetar)*cos(phir); y=cos(thetar)*cos(phir); z=sin(phir); 之后在对thetar的值进行定义,使其在某一范围内变化。然后面的集合就生成了我们所需要的球体,但是该实验没有进行光照和材质的设定,所以看起来并不像一个立体的球体形状。其间还需要对OpenGL的编程原理和其所包含的库比较了解。 OpenGL核心库:Windows: OpenGL32。大多数Unix/Linux系统:GL库(libGL.a) OpenGL实用库(Utility Library, GLU):利用OpenGL核心库提供一些功能,从而避免重复编写代码,与窗口系统的连接 OpenGL实用工具库(OpenGL Utility ToolkitLibrary, GLUT),提供所有窗口系统的共同功能,打开窗口,从鼠标和键盘获取输入,弹出菜单,事件驱动。代码可以在平台间移植,但是GLUT缺乏在特定平台上优秀工具包所具有的功能滚动条。 函数的功能glVertex3f(x, y, z),属于GL库参数个数,x, y, z为float。在glVertex3fv(p)中注意每部分的大小写,p为指向float的指针。 绝大多数常数采用#define在头文件gl.h, glu.h和glut.h中定义。注意#include
O p enGL的基本程序结构 常用的程序设计语言,如C、C++、Pascal、Fortran和Java等,都支持OpenGL的开发。这里只讨论C版本下OpenGL的语法。 程序的基本结构 OpenGL程序的基本结构可分为三个部分: 第一部分是初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。这些状态一般都用函数glEnable(???), glDisable(???)来设置,???表示特定的状态。 第二部分设置观察坐标系下的取景模式和取景框位置大小。主要利用了三个函数: 函数void glViewport(left,top,right,bottom):设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示); 函数void glOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体; 函数void gluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积是一个截头锥体。
第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等等。 以上三个部分是OpenGL程序的基本框架,即使移植到使用MFC的Windows程序中,也是如此。只是由于Windows自身有一套显示方式,需要进行一些必要的改动以协调这两种不同显示方式。 OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。 OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。一些函数如glColor* ()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式。如glColor3b(...)、glColor3d(...)、 glColor3f(...)和 glColor3bv(...)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。 OpenGL定义了一些特殊标识符,如GLfloat,GLvoid。它们其实就是C中的 float和void。在gl.h文件中可以看到以下定义: …… typedef float GLfloat; typedef void GLvoid; ……
华中科技大学电子科学与技术系 课程设计报告 ( 2010-- 2011年度第 2 学期) 名称:软件课程设计 题目:基于OpenGL的3D旋转魔方实现 院系: 班级: 学号: 学生姓名: 指导教师: 设计周数: 成绩: 日期:年月日
目录 1.课程设计介绍............................................................................................ (2) 1.1目的.............................................................................................................. (2) 1.2内容.............................................................................................................. (2) 1.3取得的成果 (2) 2.程序分析..................................................................................................... (3) 2.1 程序原理 (3) 2.2 程序流程 (4) 2.3 数据结构 (13) 2.4 重要函数 (13) 3.程序分析与结果演示 (16) 3.1 成果演示 (16) 3.2 程序分析 (17) 4.出现过的问题 (18) 5.心得和小节 (19)
第15章由三维实体生成二维视图 ◆15.1 概述 ◆15.2 由三维实体生成三视图 ◆15.3 由三维实体创建剖视图
15.1 概述基本视图:实体模型 在投影面投影所得到的图形称为基本视图,通常可分为主视图、俯视图、左视图、右视图、仰视图、后视图。图15-1所示的是三维零件图在各个方向的投影视图所得的效果。 (a) 三维视图 (b) 主视图(c) 后视图(d) 俯视图(e) 仰视图(f) 左视图(g) 右视图 图15-1 各个视图
剖视图:假想用一个剖切平面将三维实体剖开,移去观察者和剖面之间的部分,而将留下的部分向投影面投影,所得视图称为剖视图。 剖面图:也叫断面图,假想用剖切面将零件的某处切断,紧画出其断面的图形,称为剖切图。分为移出断面图和重合断面图。 图15-2是剖视图和剖面图的比较。 (a) 阶梯轴(b) 剖面图(c) 剖视图 图15-2 剖面图和剖视图
模型空间是为创建三维模型提供一个广阔的绘图区域,用户可以通过建立UCS,创建各种样式的模型并设置观察视点和消隐、渲染等操作。 而布局空间是用于创建最终的打印布局,是图形输出效果的布置,用户不能通过改变视点的方式来从其他角度观看图形。 它们的主要区别标志是坐标系图标。模型空间中,坐标系图标是一个反映坐标方向的坐标架,而布局空间中,坐标系图标则是三角板形状。利用布局空间可以把在模型空间中绘制的三维模型在同一张图纸上以多个视图的形式排列并打印出来,而在模型空间中则无法实现这一点。
15.2 由三维实体生成三视图 AutoCAD将三维实体模型生成三视图的方法大致有两种: 第一种方法是先使用VPORTS或MVIEW命令,在布局空间中创建多个二维视图视口,然后使用SOLPROF命令在每个视口中分别生成实体模型的轮廓线,以创建二维视图的三视图。 第二种方法是使用SOLVIEW命令后,在布局空间中生成实体模型的各个二维视图视口,然后使用SOLDRAW命令在每个视口中分别生成实体模型的轮廓线,以创建二维视图的三视图。下面分别介绍各个命令的使用。
wp.h #include
OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include
AutoCAD中由三维图转成三视图(二维图)——附视频文件 本文主要介绍利用AutoCAD2000强大的图纸布局功能,把用户已经绘制了三维模型生成三视图。当切换到图纸空间后,AutoCAD在屏幕上显示一张二维图纸,并自动创建一个浮动视口,在这个视口中显示出已经绘制的三维模型,可根据三维模型轻易地创建多种形式的布局。用户可以调整视口视点以获得所需的主视图,然后再用SOLVIEW命令生成其他视图,如正交视图、剖视图、斜视图等。 下面将通过实例来介绍由三维模型生成三视图的技巧,并着重介绍标准的主视图、左视图、俯视图、剖视图生成方法。 1.利用三维模型创建各视图的视口 1.1 主视图视口的创建 下一步中,我们将打开已经绘制好的三维模型。首先形成模型的主视图视口,并将它布置在“图纸”的适当位置。 1)打开磁盘上的文件“机架.dwg”。 2)从模型空间切换到图纸空间。单击图形绘图窗口底部的选项卡layout1,打开[Page Setup-Layout1]对话框,然后在“Paper size”下拉列表中设定图纸幅面为“ISO A2 (594.00×420.00mm)”,单击OK按钮,进入图纸空间。AutoCAD在A2图纸上自动创建一个视口。 注意:可以把浮动视口作为一个几何对象,因此能用MOVE、COPY、SCALE、STRETCH等命令及界标点编辑方式进行编辑。 3)选择浮动视口,激活它的界标点,并进入拉伸模式,然后调整好视口大小。单击状态栏的PAPER按钮,激活浮动视口,再执行下拉菜单View→Zoom→All或标准工具条中的??按钮,使模型全部显示在视口中,如图1所示。 4)设置“前视点”。执行下拉菜单View→3D Views命令,选择适当的视口方向,就可获得了主视图的视口,如图2所示。 1.2 左视图及俯视图视口的创建 下面根据主视图视口创建左视图及俯视图的视口。 1)执行下拉菜单Draw→Solids→Setup→View,或在Solids工具条??按钮,在命令状态行提示下,键入ortho或o。接下来指定视口的投影方向,如图3,选择浮动视口的A边(在创建俯视图视口时选择B边),同时出现一条十字橡皮线,然后拉动十字橡皮线在主视图的右边(在创建俯视图视口时在主视图的下边)单击一点指定左视图的位置。此时无须精确调整视图的位置,因为以后还可以再调整视图的位置。 2)下一步,确定视口的大小。如图3,单击左视图的左上方的任一位置点1处(在创建俯视图视口时单击点3处),再单击左视图的右下方的任一位置点2处(在创建俯视图视口时单击点4处)。 3)最后,输入视图名称为剖视图。键入回车结束命令。
石正坤 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() {
glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glVertex2f( 0.0, -0.2); glVertex2f( 0.2, 0.0); glVertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp() { glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BI T); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green display(); //-------------------------- //平移 glPushMatrix(); glTranslatef(0.5,0.5,0.0); display();
下面是“三维实体转三视图”的详细图解: 1.要将二维实体用三视图来出图,首先要画好二维立体图。第一步,不管是像现在这样的着色图…… 2.还是像现在这样的消隐图……
3.都要转换到“二维线框”模式,原因是要显示所有线条,包括因阻挡但实际存在的线条,以备以后有用。 4.在正式转三视图之前,先把出图的纸张格式定好,包括纸张横式/竖式,是否黑白打印…… 5.打印设备设置
6.打印布局设置 7.点击“设置视图”命令,或在命令行中输入solview,这个命令在布局里创建每个视图放置可见线和隐藏经线的图层(设置视图命令)
8.界面自动转到而已窗口,删除自动生成的布局。方法:点击外围的框线,实线变虚,Delete就删除了,点击Esc键,退出刚才的命令。 9.界面变成了完全的空白,再点击“设置视图”按钮,这回是正式开始设置视图了。
10.在布局里,点击鼠标右键,弹出菜单。选择UCS 11.因第一个出现的是俯视图,一般是放在左下角,因此在布局1/4的左下角中部为视力中心。 第一选项,选默认(直接回车) 第二选项,不知道比例,直接回事即可。 第三选项,指定视图中心,在布局中大概位置点击一下(点击后,如果觉得位置不好,还可以进行一次选择,点击第2次)
12.指定视图中心(点击鼠标左键后),即出现俯视图,由于我们事先没有指定比例,因此出现的俯视图根据原三维图的大小,可能会很大,也许会很小。我们只要及时滚动鼠标的滚轮还调节大小,在调节大小的同时,还可以点击鼠标的左键来调整视图的中心位置。 13.调整完成后,点击鼠标的右键或回车,命令要求指定俯视图视口的大小,方法和画矩形一样,从一个角到对角。
第24卷第10期 计算机应用与软件 Vol 124No .10 2007年10月 Computer App licati ons and Soft w are Oct .2007 O penG L 实现3D 模型的交互控制 孙妮芳 杨志强 陈 诚 何 斌 龚佩曾 (同济大学计算机系 上海 200092) 收稿日期:2006-12-04。孙妮芳,硕士生,主研领域:虚拟现实技术。 摘 要 简述了3DS 文件的结构,以及在OpenG L 中如何读入和显示3DS 文件的模型,并着重讲述了利用OpenG L 编程接口对场 景中的这些模型进行选择、拾取,通过鼠标拖动对这些模型进行交互操作。关键词 OpenG L 选择 拾取 交互操作 CO NTROL THE 3D MOD EL S I NTERACT I VELY I N O PENGL Sun N ifang Yang Zhiqiang Chen Cheng He B in Gong Peizeng (D epart m ent of Co m puter ,Tongji U niversity,Shanghai 200092,China ) Abstract The structure of 3DS For mat File is outlined,and the way t o read and show the models of 3DS For mat File in OpenG L is p resen 2ted .It is exp lained in detail how the interactive contr ol of the models with the select mode and the feedback mode is realized .Keywords OpenG L Select Picking I nteractive 0 引 言 虚拟实验是当今教育改革比较热门的话题之一,通常意义上讲的虚拟实验建立在真实实验的基础之上,对实验所使用的元器件、,实验者通过鼠标点击与拖曳、键盘操作,可以像对真实元器件一样对虚拟实验设备进行操作,从而完成整个虚拟实验过程。 交互技术是建立虚拟实验要解决的最基本和最重要的问题,交互不仅可以向用户演示信息,同时允许用户向程序传递一些控制信息,比如用户可以通过键盘、鼠标等外设来控制程序的运行。OpenG L 作为一个三维工具软件包,在三维交互编程等方面提供了比较完善的机制。比如,通过OpenG L 的选择、反馈模式比较容易实现通过鼠标键盘进行交互。 目前,已经有不少论文和书籍比较详细地阐述了在OpenG L 中通过选择、拾取和反馈实现对三维物体的交互操作。但对读入和显示多个3DS 文件的模型的交互操作却介绍得比较少。本文根据这一情况并结合实际,在虚拟装机系统中,对场景中的多个元器件模型的交互操作进行详细介绍。 1 3D S 文件介绍 3DS 文件存储了模型的材质信息和几何信息,材质信息主 要包括材质的名称,材质的纹理贴图所对应的文件名以及材质 的颜色等;几何信息主要包括顶点的数目,每个顶点的坐标,三角面的数目,每个三角面上3个顶点的索引,此三角面是否可见等。 3DS 文件由许多块组成,每个块包括信息类别和下一个块的相对位置。块的信息类别用I D 表示,它描述了该块的数据信息。下一个块的相对位置指出了下一个块相对于该块起始位置 的偏移字节数。在块结构中,始终用前2个字节保存I D 号,接下来的4个字节保存块的长度,块的实际内容则用(块长度)6个字节保存。块的内容又可能包含子块。 在OpenG L 中读入3DS 文件的模型的方法有很多,由于本文的程序是在VC ++环境下开发的,所以采用了编写一个类来加载3DS 文件的方法。这样的类很多书籍和网站都有提供,只需进行简单的修改就可以使用,比如修改模型的位置信息以实现模型的移动,增加模型的旋转经度和纬度信息以实现模型的旋转。 2 O penGL 的交互技术 在虚拟装机系统中,要求与场景本身进行更多的交互操作,这种交互除了菜单和对话框实现外,在很多情况下是用鼠标来进行的。OpenG L 的一大功能就是提供了实现交互技术的机制。OpenG L 的交互技术是通过选择、拾取和反馈操作来实现的。 2.1 选 择 选择允许在窗口内部的某个位置用鼠标进行点击,并确定它所点击的是哪个物体。选择是OpenG L 的一种操作模式,选择模式不会改变帧缓存区的内容,退出选择模式时,OpenG L 返回与视景体相交的图元列表,它列出了位于视景体内或与视景体相交的图元,每个图元产生一个选择命中的记录,对应名称堆栈中的当前内容。 ?绘制模式 进入选择模式前,调用函数gl Render M ode (),其原型为:gl Render M ode (G Lenu m mode )。控制应用程序当前所处的模式,即绘图、选择和反馈模式,相应的mode 的取值为G L_RE NDER 、G L _SE LECT 或G L_FEE DBACK 。
// 填充五角星.cpp : Defines the entry point for the console application. // wujiaoxing.cpp : Defines the entry point for the console application. #include "stdafx.h" #include "gl/glut.h" #include
游戏软件设计课程报告 (三维球体的实现) 院系: 专业: 学号: 姓名: 指导教师: 2010年10月10日
目录 目录 一、应用程序的最终界面----------------------------------------------------------------1 二、三维球体的绘制---------------------------------------------------------------------2 1、球体绘制方法研究 ----------------------------------------------------------------2 2、面分解法的实现----------------------------------------------------------------3 2.1面分解函数 ----------------------------------------------------------------3 2.2初值的选取 ----------------------------------------------------------------3 2.3 球体的实现----------------------------------------------------------------4 3、三角形绘制函数----------------------------------------------------------------4 4、三角面法向量函数 ----------------------------------------------------------------5 5、点的模长扩展函数 ----------------------------------------------------------------5 6、南北极法的实现----------------------------------------------------------------5 7、动画的实现-------------------------------------------------------------------10 三、二种绘制方法的比较---------------------------------------------------------------12
实用标准文档三维建模规
城市三维建模是为城市规划、建设、运营、管理和数字城市建设提供技术服务的基础,是城市经济建设和社会发展信息化的基础性工作。城市三维模型数据是城市规划、建设与管理的重要基础资料。为了建设市三维地理信息系统,规市三维建筑模型的制作,统一三维模型制作的技术要求,及时、准确地为城市规划、建设、运营、管理和数字城市建设提供城市建筑三维模型数据,推进城市三维数据的共享,特制定本规。项目软件及数据格式 1、项目中使用的软件统一标准如下: 模型制作软件:3DMAX9 贴图处理软件:Photoshop 平台加载软件:TerraExplorer v6 普通贴图格式:jpg 透明贴图格式:tga 模型格式:MAX、X、XPL2 加载文件格式:shp 平台文件格式:fly 2、模型容及分类 城市建模主要包括建筑物模型和场景模型。 2.1、建筑物模型的容及分类
建筑物模型应包括下列建模容: 各类地上建筑物,包括:建筑主体及其附属设施。含围墙、台阶、门房、牌坊、外墙广告、电梯井、水箱以及踢脚、散水等。 各类地下建筑物,包括:地下室、地下人防工程等。 其他建(构)筑物,包括:纪念碑、塔、亭、交通站厅、特殊公益建(构)筑物以及水利、电力设施等。 全市建筑物模型分为精细模型(精模),中等复杂模型(中模),体块模型(白模)。市全市围主要大街、名胜古迹、标志性建筑等用精模表示,一般建筑物用中模表示,城中村、棚户区等用白模表示。 2.1.1、精细复杂度模型(精模) 2.1.1.1、定义:精细模型为,能准确表现建筑物的几何实体结构,能表现建筑物的诸多细节,对部分重要建筑景观进行重点准确制作表现的模型制作方式。 2.1.1.2、一般制作围:城市中主干道两旁的主要建筑物、主干路十字路口的主要建筑,电信、移动、金融中心大楼,火车站,重点政治、经济、文化、体育中心区建筑,包括标志性建筑物,城市中知名度高的名胜古迹、地标性建筑(如大雁塔、钟楼等)。 2.1.1.3、制作方式:精细制作,不仅能反映实际建筑的大小,整体结构,而且能反映建筑物的细节结构。贴图效果好,带光影效果。用户看上去感觉就是实际的建筑、真实度高。 2.1.2、中等复杂度模型(中模) 2.1.2.1、定义:为了保证大规模数字城市在平台上流畅运行,并能准确表现建筑物的几何实体结构,在不影响建筑物真实性几何结构的基础上,可以忽略部分实体结构,对部分建筑景观进行简单制作表现的模型制作方式。 2.1.2.2、一般制作围:城市中非主干道两旁的主要建筑物、城市临街小区居民楼和其