主要因为单纯的学习Lua太枯燥了,所以先学些了Lua基本语法然后就直接学习了与C语言的相互调用,所以以后的OpenGL代码都用Lua写,这样更容易理解Lua以及提高学习兴趣。下面是这2天的代码包括C语言部分和Lua部分,因为公司环境是Ubuntu的所以我用glut库使代码在Linux和windows下都可以使用。
C语言代码如下:
- #include <GL/gl.h>
- #include <GL/glu.h>
- #include <GL/glut.h>
- #include <lua.h>
- #include <lauxlib.h>
- #include <lualib.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "pqimage.h"
- #define CAST(x, t) ((t)(x))
- #define ERROR(...) printf(__VA_ARGS__);exit(0)
- #define HAVE_BUFFER
- #if defined(HAVE_BUFFER)
- #define DISPLAY_MODE GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA
- #define ShowGL() glutSwapBuffers()
- #else
- #define DISPLAY_MODE GLUT_SINGLE | GLUT_RGB
- #define ShowGL() glFlush()
- #endif
- int load_texture(const char *filename)
- {
- GLuint texture;
- PQ_RGBImageRec *tex_img = pqDIBImageLoad(filename);
- if ( !tex_img ) return 0;
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_img->width, tex_img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_img->buf);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- pqDIBImageFree(tex_img);
- return (int)texture;
- }
- //********************************************************************************
- //*********************************** Lua ****************************************
- //********************************************************************************
- int Flip(lua_State *L)
- {
- ShowGL();
- return 0;
- }
- int LoadTexture(lua_State *L)
- {
- const char * filename = luaL_checkstring(L, 1);
- lua_pushnumber(L, load_texture(filename));
- return 1;
- }
- int glLoadIdentity_lua(lua_State *L)
- {
- glLoadIdentity();
- return 0;
- }
- int glTranslatef_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- GLfloat z = (GLfloat)luaL_checknumber(L, 3);
- glTranslatef(x, y, z);
- return 0;
- }
- int glRotatef_lua(lua_State *L)
- {
- GLfloat angle = (GLfloat)luaL_checknumber(L, 1);
- GLfloat x = (GLfloat)luaL_checknumber(L, 2);
- GLfloat y = (GLfloat)luaL_checknumber(L, 3);
- GLfloat z = (GLfloat)luaL_checknumber(L, 4);
- glRotatef(angle, x, y, z);
- return 0;
- }
- int glVertex3f_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- GLfloat z = (GLfloat)luaL_checknumber(L, 3);
- glVertex3f(x, y, z);
- return 0;
- }
- int glColor3f_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- GLfloat z = (GLfloat)luaL_checknumber(L, 3);
- glColor3f(x, y, z);
- return 0;
- }
- int glTexCoord2f_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- glTexCoord2f(x, y);
- return 0;
- }
- int glBegin_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glBegin(mode);
- return 0;
- }
- int glEnd_lua(lua_State *L)
- {
- glEnd();
- return 0;
- }
- int glBindTexture_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- GLuint tex = (GLuint)luaL_checknumber(L, 2);
- glBindTexture(mode, tex);
- return 0;
- }
- int glEnable_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glEnable(mode);
- return 0;
- }
- int glDisable_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glDisable(mode);
- return 0;
- }
- int glShadeModel_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glShadeModel(mode);
- return 0;
- }
- int glClearColor_lua(lua_State *L)
- {
- GLfloat r = (GLfloat)luaL_checknumber(L, 1);
- GLfloat g = (GLfloat)luaL_checknumber(L, 2);
- GLfloat b = (GLfloat)luaL_checknumber(L, 3);
- GLfloat a = (GLfloat)luaL_checknumber(L, 4);
- glClearColor(r, g, b, a);
- return 0;
- }
- int glClearDepth_lua(lua_State *L)
- {
- GLfloat d = (GLfloat)luaL_checknumber(L, 1);
- glClearDepth(d);
- return 0;
- }
- int glDepthFunc_lua(lua_State *L)
- {
- GLfloat mode = (GLfloat)luaL_checknumber(L, 1);
- glDepthFunc(mode);
- return 0;
- }
- int glHint_lua(lua_State *L)
- {
- GLfloat m1 = (GLfloat)luaL_checknumber(L, 1);
- GLfloat m2 = (GLfloat)luaL_checknumber(L, 2);
- glHint(m1, m2);
- return 0;
- }
- int glViewport_lua(lua_State *L)
- {
- GLfloat left = (GLfloat)luaL_checknumber(L, 1);
- GLfloat top = (GLfloat)luaL_checknumber(L, 2);
- GLfloat right = (GLfloat)luaL_checknumber(L, 3);
- GLfloat bottom = (GLfloat)luaL_checknumber(L, 4);
- glViewport(left, top, right, bottom);
- return 0;
- }
- int glMatrixMode_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glMatrixMode(mode);
- return 0;
- }
- int gluPerspective_lua(lua_State *L)
- {
- GLfloat angle = (GLfloat)luaL_checknumber(L, 1);
- GLfloat fwh = (GLfloat)luaL_checknumber(L, 2);
- GLfloat far = (GLfloat)luaL_checknumber(L, 3);
- GLfloat near = (GLfloat)luaL_checknumber(L, 4);
- gluPerspective(angle, fwh, far, near);
- return 0;
- }
- int glClear_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glClear(mode);
- return 0;
- }
- int EndProcess(lua_State *L)
- {
- GLint no = (GLint)luaL_checknumber(L, 1);
- exit(no);
- return 0;
- }
- int getfield(lua_State *L, const char *key)
- {
- int result;
- lua_pushstring(L, key);
- lua_gettable(L, -2); /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */
- result = lua_isnumber(L, -1) ? (int)lua_tonumber(L, -1) : 0;
- lua_pop(L, 1);
- return result;
- }
- const char * getfield_str(lua_State *L, const char *key)
- {
- const char * result = NULL;
- lua_pushstring(L, key);
- lua_gettable(L, -2); /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */
- result = lua_isstring(L, -1) ? lua_tostring(L, -1) : NULL;
- lua_pop(L, 1);
- return result;
- }
- //********************************************************************************
- //*********************************** Lua ****************************************
- //********************************************************************************
- static lua_State *G_L = NULL;
- static GLint S_wnd_w = 0;
- static GLint S_wnd_h = 0;
- static char * S_caption = NULL;
- void init_global(const char *lua_file)
- {
- G_L = lua_open();
- luaL_openlibs(G_L);
- lua_register(G_L, "Flip", Flip);
- lua_register(G_L, "EndProcess", EndProcess);
- lua_register(G_L, "LoadTexture", LoadTexture);
- lua_register(G_L, "glLoadIdentity", glLoadIdentity_lua);
- lua_register(G_L, "glTranslatef", glTranslatef_lua);
- lua_register(G_L, "glRotatef", glRotatef_lua);
- lua_register(G_L, "glVertex3f", glVertex3f_lua);
- lua_register(G_L, "glColor3f", glColor3f_lua);
- lua_register(G_L, "glTexCoord2f", glTexCoord2f_lua);
- lua_register(G_L, "glBegin", glBegin_lua);
- lua_register(G_L, "glEnd", glEnd_lua);
- lua_register(G_L, "glBindTexture", glBindTexture_lua);
- lua_register(G_L, "glEnable", glEnable_lua);
- lua_register(G_L, "glDisable", glDisable_lua);
- lua_register(G_L, "glShadeModel", glShadeModel_lua);
- lua_register(G_L, "glClearColor", glClearColor_lua);
- lua_register(G_L, "glClearDepth", glClearDepth_lua);
- lua_register(G_L, "glDepthFunc", glDepthFunc_lua);
- lua_register(G_L, "glHint", glHint_lua);
- lua_register(G_L, "glViewport", glViewport_lua);
- lua_register(G_L, "glMatrixMode", glMatrixMode_lua);
- lua_register(G_L, "gluPerspective", gluPerspective_lua);
- lua_register(G_L, "glClear", glClear_lua);
- lua_pushnumber(G_L, GL_COLOR_BUFFER_BIT);
- lua_setglobal(G_L, "GL_COLOR_BUFFER_BIT");
- lua_pushnumber(G_L, GL_DEPTH_BUFFER_BIT);
- lua_setglobal(G_L, "GL_DEPTH_BUFFER_BIT");
- lua_pushnumber(G_L, GL_QUADS);
- lua_setglobal(G_L, "GL_QUADS");
- lua_pushnumber(G_L, GL_TRIANGLES);
- lua_setglobal(G_L, "GL_TRIANGLES");
- lua_pushnumber(G_L, GL_LINES);
- lua_setglobal(G_L, "GL_LINES");
- lua_pushnumber(G_L, GL_TEXTURE_2D);
- lua_setglobal(G_L, "GL_TEXTURE_2D");
- lua_pushnumber(G_L, GL_PROJECTION);
- lua_setglobal(G_L, "GL_PROJECTION");
- lua_pushnumber(G_L, GL_MODELVIEW);
- lua_setglobal(G_L, "GL_MODELVIEW");
- lua_pushnumber(G_L, GL_SMOOTH);
- lua_setglobal(G_L, "GL_SMOOTH");
- lua_pushnumber(G_L, GL_DEPTH_TEST);
- lua_setglobal(G_L, "GL_DEPTH_TEST");
- lua_pushnumber(G_L, GL_LEQUAL);
- lua_setglobal(G_L, "GL_LEQUAL");
- lua_pushnumber(G_L, GL_PERSPECTIVE_CORRECTION_HINT);
- lua_setglobal(G_L, "GL_PERSPECTIVE_CORRECTION_HINT");
- lua_pushnumber(G_L, GL_NICEST);
- lua_setglobal(G_L, "GL_NICEST");
- lua_pushnumber(G_L, GLUT_LEFT_BUTTON);
- lua_setglobal(G_L, "GLUT_LEFT_BUTTON");
- lua_pushnumber(G_L, GLUT_MIDDLE_BUTTON);
- lua_setglobal(G_L, "GLUT_MIDDLE_BUTTON");
- lua_pushnumber(G_L, GLUT_RIGHT_BUTTON);
- lua_setglobal(G_L, "GLUT_RIGHT_BUTTON");
- lua_pushnumber(G_L, GLUT_DOWN);
- lua_setglobal(G_L, "GLUT_DOWN");
- lua_pushnumber(G_L, GLUT_UP);
- lua_setglobal(G_L, "GLUT_UP");
- if ( luaL_loadfile(G_L, lua_file) ) {
- ERROR("load %s failed!/n[error] %s/n", lua_file, lua_tostring(G_L, -1));
- }
- if ( lua_pcall(G_L, 0, 0, 0) ) {
- ERROR("the %s has error!/n [error] %s/n", lua_file, lua_tostring(G_L, -1));
- }
- lua_getglobal(G_L, "Screen");
- S_wnd_w = getfield(G_L, "width");
- S_wnd_h = getfield(G_L, "height");
- const char *title = getfield_str(G_L, "caption");
- int len = strlen(title);
- if ( !(S_caption = (char *)malloc(len+1)) ) {
- ERROR("alloc caption memory space failed!/n");
- }
- memcpy(S_caption, title, len);
- S_caption[len] = '/0';
- }
- int init()
- {
- lua_getglobal(G_L, "init");
- if ( lua_pcall(G_L, 0, 0, 0) ) {
- ERROR("call lua.init failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void mouse(int button, int state, int x, int y)
- {
- lua_getglobal(G_L, "mouse");
- lua_pushnumber(G_L, button);
- lua_pushnumber(G_L, state);
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 4, 0, 0) ) {
- ERROR("call lua.mouse failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void active_motion(int x, int y)
- {
- lua_getglobal(G_L, "active_motion");
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 2, 0, 0) ) {
- ERROR("call lua.active_motion failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void passive_motion(int x, int y)
- {
- lua_getglobal(G_L, "passive_motion");
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 2, 0, 0) ) {
- ERROR("call lua.passive_motion failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void keyboard(unsigned char key, int x, int y)
- {
- lua_getglobal(G_L, "keyboard");
- lua_pushnumber(G_L, key);
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 3, 0, 0) ) {
- ERROR("call lua.keyboard failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void reshape(int w, int h)
- {
- lua_getglobal(G_L, "reshape");
- lua_pushnumber(G_L, w);
- lua_pushnumber(G_L, h);
- if ( lua_pcall(G_L, 2, 0, 0) ) {
- ERROR("call lua.reshape failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void display()
- {
- lua_getglobal(G_L, "display");
- if ( lua_pcall(G_L, 0, 0, 0) ) {
- ERROR("call lua.display failed!/n[error] %s/n", lua_tostring(G_L, -1));
- }
- }
- void release()
- {
- lua_close(G_L);
- }
- int main(int argc, char *argv[])
- {
- if ( argc > 1 ) {
- init_global(argv[1]);
- if ( argc > 2 )
- printf("too many parameters!/n");
- } else {
- ERROR("too less parameter!/n");
- }
- glutInit(&argc, argv);
- glutInitDisplayMode(DISPLAY_MODE);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(S_wnd_w, S_wnd_h);
- glutCreateWindow(S_caption);
- init();
- glutMouseFunc(mouse);
- glutMotionFunc(active_motion);
- glutPassiveMotionFunc(passive_motion);
- glutKeyboardFunc(keyboard);
- glutReshapeFunc(reshape);
- glutDisplayFunc(display);
- glutIdleFunc(display);
- glutMainLoop();
- release();
- return 0;
- }
Lua代码如下:
- Screen = {width = 600, height = 600, caption = "OpenGL - Lua"}
- -- 常用颜色
- F_BLACK = {r=0.0, g=0.0, b=0.0}
- F_BLACK_A = {r=0.0, g=0.0, b=0.0, a=0.0}
- F_WHITE = {r=0.0, g=0.0, b=0.0}
- F_WHITE_A = {r=1.0, g=1.0, b=1.0, a=0.0}
- F_RED = {r=1.0, g=0.0, b=0.0}
- F_RED_A = {r=1.0, g=0.0, b=0.0, a=0.0}
- F_GREEN = {r=0.0, g=1.0, b=0.0}
- F_GREEN_A = {r=0.0, g=1.0, b=0.0, a=0.0}
- F_BLUE = {r=0.0, g=0.0, b=1.0};
- F_BLUE_A = {r=0.0, g=0.0, b=1.0, a=0.0}
- -- 局部变量
- local cube_vertexs = {
- {x = -1.0, y = -1.0, z = 1.0}, -- 1
- {x = 1.0, y = -1.0, z = 1.0}, -- 2
- {x = 1.0, y = 1.0, z = 1.0}, -- 3
- {x = -1.0, y = 1.0, z = 1.0}, -- 4
- {x = 1.0, y = -1.0, z = -1.0}, -- 5
- {x = -1.0, y = -1.0, z = -1.0}, -- 6
- {x = -1.0, y = 1.0, z = -1.0}, -- 7
- {x = 1.0, y = 1.0, z = -1.0} -- 8
- }
- local standard_cube = {
- front = {cube_vertexs[1], cube_vertexs[2], cube_vertexs[3], cube_vertexs[4]},
- back = {cube_vertexs[5], cube_vertexs[6], cube_vertexs[7], cube_vertexs[8]},
- up = {cube_vertexs[4], cube_vertexs[3], cube_vertexs[8], cube_vertexs[7]},
- bottom = {cube_vertexs[1], cube_vertexs[2], cube_vertexs[5], cube_vertexs[6]},
- left = {cube_vertexs[6], cube_vertexs[1], cube_vertexs[4], cube_vertexs[7]},
- right = {cube_vertexs[2], cube_vertexs[5], cube_vertexs[8], cube_vertexs[3]}
- }
- local cubes = {
- {
- image_file = "tex.bmp",
- texture = 0,
- x = 0,
- y = 0,
- r = 1.0,
- coord = {}
- },
- {
- image_file = "tex2.bmp",
- texture = 0,
- x = 0,
- y = 0,
- r = 1.0,
- coord = {}
- }
- }
- local rot_x = 0.0
- local rot_y = 0.0
- local rot_z = 0.0
- local zoom = -8.0
- local trans_x = 0.0
- local trans_y = 0.0
- local b_mousedown = false
- local mousedown_x = 0
- local mousedown_y = 0
- -- 初始化cube
- function initCube()
- for i, v in ipairs(cubes) do
- v.x = -1.0 + (i-1)*2.0
- v.y = 0.0
- v.coord = standard_cube
- v.texture = LoadTexture(v.image_file)
- if v.texture == 0 then
- print("load texture " .. v.image_file .. " failed!/n")
- EndProcess(0)
- end
- end
- end
- -- 初始化
- function init()
- initCube()
- glEnable(GL_TEXTURE_2D)
- glShadeModel(GL_SMOOTH)
- glClearColor(F_BLACK_A.r, F_BLACK_A.g, F_BLACK_A.b, F_BLACK_A.a)
- glClearDepth(1.0)
- glEnable(GL_DEPTH_TEST)
- glDepthFunc(GL_LEQUAL)
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
- end
- -- 显示
- function display()
- glClear(GL_COLOR_BUFFER_BIT)
- glClear(GL_DEPTH_BUFFER_BIT)
- for _, v in ipairs(cubes) do
- glLoadIdentity()
- glTranslatef(trans_x+v.x, trans_y+v.y, zoom)
- glRotatef(rot_x, 1.0, 0.0, 0.0)
- glRotatef(rot_y, 0.0, 1.0, 0.0)
- glRotatef(rot_z, 0.0, 0.0, 1.0)
- glBindTexture(GL_TEXTURE_2D, v.texture)
- glBegin(GL_QUADS)
- glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.front[1].x, v.coord.front[1].y, v.coord.front[1].z)
- glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.front[2].x, v.coord.front[2].y, v.coord.front[2].z)
- glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.front[3].x, v.coord.front[3].y, v.coord.front[3].z)
- glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.front[4].x, v.coord.front[4].y, v.coord.front[4].z)
- glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.back[1].x, v.coord.back[1].y, v.coord.back[1].z)
- glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.back[2].x, v.coord.back[2].y, v.coord.back[2].z)
- glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.back[3].x, v.coord.back[3].y, v.coord.back[3].z)
- glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.back[4].x, v.coord.back[4].y, v.coord.back[4].z)
- glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.up[1].x, v.coord.up[1].y, v.coord.up[1].z)
- glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.up[2].x, v.coord.up[2].y, v.coord.up[2].z)
- glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.up[3].x, v.coord.up[3].y, v.coord.up[3].z)
- glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.up[4].x, v.coord.up[4].y, v.coord.up[4].z)
- glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.bottom[1].x, v.coord.bottom[1].y, v.coord.bottom[1].z)
- glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.bottom[2].x, v.coord.bottom[2].y, v.coord.bottom[2].z)
- glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.bottom[3].x, v.coord.bottom[3].y, v.coord.bottom[3].z)
- glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.bottom[4].x, v.coord.bottom[4].y, v.coord.bottom[4].z)
- glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.left[1].x, v.coord.left[1].y, v.coord.left[1].z)
- glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.left[2].x, v.coord.left[2].y, v.coord.left[2].z)
- glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.left[3].x, v.coord.left[3].y, v.coord.left[3].z)
- glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.left[4].x, v.coord.left[4].y, v.coord.left[4].z)
- glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.right[1].x, v.coord.right[1].y, v.coord.right[1].z)
- glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.right[2].x, v.coord.right[2].y, v.coord.right[2].z)
- glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.right[3].x, v.coord.right[3].y, v.coord.right[3].z)
- glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.right[4].x, v.coord.right[4].y, v.coord.right[4].z)
- glEnd()
- end
- rot_x = rot_x + 0.02
- rot_y = rot_y + 0.03
- rot_z = rot_z + 0.04
- rot_x = ((rot_x > 360.0) and (rot_x - 360.0)) or rot_x
- rot_y = ((rot_y > 360.0) and (rot_y - 360.0)) or rot_y
- rot_z = ((rot_z > 360.0) and (rot_z - 360.0)) or rot_z
- Flip()
- end
- -- 窗口大小改变
- function reshape(w, h)
- if h == 0 then h = 1 end
- glViewport(0, 0, w, h)
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0, w/h, 0.1, 100.0)
- glMatrixMode(GL_MODELVIEW)
- glLoadIdentity()
- end
- -- 鼠标点击事件
- function mouse(button, state, x, y)
- if button == GLUT_LEFT_BUTTON then
- if state == GLUT_DOWN then
- if not b_mousedown then
- b_mousedown = true
- mousedown_x = x
- mousedown_y = y
- end
- elseif state == GLUT_up then
- if b_mousedown then
- b_mousedown = false
- end
- end
- elseif button == GLUT_RIGHT_BUTTON then
- trans_x = 0.0
- trans_y = 0.0
- end
- end
- -- 鼠标移动事件(鼠标按下时移动)
- function active_motion(x, y)
- if b_mousedown then
- local tx = (x-mousedown_x)/Screen.width*zoom
- local ty = (mousedown_y-y)/Screen.height*zoom
- trans_x = trans_x - tx
- trans_y = trans_y - ty
- mousedown_x = x
- mousedown_y = y
- end
- end
- -- 鼠标移动事件(鼠标没有按下时移动)
- function passive_motion(x, y)
- -- print(x, y)
- end
- -- 键盘事件
- function keyboard(key, x, y)
- if key == 27 then
- EndProcess(0)
- end
- end
在linux下先安装编译lua(这中间还需要下载安装readline5库),然后用 gcc -o luaGL luaGL.c -lglut -lGLU -lGL -llua -ldl -lm编译即可,运行luaGL + 指定lua即可
在windows下在代码中添加:
#pragma comment(lib, “opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
#pragma comment(lib, "lua.lib")
这些只是供大家参考,如果大家有兴趣可以把完整的OpenGL库都加进来(我想这样的话,不如直接使用C语言了),我主要是为了学习Lua的时候更有兴趣,不然单写些书上的例子程序太枯燥了,大家还可以试着把socket库也添加进来(luasocket这个库好像也可以),反正发挥你们的想象吧。
注: 因为linux下的OpenGL没有aux库,所以写了一个简单的图片解析库pqimage,只解析bmp图片,功能和auxDIBImageLoad一样。