3d图形应用程序问题

时间:2019-03-15 09:02:19

标签: graphics 3d graphing graph-visualization rpn

对于我的一个课程,我制作了一个3D图形应用程序(使用Visual Basic)。它以字符串(z = f(x,y))作为输入,将其解析为RPN表示法,然后对方程求值并绘制图形。当它确实起作用时,花了大约20秒钟绘制图形。我本来希望添加滑动条来垂直和水平旋转图形,但是绝对不允许这样做。

有人知道哪种编程语言最适合此类情况吗?理想情况下,一旦将函数绘制成图形,我将能够使其平滑旋转。

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

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

要清楚,我并不是要有人为我做任何事情,而是要以一种有效的方式进行编码的方法。任何人在解决这三个问题时都可以提供的任何建议,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

编程语言基本上不相关,因此VB本身可能不是问题。在Python,C#,C ++等中,您可能会遇到相同的问题。当然,您必须掌握所选的编程语言。

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

答案 1 :(得分:0)

因此,我将解释如何使用C ++和OpenGL进行处理。这并不意味着您必须使用这些工具,而仅仅是那些标准的图形工具。

您的函数的表面本质上是2D流形,它具有直观映射到2D空间的良好特性。通常称为紫外线贴图。

您应该做的是为要显示的矩形域选择范围(最小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 ++的std向量工作正常),这将成为您的“网格”。

此操作在渲染之前完成一次。然后,您可以使用GL_POINTS等渲染这些点,并使用GPU上的旋转来旋转图形网格。

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

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

将每个4个连续顶点(即索引为<x,y>, <x+1,y>, <x+1,y>, <x+1,y+1>)的顶点分组,并创建2个三角形:

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

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

基本上,您只需要构建一次网格,这样,对于具有20000个顶点的对象,渲染速度应为60 fps,无论您是否仅渲染点或三角形。