浏览器中的 3d 曲面图

Posted

技术标签:

【中文标题】浏览器中的 3d 曲面图【英文标题】:3d surface plot in browser 【发布时间】:2011-11-04 16:13:59 【问题描述】:

我有一个 python web 服务器 (cherrypy),我希望用户能够计算这种精确类型的某些表面。这是我能够从用户输入中生成的。他给了我一些参数,我计算我的东西,在服务器上将它生成为 PNG(matplotlib/numpy),然后通过 JQuery 加载发回。

问题是,这很蹩脚,而且表面可以有不同的方面。我希望能够拥有一个实际的小部件,或者这样可以让用户旋转他的表面......

我的主要限制是它必须在 IE 7 上工作(8 也很酷),并允许输入我以某种方式计算的数据。我在网上看到很多只允许输入参数函数的东西。我需要的是能够推送原始数据三元组。

我一直在研究一些东西,javascript 会是最好的,但我没有看到 JQuery 或等效的东西。我确实在 WebGL 上看了很长时间,并开始实现一些东西......从头开始......但有时在 IE 中的行为太长而且随机。

也许我完全错过了一些与我的 python 兼容的技术或格式,但我花了几天时间才采用绘制成 PNG 的临时解决方案。

期待你们的阅读, 在此先感谢 ;)

【问题讨论】:

chrome-frame 可以作为要求吗? 好吧,我在想,某个论坛的一个人对使用 WebGL 的最佳方法做了一个很好的总结,chrome frame 被评估为与 IEWebGL 一样好的解决方案。我不能认为这很难,因为我需要一种无需安装的方法.. 抱歉 ;) 值得一试。 doesn't require admin rights 了,如果有帮助的话 【参考方案1】:

据我所知,如果您需要 IE7 兼容性,那么 JS 中的大多数可用库都不适合您 - 它们需要 canvas 或 SVG 支持。剩下的是静态图像、Flash 或 Java 小程序。

我会研究processing,它具有良好的 3D 支持并且可以创建用于 Web 的 Java 小程序。请参阅 the 3D tutorials 了解交互式 3D 表面的优秀示例。

如果您想变得花哨,您还可以为支持canvas 元素的浏览器提供processing.js。这将避免为这些浏览器加载 Java 小程序,从而使 UI 更加流畅并消除对 Java 的依赖。您需要检查浏览器兼容性,然后加载小程序代码或 processing.js 代码。这样做的好处是您应该能够在两种情况下使用完全相同的处理代码。

【讨论】:

这大致就是我的想法,尽管 excanvas.js 和 IEWebGL 确实有一点帮助。您能否推荐有关如何在此类 Flash 或 Java 组件中加载输入的工具和技巧?我关心的是如何从我的 python 中做到这一点.. 我相信您可以使用 processing 的 loadStrings() 函数从同一站点上的 URL 加载内容。因此,您可以使用 python 以某种基于文本的格式为您的数据提供 API。 我正在更多地研究 processing.js,尽管这似乎意味着开发我自己的曲面图......知道是否有一个项目可以渲染接近我正在寻找的东西? 我不知道,但这并不意味着没有。 Processing 的优势在于自定义可视化,人们倾向于将其用于特殊项目。但这里可能有一些东西:processing.org/reference/libraries 作为结论,我没有使用任何这些技术。我正在用 Java 开发一个定制的小程序。我将留下入口点来指定从中获取各种数据的 url。我这样做是因为用 Java 开发很容易,在 Eclipse 等工具中调试也很容易,并且将 XML 扔到我的应用程序中很容易弄清楚。【参考方案2】:

让 python 脚本以 json 格式返回 3D 模型的顶点/点,然后使用 mrdoob 的 three.js 直接在浏览器中创建一个实时的、由 javascript 驱动的 3D webGL 模型。

在此处查看three.js:https://github.com/mrdoob/three.js

(看看那里令人惊叹的例子以获得灵感,您可能还可以获得 mrdoob 以获得见解......)

编辑:糟糕,刚刚注意到 IE7 的要求。 IE7 没有 webGL :(。您必须使用 Flash 进行 3D 渲染。或者让您的 python 脚本创建不同角度的视图,这些视图可以作为图像加载到浏览器中(例如,用户单击右键并且加载的下一个图像向右旋转一定角度)。

编辑:看起来 IEWebGL 将为 IE7 启用 webGL!

EIDT:processing.js 看起来也非常适合可视化!

【讨论】:

好吧,我发现 IEWebGL 在 IE7 上运行得非常好,查看这里的示例,有些非常好,但是挖掘代码并不好,缺少 cmets,但是网站仍然很年轻:iewebgl.com/ 我认为最好的办法是弄清楚 json 是如何工作的,以及如何使用 HTTP GET 或 POST 请求从服务器中检索它。【参考方案3】:

我一直在寻找类似的东西(JS 中的等高线图)并且遇到了一个看起来可以在 IE6 中工作的东西(使用 excanvas):http://code.google.com/p/javascript-surface-plot/

它使用 Google 可视化 API:

var data = new google.visualization.DataTable();
for (var i = 0; i < numCols; i++) 
    data.addColumn('number', 'col' + i);

data.addRows(numRows);
var d = 360 / numRows;
var idx = 0;
for (var i = 0; i < numRows; i++) 
    for (var j = 0; j < numCols; j++) 
        var value = (Math.cos(i * d * Math.PI / 180.0) * Math.cos(j * d * Math.PI / 180.0));
        data.setValue(i, j, value / 4.0);
        tooltipStrings[idx] = "x:" + i + ", y:" + j + " = " + value;
        idx++;
    

所以也许你可以用你的三元组数据加载它。

【讨论】:

【参考方案4】:

您想使用 Pre3d。它不使用 WebGL。它使用画布元素。 这是它的例子http://www.graphycalc.com/

使用 explorecanvas 为 IE 添加画布支持。

【讨论】:

制作它的人没有添加对IE的支持,也许有隐藏的原因? 顺便说一句,我仍然没有解决方案。我暂时切换到 Java 小程序 + javascript 来处理事件。

以上是关于浏览器中的 3d 曲面图的主要内容,如果未能解决你的问题,请参考以下文章

用 Vega 生成 3D 曲面图?

从三个 1D 数组创建 3D 曲面图

使用 R 绘制带有等高线图叠加的 3D 曲面图

使用 Plotly 绘制动画 3D 曲面图

matplotlib 3d曲面图未显示[重复]

Plotly:如何更改 3D 曲面图的配色方案?