在Lua脚本中使用OpenGL函数

主要因为单纯的学习Lua太枯燥了,所以先学些了Lua基本语法然后就直接学习了与C语言的相互调用,所以以后的OpenGL代码都用Lua写,这样更容易理解Lua以及提高学习兴趣。下面是这2天的代码包括C语言部分和Lua部分,因为公司环境是Ubuntu的所以我用glut库使代码在Linux和windows下都可以使用。

C语言代码如下:

[cpp] view plain copy
  1. #include <GL/gl.h>  
  2. #include <GL/glu.h>  
  3. #include <GL/glut.h>  
  4. #include <lua.h>  
  5. #include <lauxlib.h>  
  6. #include <lualib.h>  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <string.h>  
  10. #include "pqimage.h"  
  11.   
  12. #define CAST(x, t)  ((t)(x))  
  13. #define ERROR(...)  printf(__VA_ARGS__);exit(0)  
  14.   
  15. #define HAVE_BUFFER  
  16. #if defined(HAVE_BUFFER)  
  17.     #define DISPLAY_MODE    GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA  
  18.     #define ShowGL()        glutSwapBuffers()  
  19. #else  
  20.     #define DISPLAY_MODE    GLUT_SINGLE | GLUT_RGB  
  21.     #define ShowGL()        glFlush()  
  22. #endif  
  23.   
  24. int load_texture(const char *filename)  
  25. {  
  26.     GLuint texture;  
  27.     PQ_RGBImageRec *tex_img = pqDIBImageLoad(filename);  
  28.       
  29.     if ( !tex_img ) return 0;     
  30.       
  31.     glGenTextures(1, &texture);  
  32.     glBindTexture(GL_TEXTURE_2D, texture);  
  33.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_img->width, tex_img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_img->buf);  
  34.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  
  35.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  
  36.     pqDIBImageFree(tex_img);  
  37.     return (int)texture;  
  38. }  
  39.   
  40. //********************************************************************************  
  41. //*********************************** Lua ****************************************  
  42. //********************************************************************************  
  43. int Flip(lua_State *L)  
  44. {  
  45.     ShowGL();  
  46.     return 0;  
  47. }  
  48. int LoadTexture(lua_State *L)  
  49. {  
  50.     const char * filename = luaL_checkstring(L, 1);  
  51.     lua_pushnumber(L, load_texture(filename));  
  52.     return 1;  
  53. }  
  54. int glLoadIdentity_lua(lua_State *L)  
  55. {  
  56.     glLoadIdentity();  
  57.     return 0;  
  58. }  
  59. int glTranslatef_lua(lua_State *L)  
  60. {  
  61.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);  
  62.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);  
  63.     GLfloat z = (GLfloat)luaL_checknumber(L, 3);  
  64.     glTranslatef(x, y, z);  
  65.     return 0;  
  66. }  
  67. int glRotatef_lua(lua_State *L)  
  68. {  
  69.     GLfloat angle = (GLfloat)luaL_checknumber(L, 1);  
  70.     GLfloat x = (GLfloat)luaL_checknumber(L, 2);  
  71.     GLfloat y = (GLfloat)luaL_checknumber(L, 3);  
  72.     GLfloat z = (GLfloat)luaL_checknumber(L, 4);  
  73.     glRotatef(angle, x, y, z);  
  74.     return 0;  
  75. }  
  76. int glVertex3f_lua(lua_State *L)  
  77. {     
  78.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);  
  79.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);  
  80.     GLfloat z = (GLfloat)luaL_checknumber(L, 3);  
  81.     glVertex3f(x, y, z);      
  82.     return 0;  
  83. }  
  84. int glColor3f_lua(lua_State *L)  
  85. {  
  86.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);  
  87.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);  
  88.     GLfloat z = (GLfloat)luaL_checknumber(L, 3);  
  89.     glColor3f(x, y, z);  
  90.     return 0;  
  91. }  
  92. int glTexCoord2f_lua(lua_State *L)  
  93. {  
  94.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);  
  95.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);  
  96.       
  97.     glTexCoord2f(x, y);  
  98.     return 0;  
  99. }  
  100. int glBegin_lua(lua_State *L)  
  101. {  
  102.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  103.       
  104.     glBegin(mode);    
  105.     return 0;  
  106. }  
  107. int glEnd_lua(lua_State *L)  
  108. {  
  109.     glEnd();  
  110.     return 0;  
  111. }  
  112. int glBindTexture_lua(lua_State *L)  
  113. {  
  114.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  115.     GLuint tex = (GLuint)luaL_checknumber(L, 2);  
  116.     glBindTexture(mode, tex);  
  117.     return 0;  
  118. }  
  119. int glEnable_lua(lua_State *L)  
  120. {  
  121.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  122.     glEnable(mode);  
  123.     return 0;  
  124. }  
  125. int glDisable_lua(lua_State *L)  
  126. {  
  127.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  128.     glDisable(mode);  
  129.     return 0;  
  130. }  
  131. int glShadeModel_lua(lua_State *L)  
  132. {     
  133.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  134.     glShadeModel(mode);  
  135.     return 0;  
  136. }  
  137. int glClearColor_lua(lua_State *L)  
  138. {  
  139.     GLfloat r = (GLfloat)luaL_checknumber(L, 1);  
  140.     GLfloat g = (GLfloat)luaL_checknumber(L, 2);  
  141.     GLfloat b = (GLfloat)luaL_checknumber(L, 3);  
  142.     GLfloat a = (GLfloat)luaL_checknumber(L, 4);  
  143.     glClearColor(r, g, b, a);  
  144.     return 0;  
  145. }  
  146. int glClearDepth_lua(lua_State *L)  
  147. {  
  148.     GLfloat d = (GLfloat)luaL_checknumber(L, 1);  
  149.     glClearDepth(d);  
  150.     return 0;  
  151. }  
  152. int glDepthFunc_lua(lua_State *L)  
  153. {  
  154.     GLfloat mode = (GLfloat)luaL_checknumber(L, 1);  
  155.     glDepthFunc(mode);  
  156.     return 0;  
  157. }  
  158. int glHint_lua(lua_State *L)  
  159. {  
  160.     GLfloat m1 = (GLfloat)luaL_checknumber(L, 1);  
  161.     GLfloat m2 = (GLfloat)luaL_checknumber(L, 2);  
  162.     glHint(m1, m2);  
  163.     return 0;  
  164. }  
  165. int glViewport_lua(lua_State *L)  
  166. {  
  167.     GLfloat left = (GLfloat)luaL_checknumber(L, 1);  
  168.     GLfloat top = (GLfloat)luaL_checknumber(L, 2);  
  169.     GLfloat right = (GLfloat)luaL_checknumber(L, 3);  
  170.     GLfloat bottom = (GLfloat)luaL_checknumber(L, 4);  
  171.     glViewport(left, top, right, bottom);  
  172.     return 0;  
  173. }  
  174. int glMatrixMode_lua(lua_State *L)  
  175. {  
  176.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  177.     glMatrixMode(mode);  
  178.     return 0;  
  179. }  
  180. int gluPerspective_lua(lua_State *L)  
  181. {  
  182.     GLfloat angle = (GLfloat)luaL_checknumber(L, 1);  
  183.     GLfloat fwh = (GLfloat)luaL_checknumber(L, 2);  
  184.     GLfloat far = (GLfloat)luaL_checknumber(L, 3);  
  185.     GLfloat near = (GLfloat)luaL_checknumber(L, 4);  
  186.     gluPerspective(angle, fwh, far, near);  
  187.     return 0;  
  188. }  
  189. int glClear_lua(lua_State *L)  
  190. {  
  191.     GLuint mode = (GLuint)luaL_checknumber(L, 1);  
  192.     glClear(mode);  
  193.     return 0;  
  194. }  
  195. int EndProcess(lua_State *L)  
  196. {  
  197.     GLint no = (GLint)luaL_checknumber(L, 1);  
  198.     exit(no);  
  199.     return 0;  
  200. }  
  201. int getfield(lua_State *L, const char *key)  
  202. {  
  203.     int result;  
  204.     lua_pushstring(L, key);  
  205.     lua_gettable(L, -2);    /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */  
  206.     result = lua_isnumber(L, -1) ? (int)lua_tonumber(L, -1) : 0;  
  207.     lua_pop(L, 1);  
  208.     return result;  
  209. }  
  210. const char * getfield_str(lua_State *L, const char *key)  
  211. {  
  212.     const char * result = NULL;  
  213.     lua_pushstring(L, key);  
  214.     lua_gettable(L, -2);    /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */  
  215.     result = lua_isstring(L, -1) ? lua_tostring(L, -1) : NULL;  
  216.     lua_pop(L, 1);  
  217.     return result;  
  218. }  
  219. //********************************************************************************  
  220. //*********************************** Lua ****************************************  
  221. //********************************************************************************  
  222. static lua_State *G_L = NULL;  
  223. static GLint S_wnd_w = 0;  
  224. static GLint S_wnd_h = 0;  
  225. static char * S_caption = NULL;  
  226. void init_global(const char *lua_file)  
  227. {  
  228.     G_L = lua_open();  
  229.     luaL_openlibs(G_L);  
  230.       
  231.     lua_register(G_L, "Flip", Flip);  
  232.     lua_register(G_L, "EndProcess", EndProcess);  
  233.     lua_register(G_L, "LoadTexture", LoadTexture);  
  234.     lua_register(G_L, "glLoadIdentity", glLoadIdentity_lua);  
  235.     lua_register(G_L, "glTranslatef", glTranslatef_lua);  
  236.     lua_register(G_L, "glRotatef", glRotatef_lua);  
  237.     lua_register(G_L, "glVertex3f", glVertex3f_lua);  
  238.     lua_register(G_L, "glColor3f", glColor3f_lua);  
  239.     lua_register(G_L, "glTexCoord2f", glTexCoord2f_lua);  
  240.     lua_register(G_L, "glBegin", glBegin_lua);  
  241.     lua_register(G_L, "glEnd", glEnd_lua);  
  242.     lua_register(G_L, "glBindTexture", glBindTexture_lua);  
  243.     lua_register(G_L, "glEnable", glEnable_lua);  
  244.     lua_register(G_L, "glDisable", glDisable_lua);  
  245.     lua_register(G_L, "glShadeModel", glShadeModel_lua);  
  246.     lua_register(G_L, "glClearColor", glClearColor_lua);  
  247.     lua_register(G_L, "glClearDepth", glClearDepth_lua);  
  248.     lua_register(G_L, "glDepthFunc", glDepthFunc_lua);  
  249.     lua_register(G_L, "glHint", glHint_lua);  
  250.     lua_register(G_L, "glViewport", glViewport_lua);  
  251.     lua_register(G_L, "glMatrixMode", glMatrixMode_lua);  
  252.     lua_register(G_L, "gluPerspective", gluPerspective_lua);  
  253.     lua_register(G_L, "glClear", glClear_lua);  
  254.       
  255.     lua_pushnumber(G_L, GL_COLOR_BUFFER_BIT);     
  256.     lua_setglobal(G_L, "GL_COLOR_BUFFER_BIT");  
  257.     lua_pushnumber(G_L, GL_DEPTH_BUFFER_BIT);  
  258.     lua_setglobal(G_L, "GL_DEPTH_BUFFER_BIT");  
  259.     lua_pushnumber(G_L, GL_QUADS);  
  260.     lua_setglobal(G_L, "GL_QUADS");  
  261.     lua_pushnumber(G_L, GL_TRIANGLES);  
  262.     lua_setglobal(G_L, "GL_TRIANGLES");  
  263.     lua_pushnumber(G_L, GL_LINES);  
  264.     lua_setglobal(G_L, "GL_LINES");  
  265.     lua_pushnumber(G_L, GL_TEXTURE_2D);  
  266.     lua_setglobal(G_L, "GL_TEXTURE_2D");  
  267.     lua_pushnumber(G_L, GL_PROJECTION);  
  268.     lua_setglobal(G_L, "GL_PROJECTION");  
  269.     lua_pushnumber(G_L, GL_MODELVIEW);  
  270.     lua_setglobal(G_L, "GL_MODELVIEW");  
  271.     lua_pushnumber(G_L, GL_SMOOTH);  
  272.     lua_setglobal(G_L, "GL_SMOOTH");  
  273.     lua_pushnumber(G_L, GL_DEPTH_TEST);  
  274.     lua_setglobal(G_L, "GL_DEPTH_TEST");  
  275.     lua_pushnumber(G_L, GL_LEQUAL);  
  276.     lua_setglobal(G_L, "GL_LEQUAL");  
  277.     lua_pushnumber(G_L, GL_PERSPECTIVE_CORRECTION_HINT);  
  278.     lua_setglobal(G_L, "GL_PERSPECTIVE_CORRECTION_HINT");  
  279.     lua_pushnumber(G_L, GL_NICEST);  
  280.     lua_setglobal(G_L, "GL_NICEST");  
  281.     lua_pushnumber(G_L, GLUT_LEFT_BUTTON);  
  282.     lua_setglobal(G_L, "GLUT_LEFT_BUTTON");  
  283.     lua_pushnumber(G_L, GLUT_MIDDLE_BUTTON);  
  284.     lua_setglobal(G_L, "GLUT_MIDDLE_BUTTON");  
  285.     lua_pushnumber(G_L, GLUT_RIGHT_BUTTON);  
  286.     lua_setglobal(G_L, "GLUT_RIGHT_BUTTON");  
  287.     lua_pushnumber(G_L, GLUT_DOWN);  
  288.     lua_setglobal(G_L, "GLUT_DOWN");  
  289.     lua_pushnumber(G_L, GLUT_UP);  
  290.     lua_setglobal(G_L, "GLUT_UP");  
  291.     if ( luaL_loadfile(G_L, lua_file) ) {  
  292.         ERROR("load %s failed!/n[error] %s/n", lua_file, lua_tostring(G_L, -1));  
  293.     }  
  294.     if ( lua_pcall(G_L, 0, 0, 0) ) {  
  295.         ERROR("the %s has error!/n [error] %s/n", lua_file, lua_tostring(G_L, -1));   
  296.     }  
  297.     lua_getglobal(G_L, "Screen");  
  298.     S_wnd_w = getfield(G_L, "width");  
  299.     S_wnd_h = getfield(G_L, "height");  
  300.     const char *title = getfield_str(G_L, "caption");  
  301.     int len = strlen(title);  
  302.     if ( !(S_caption = (char *)malloc(len+1)) ) {  
  303.         ERROR("alloc caption memory space failed!/n");    
  304.     }  
  305.     memcpy(S_caption, title, len);  
  306.     S_caption[len] = '/0';  
  307. }  
  308. int init()  
  309. {  
  310.     lua_getglobal(G_L, "init");  
  311.     if ( lua_pcall(G_L, 0, 0, 0) ) {  
  312.         ERROR("call lua.init failed!/n[error] %s/n", lua_tostring(G_L, -1));      
  313.     }  
  314. }  
  315. void mouse(int button, int state, int x, int y)  
  316. {  
  317.     lua_getglobal(G_L, "mouse");  
  318.     lua_pushnumber(G_L, button);  
  319.     lua_pushnumber(G_L, state);  
  320.     lua_pushnumber(G_L, x);  
  321.     lua_pushnumber(G_L, y);  
  322.     if ( lua_pcall(G_L, 4, 0, 0) ) {  
  323.         ERROR("call lua.mouse failed!/n[error] %s/n", lua_tostring(G_L, -1));     
  324.     }  
  325. }  
  326. void active_motion(int x, int y)  
  327. {  
  328.     lua_getglobal(G_L, "active_motion");  
  329.     lua_pushnumber(G_L, x);  
  330.     lua_pushnumber(G_L, y);  
  331.     if ( lua_pcall(G_L, 2, 0, 0) ) {  
  332.         ERROR("call lua.active_motion failed!/n[error] %s/n", lua_tostring(G_L, -1));     
  333.     }  
  334. }  
  335. void passive_motion(int x, int y)  
  336. {  
  337.     lua_getglobal(G_L, "passive_motion");  
  338.     lua_pushnumber(G_L, x);  
  339.     lua_pushnumber(G_L, y);  
  340.     if ( lua_pcall(G_L, 2, 0, 0) ) {  
  341.         ERROR("call lua.passive_motion failed!/n[error] %s/n", lua_tostring(G_L, -1));    
  342.     }  
  343. }  
  344.   
  345. void keyboard(unsigned char key, int x, int y)  
  346. {  
  347.     lua_getglobal(G_L, "keyboard");  
  348.     lua_pushnumber(G_L, key);  
  349.     lua_pushnumber(G_L, x);  
  350.     lua_pushnumber(G_L, y);  
  351.     if ( lua_pcall(G_L, 3, 0, 0) ) {  
  352.         ERROR("call lua.keyboard failed!/n[error] %s/n", lua_tostring(G_L, -1));      
  353.     }  
  354. }  
  355. void reshape(int w, int h)  
  356. {  
  357.     lua_getglobal(G_L, "reshape");  
  358.     lua_pushnumber(G_L, w);  
  359.     lua_pushnumber(G_L, h);  
  360.     if ( lua_pcall(G_L, 2, 0, 0) ) {  
  361.         ERROR("call lua.reshape failed!/n[error] %s/n", lua_tostring(G_L, -1));   
  362.     }  
  363. }  
  364. void display()  
  365. {  
  366.     lua_getglobal(G_L, "display");  
  367.     if ( lua_pcall(G_L, 0, 0, 0) ) {  
  368.         ERROR("call lua.display failed!/n[error] %s/n", lua_tostring(G_L, -1));  
  369.     }  
  370. }  
  371. void release()  
  372. {  
  373.     lua_close(G_L);  
  374. }  
  375. int main(int argc, char *argv[])  
  376. {  
  377.     if ( argc > 1 ) {  
  378.         init_global(argv[1]);  
  379.         if ( argc > 2 )   
  380.             printf("too many parameters!/n");  
  381.     } else {  
  382.         ERROR("too less parameter!/n");  
  383.     }  
  384.       
  385.     glutInit(&argc, argv);  
  386.     glutInitDisplayMode(DISPLAY_MODE);  
  387.     glutInitWindowPosition(0, 0);  
  388.     glutInitWindowSize(S_wnd_w, S_wnd_h);  
  389.     glutCreateWindow(S_caption);  
  390.     init();  
  391.     glutMouseFunc(mouse);  
  392.     glutMotionFunc(active_motion);  
  393.     glutPassiveMotionFunc(passive_motion);  
  394.     glutKeyboardFunc(keyboard);  
  395.     glutReshapeFunc(reshape);  
  396.     glutDisplayFunc(display);  
  397.     glutIdleFunc(display);  
  398.     glutMainLoop();  
  399.     release();  
  400.     return 0;  
  401. }  

