我没有任何关于openGL的经验,所以也许我只是想念一些东西。
我有使用lablGL的ocaml代码。编译我用
ocamlopt -I + lablGL lablglut.cmxa lablgl.cmxa gl.ml -o gl.opt
或者
ocamlc -I + lablGL lablglut.cma lablgl.cma gl.ml -o gl.byte
let keyboard ~key ~x ~y =
match key with
| 27 -> exit 0
| _ -> ignore (Printf.printf "Key: %c %d pressed.\n%!" (char_of_int key) key)
;;
let keyboard_up ~key ~x ~y =
match key with
| _ -> ignore (Printf.printf "Key: %c %d released.\n%!" key (int_of_char key))
;;
let special ~key ~x ~y =
try
match key with
| Glut.KEY_F1 -> Printf.printf "F1 pressed.\n%!"
| Glut.KEY_F2 -> Printf.printf "F2 pressed.\n%!"
| Glut.KEY_F3 -> Printf.printf "F3 pressed.\n%!"
| Glut.KEY_F4 -> Printf.printf "F4 pressed.\n%!"
| Glut.KEY_F5 -> Printf.printf "F5 pressed.\n%!"
| Glut.KEY_F6 -> Printf.printf "F6 pressed.\n%!"
| Glut.KEY_F7 -> Printf.printf "F7 pressed.\n%!"
| Glut.KEY_F8 -> Printf.printf "F8 pressed.\n%!"
| Glut.KEY_F9 -> Printf.printf "F9 pressed.\n%!"
| Glut.KEY_F10 -> Printf.printf "F10 pressed.\n%!"
| Glut.KEY_F11 -> Printf.printf "F11 pressed.\n%!"
| Glut.KEY_F12 -> Printf.printf "F12 pressed.\n%!"
| Glut.KEY_LEFT -> Printf.printf "Left pressed.\n%!"
| Glut.KEY_UP -> Printf.printf "Up pressed.\n%!"
| Glut.KEY_RIGHT -> Printf.printf "Right pressed.\n%!"
| Glut.KEY_DOWN -> Printf.printf "Down pressed.\n%!"
| Glut.KEY_PAGE_UP -> Printf.printf "PgUp pressed.\n%!"
| Glut.KEY_PAGE_DOWN -> Printf.printf "PgDown pressed.\n%!"
| Glut.KEY_HOME -> Printf.printf "Home pressed.\n%!"
| Glut.KEY_END -> Printf.printf "End pressed.\n%!"
| Glut.KEY_INSERT -> Printf.printf "Insert pressed.\n%!"
with
| Glut.BadEnum m -> Printf.printf "%s\n" m
;;
let () =
ignore (Glut.init Sys.argv);
ignore (Glut.createWindow ~title:"OpenGL Demo");
GlClear.color (1.0, 1.0, 1.0);
Glut.keyboardFunc ~cb:(keyboard);
Glut.specialFunc ~cb:(special);
Glut.displayFunc ~cb:(fun () -> GlClear.clear [ `color ]; Gl.flush ());
Glut.mainLoop ()
现在是问题所在。禁用numlock时按numlock或任何其他numpad键会引发异常,从而使程序崩溃。尝试在特殊功能中捕获此异常无济于事。
这是示例运行。
> ./gl.opt
Up pressed.
Down pressed.
Key: 1 49 pressed.
Key: 2 50 pressed.
Fatal error: exception Glut.BadEnum("key in special_of_int")
有人可以向我解释为什么它如此工作以及如何解决吗?
最佳答案
根据this代码,似乎编写它的用户只是试图通过以下方式避免该错误:
let rec handlelablglutbug () =
try
Glut.mainLoop ();
with Glut.BadEnum "key in special_of_int" ->
showtext '!' " LablGlut bug: special key not recognized";
Glut.swapBuffers ();
handlelablglutbug ()
in
handlelablglutbug ();
这使我认为这是与glut库的ocaml端口有关的错误。因此无法进行无缝修复。
关于exception - 为什么按下numlock会使OCaml opengl程序崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3478623/