Opengl 如何在OCaml中进行三维打印

Opengl 如何在OCaml中进行三维打印,opengl,plot,3d,ocaml,glut,Opengl,Plot,3d,Ocaml,Glut,我目前正在学习使用OCaml的高级函数编程课程。对于编程项目,我的任务是实现一个用于绘图功能的3D绘图仪。我刚开始学习lablgl和GLUT,但不幸的是,我还没有找到关于使用OCaml的GLUT的好教程。我已经用一种非常简单的方式画出了一个2D图形。我想这可能不是正确的方法,因为我真的不明白我在做什么。有人能帮我了解一下使用GLUT进行3D绘图的策略吗?当我尝试实现我所做的3D版本时,我真的被卡住了 下面是我为在2D中绘制函数而编写的代码 open Gl;; open GlMat;; open

我目前正在学习使用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 ()
;;

到目前为止,我所看到的关于GLUT的最佳教程是《OCaml面向科学家》一书。你可能也看到了同样的作者。这可能对你有帮助

这个库以及任何其他用任何其他语言实现OpenGL的库通常都是文档不足的,因为假定用户已经知道OpenGL是如何工作的。因此,从一些OpenGL书籍开始,并使用OCaml遵循它可能是一个好主意。在这种情况下,提供到OCaml的精简OpenGL绑定的库将工作得更好

最后,但并非最不重要的是,OpenGL可视化并不是函数式编程课程最终项目的最佳方案。OpenGL从本质上讲是非常必要的,与函数式编程无关。此外,您将不了解如何使用OCaml,因为您将实际使用OCaml作为C


如果您仍在努力进行一些可视化,那么最好从OpenGL和3d图形转移到2d,使用声明性库,这纯粹是功能性的

感谢@ivg的好意评论。我将研究二维可视化的Vg。不幸的是,三维可视化也是一项要求。其想法是能够使用OCamel中可用的任何库。所以,如果有人对OCaml中不依赖OpenGL的3D有更好的想法,那就太好了!