Lua代码如下:

[cpp] view plain copy
  1. Screen = {width = 600, height = 600, caption = "OpenGL - Lua"}  
  2. -- 常用颜色  
  3. F_BLACK = {r=0.0, g=0.0, b=0.0}  
  4. F_BLACK_A = {r=0.0, g=0.0, b=0.0, a=0.0}  
  5. F_WHITE = {r=0.0, g=0.0, b=0.0}  
  6. F_WHITE_A = {r=1.0, g=1.0, b=1.0, a=0.0}  
  7. F_RED = {r=1.0, g=0.0, b=0.0}  
  8. F_RED_A = {r=1.0, g=0.0, b=0.0, a=0.0}  
  9. F_GREEN = {r=0.0, g=1.0, b=0.0}  
  10. F_GREEN_A = {r=0.0, g=1.0, b=0.0, a=0.0}  
  11. F_BLUE = {r=0.0, g=0.0, b=1.0};  
  12. F_BLUE_A = {r=0.0, g=0.0, b=1.0, a=0.0}  
  13. -- 局部变量  
  14. local cube_vertexs = {  
  15.     {x = -1.0, y = -1.0, z = 1.0},      -- 1  
  16.     {x = 1.0, y = -1.0, z = 1.0},       -- 2  
  17.     {x = 1.0, y = 1.0, z = 1.0},        -- 3  
  18.     {x = -1.0, y = 1.0, z = 1.0},       -- 4  
  19.     {x = 1.0, y = -1.0, z = -1.0},      -- 5  
  20.     {x = -1.0, y = -1.0, z = -1.0},     -- 6  
  21.     {x = -1.0, y = 1.0, z = -1.0},      -- 7  
  22.     {x = 1.0, y = 1.0, z = -1.0}        -- 8      
  23. }  
  24. local standard_cube = {  
  25.     front = {cube_vertexs[1], cube_vertexs[2], cube_vertexs[3], cube_vertexs[4]},  
  26.     back = {cube_vertexs[5], cube_vertexs[6], cube_vertexs[7], cube_vertexs[8]},  
  27.     up = {cube_vertexs[4], cube_vertexs[3], cube_vertexs[8], cube_vertexs[7]},  
  28.     bottom = {cube_vertexs[1], cube_vertexs[2], cube_vertexs[5], cube_vertexs[6]},  
  29.     left = {cube_vertexs[6], cube_vertexs[1], cube_vertexs[4], cube_vertexs[7]},  
  30.     right = {cube_vertexs[2], cube_vertexs[5], cube_vertexs[8], cube_vertexs[3]}  
  31. }  
  32.       
  33. local cubes = {  
  34.     {  
  35.         image_file = "tex.bmp",  
  36.         texture = 0,  
  37.         x = 0,  
  38.         y = 0,  
  39.         r = 1.0,  
  40.         coord = {}  
  41.     },  
  42.     {  
  43.         image_file = "tex2.bmp",  
  44.         texture = 0,  
  45.         x = 0,  
  46.         y = 0,  
  47.         r = 1.0,  
  48.         coord = {}  
  49.     }  
  50. }  
  51. local rot_x = 0.0  
  52. local rot_y = 0.0  
  53. local rot_z = 0.0  
  54. local zoom = -8.0  
  55. local trans_x = 0.0  
  56. local trans_y = 0.0  
  57. local b_mousedown = false  
  58. local mousedown_x = 0  
  59. local mousedown_y = 0  
  60. -- 初始化cube  
  61. function initCube()  
  62.     for i, v in ipairs(cubes) do  
  63.         v.x = -1.0 + (i-1)*2.0  
  64.         v.y = 0.0  
  65.         v.coord = standard_cube   
  66.         v.texture = LoadTexture(v.image_file)  
  67.         if v.texture == 0 then  
  68.             print("load texture " .. v.image_file .. " failed!/n")    
  69.             EndProcess(0)     
  70.         end  
  71.     end  
  72. end  
  73. -- 初始化  
  74. function init()  
  75.     initCube()  
  76.     glEnable(GL_TEXTURE_2D)  
  77.     glShadeModel(GL_SMOOTH)  
  78.     glClearColor(F_BLACK_A.r, F_BLACK_A.g, F_BLACK_A.b, F_BLACK_A.a)  
  79.     glClearDepth(1.0)  
  80.     glEnable(GL_DEPTH_TEST)  
  81.     glDepthFunc(GL_LEQUAL)  
  82.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)  
  83. end  
  84. -- 显示  
  85. function display()  
  86.     glClear(GL_COLOR_BUFFER_BIT)  
  87.     glClear(GL_DEPTH_BUFFER_BIT)  
  88.     for _, v in ipairs(cubes) do  
  89.         glLoadIdentity()  
  90.         glTranslatef(trans_x+v.x, trans_y+v.y, zoom)  
  91.         glRotatef(rot_x, 1.0, 0.0, 0.0)  
  92.         glRotatef(rot_y, 0.0, 1.0, 0.0)  
  93.         glRotatef(rot_z, 0.0, 0.0, 1.0)  
  94.           
  95.         glBindTexture(GL_TEXTURE_2D, v.texture)  
  96.         glBegin(GL_QUADS)  
  97.             glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.front[1].x, v.coord.front[1].y, v.coord.front[1].z)  
  98.             glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.front[2].x, v.coord.front[2].y, v.coord.front[2].z)  
  99.             glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.front[3].x, v.coord.front[3].y, v.coord.front[3].z)  
  100.             glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.front[4].x, v.coord.front[4].y, v.coord.front[4].z)  
  101.             glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.back[1].x, v.coord.back[1].y, v.coord.back[1].z)  
  102.             glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.back[2].x, v.coord.back[2].y, v.coord.back[2].z)  
  103.             glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.back[3].x, v.coord.back[3].y, v.coord.back[3].z)  
  104.             glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.back[4].x, v.coord.back[4].y, v.coord.back[4].z)  
  105.             glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.up[1].x, v.coord.up[1].y, v.coord.up[1].z)  
  106.             glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.up[2].x, v.coord.up[2].y, v.coord.up[2].z)  
  107.             glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.up[3].x, v.coord.up[3].y, v.coord.up[3].z)  
  108.             glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.up[4].x, v.coord.up[4].y, v.coord.up[4].z)     
  109.             glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.bottom[1].x, v.coord.bottom[1].y, v.coord.bottom[1].z)  
  110.             glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.bottom[2].x, v.coord.bottom[2].y, v.coord.bottom[2].z)  
  111.             glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.bottom[3].x, v.coord.bottom[3].y, v.coord.bottom[3].z)  
  112.             glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.bottom[4].x, v.coord.bottom[4].y, v.coord.bottom[4].z)  
  113.             glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.left[1].x, v.coord.left[1].y, v.coord.left[1].z)  
  114.             glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.left[2].x, v.coord.left[2].y, v.coord.left[2].z)  
  115.             glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.left[3].x, v.coord.left[3].y, v.coord.left[3].z)  
  116.             glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.left[4].x, v.coord.left[4].y, v.coord.left[4].z)       
  117.             glTexCoord2f(0.0, 0.0); glVertex3f(v.coord.right[1].x, v.coord.right[1].y, v.coord.right[1].z)  
  118.             glTexCoord2f(1.0, 0.0); glVertex3f(v.coord.right[2].x, v.coord.right[2].y, v.coord.right[2].z)  
  119.             glTexCoord2f(1.0, 1.0); glVertex3f(v.coord.right[3].x, v.coord.right[3].y, v.coord.right[3].z)  
  120.             glTexCoord2f(0.0, 1.0); glVertex3f(v.coord.right[4].x, v.coord.right[4].y, v.coord.right[4].z)                
  121.         glEnd()  
  122.     end  
  123.       
  124.     rot_x = rot_x + 0.02  
  125.     rot_y = rot_y + 0.03  
  126.     rot_z = rot_z + 0.04  
  127.     rot_x = ((rot_x > 360.0) and (rot_x - 360.0)) or rot_x  
  128.     rot_y = ((rot_y > 360.0) and (rot_y - 360.0)) or rot_y  
  129.     rot_z = ((rot_z > 360.0) and (rot_z - 360.0)) or rot_z  
  130.     Flip()  
  131. end  
  132. -- 窗口大小改变  
  133. function reshape(w, h)  
  134.     if h == 0 then h = 1 end  
  135.     glViewport(0, 0, w, h)  
  136.     glMatrixMode(GL_PROJECTION);  
  137.     glLoadIdentity();  
  138.     gluPerspective(45.0, w/h, 0.1, 100.0)  
  139.     glMatrixMode(GL_MODELVIEW)  
  140.     glLoadIdentity()  
  141. end  
  142. -- 鼠标点击事件  
  143. function mouse(button, state, x, y)  
  144.     if button == GLUT_LEFT_BUTTON then  
  145.         if state == GLUT_DOWN then  
  146.             if not b_mousedown then  
  147.                 b_mousedown = true  
  148.                 mousedown_x = x  
  149.                 mousedown_y = y           
  150.             end  
  151.         elseif state == GLUT_up then  
  152.             if b_mousedown then  
  153.                 b_mousedown = false  
  154.             end  
  155.         end  
  156.     elseif button == GLUT_RIGHT_BUTTON then  
  157.         trans_x = 0.0  
  158.         trans_y = 0.0  
  159.     end  
  160. end  
  161. -- 鼠标移动事件(鼠标按下时移动)  
  162. function active_motion(x, y)  
  163.     if b_mousedown then  
  164.         local tx = (x-mousedown_x)/Screen.width*zoom  
  165.         local ty = (mousedown_y-y)/Screen.height*zoom  
  166.         trans_x = trans_x - tx  
  167.         trans_y = trans_y - ty   
  168.         mousedown_x = x  
  169.         mousedown_y = y  
  170.     end  
  171. end  
  172. -- 鼠标移动事件(鼠标没有按下时移动)  
  173. function passive_motion(x, y)  
  174.     -- print(x, y)  
  175. end  
  176. -- 键盘事件  
  177. function keyboard(key, x, y)  
  178.     if key == 27 then   
  179.         EndProcess(0)     
  180.     end  
  181. 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一样。

 

你可能感兴趣的:(在Lua脚本中使用OpenGL函数)