【问题标题】:3d Graphing Application Questions3d 绘图应用问题
【发布时间】:2019-03-15 09:02:18
【问题描述】:

对于我的一个课程,我制作了一个 3D 图形应用程序(使用 Visual Basic)。它接受一个字符串 (z=f(x,y)) 作为输入,将其解析为 RPN 符号,然后评估并绘制方程。虽然它确实有效,但绘制图表需要大约 20 秒。我本来想添加滑动条来垂直和水平旋转图形,但它绝对太慢了,不允许这样做。

有谁知道哪种编程语言最适合这种类型的事情?理想情况下,一旦绘制图形,我将能够平滑地旋转函数。

另外,我正在尝试找到一种更好的方法来旋转函数。现在,我在一堆点上对其进行评估,然后将这些点绘制到屏幕上。每次旋转时,都必须重新评估并绘制所有新点。这与原始图形过程一样长,因为它基本上将其视为一个全新的函数。

最后,我需要一种更好的方式来显示图表。目前(在 Visual Studio 中使用 VB)我将 200,000 个点绘制到图表上,但这无论如何看起来都不是很好。最终,我希望能够根据高度和其他图形操作更改颜色以使其看起来更好。

需要明确的是,我并不是要求有人为我做任何这些,而是​​要求以一种有效的方式进行编码的方法。我将非常感谢任何人提供的任何建议,以帮助解决这三个问题中的任何一个。

【问题讨论】:

    标签: graphics 3d graphing graph-visualization rpn


    【解决方案1】:

    所以我将解释如何使用 C++ 和 OpenGL 来实现它。这并不意味着这些是您必须使用的工具,它们只是标准的图形工具。

    函数的表面本质上是一个二维流形,它具有直观映射到二维空间的良好特性。即通常所说的 UV 映射。

    您应该做的是选择要显示的矩形域的范围(最小 x,最大 x,最小 y,最大 y)并制作 2 个嵌套的形式的 for 循环:

    // Pseudocode
    for (x=minimum; x<maximum; x++)
        for (y=minimum; y=maximum; y++)
           3D point = (x,y, f(x,y))
    

    将所有这些点存储到一个容器中(c++ 的标准向量工作正常),这将是您的“网格”。

    这在渲染之前完成一次。然后,您使用例如 GL_POINTS 渲染这些点,并使用 GPU 上的旋转来旋转您的图形网格。

    这只会显示散点,而不是表面。

    如果您还希望显示函数的表面,而不仅仅是点,则可以相当轻松地对这组点进行三角剖分。

    将每 4 个连续顶点分组(即索引 &lt;x,y&gt;, &lt;x+1,y&gt;, &lt;x+1,y&gt;, &lt;x+1,y+1&gt;) 处的顶点并创建 2 个三角形:

    (<x,y>, <x+1,y>, <x,y+1>), (<x+1,y>, <x+1,y+1>, <x,y+1>)
    

    这将填充三角网格的表面。

    基本上您只需要构建一次网格,这样对于具有 20 000 个顶点的东西的渲染速度应该是 60 fps,无论您是只渲染点还是三角形。

    【讨论】:

      【解决方案2】:

      编程语言大多不相关,所以 VB 本身可能不是问题。在 Python、C#、C++ 等中你可能会遇到同样的问题。当然你必须掌握你选择的编程语言。

      一个关键方面是使用正确的算法和数据结构。正确使用内存分配和内存布局以最大化 CPU(和 GPU)缓存也是关键。然后您必须利用平台和硬件功能(GPU 和多线程)。最后一点,您肯定需要使用 OpenGL 或 Vulkan 等图形库。

      【讨论】:

      • 谢谢,这很有帮助。我专注于可读性和快速完成项目,所以有很多可以优化的东西。我一定会研究图形库。我的导师也谈到了多线程,所以我也会在这方面了解更多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多