我目前正在使用OCaml进行高级函数编程课程。对于编程项目,我的任务是实现将用于绘图功能的3D绘图仪。我开始使用lablgl和GLUT但不幸的是我还没有找到使用OCaml的GLUT的好教程。我设法以非常幼稚的方式绘制了2D图形。我认为这可能不是正确的方法,因为我不太了解我在做什么。有人可以帮我理解使用GLUT进行3D绘图的策略是什么?在尝试实现我所做的3D版本时,我真的陷入了困境。
这是我用于在2D中绘制函数的代码。
open Gl;;
open GlMat;;
open GlDraw;;
open GlClear;;
open Glut;;
(* Transform RGB values in [0.0 - 1.0] to use it with OpenGL *)
let oc = function
x -> float x /. 255.
;;
(* The function to be graphed *)
let expression = function
x -> sin (10. *. x) /. (1. +. x *. x)
;;
(* The rendering function drawing 2000 points in 400x400 canvas *)
let display () =
GlClear.color (oc 255, oc 255,oc 255);
clear [`color];
load_identity ();
begins `lines;
GlDraw.color (oc 0, oc 0, oc 0);
List.iter vertex2 [-1.,0.; 1.,0.];
List.iter vertex2 [0.,-1.;0.,1.];
ends ();
begins `points;
for i=0 to 2000 do
let x = (float i -. 1000.) /. 400. in
let y = expression (x) in
vertex2 (x,y);
done;
ends ();
swapBuffers ();
flush();
;;
(* general stuff and main loop *)
let () =
ignore (init Sys.argv);
initWindowSize ~w:400 ~h:400;
initDisplayMode ~double_buffer:true ();
ignore (createWindow ~title:"Sin(x*10)/(1+x^2)");
mode `modelview;
displayFunc ~cb:display;
idleFunc ~cb:(Some postRedisplay);
keyboardFunc ~cb:(fun ~key ~x ~y -> if key=27 then exit 0);
mainLoop ()
;;
答案 0 :(得分:2)
到目前为止,我所见过的GLUT最佳教程是OCaml for Scientists的Chapter 6书。您可能也会看到同一作者的this tutorial。它可能会帮助你。
这些库以及用任何其他语言实现OpenGL的任何其他库通常都没有文档记录,因为假设用户已经知道OpenGL是如何工作的。因此,从一些OpenGL书籍开始,然后使用OCaml来关注它可能是一个好主意。在这种情况下,提供与OCaml的精简OpenGL绑定的Tgsl库将更好地工作。
最后但并非最不重要的一点是,OpenGL可视化并不是函数式编程课程中最终项目的最佳选择。 OpenGL本质上是非常必要的,与函数式编程无关。此外,您将不会了解使用OCaml,因为您实际上将OCaml用作C.
如果你仍然努力做一些可视化,那么最好从OpenGL和3d图形转移到2d并使用声明性Vg库,这是纯粹的功能。