3D 绘图如何在 OCaml 中工作

Posted

技术标签:

【中文标题】3D 绘图如何在 OCaml 中工作【英文标题】:How does 3D plotting works in OCaml 【发布时间】:2015-11-29 18:51:59 【问题描述】:

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

【问题讨论】:

【参考方案1】:

到目前为止,我看到的关于 GLUT 的最佳教程是 OCaml for Scientists 的 Chapter 6。您可能还会看到来自同一作者的this tutorial。它可能会帮助你。

这些库以及以任何其他语言实现 OpenGL 的任何其他库通常都没有记录,因为假设用户已经知道 OpenGL 的工作原理。因此,从一些 OpenGL 书籍开始,然后使用 OCaml 进行学习可能是一个好主意。在这种情况下,Tgsl 库提供了与 OCaml 的瘦 OpenGL 绑定,会更好地工作。

最后但同样重要的是,OpenGL 可视化并不是函数式编程课程中最终项目的最佳想法。 OpenGL 本质上是非常必要的,与函数式编程无关。此外,您将不会学到任何关于使用 OCaml 的知识,因为您实际上会将 OCaml 用作 C。

如果您仍然努力进行一些可视化,那么从 OpenGL 和 3d 图形转向 2d 并使用声明性Vg 库可能是一个更好的主意,这纯粹是功能性的。

【讨论】:

感谢@ivg 的好心cmets。我将研究 Vg 以进行 2D 可视化。不幸的是,3D 可视化也是一项要求。这个想法是能够使用 OCamel 中可用的任何库。因此,如果有人对不依赖 OpenGL 的 OCaml 中的 3D 有更好的想法,那就太好了!

以上是关于3D 绘图如何在 OCaml 中工作的主要内容,如果未能解决你的问题,请参考以下文章

卷积层(CNN)如何在 keras 中工作?

如何让带有渐变的矢量可绘制对象在 < API 24 中工作?

通过 .ply 格式将 3D 点导出到 Blender 会创建一个空对象,而它在 MeshLab 中工作

如何让别名在所有 shell 中工作?

如何解决 Http 401 错误,但在邮递员中工作,而不是在 xamarin 表单中工作

%符号如何在javascript中工作[重复]