在Mathematica 7中使用抗锯齿进行慢速3D旋转

Mr.*_*ard 8 3d wolfram-mathematica antialiasing

Mathematica 7中关闭抗锯齿的3D表面旋转非常快速和平滑.但是,即使在适度的水平上打开抗锯齿,也会大幅降低渲染的帧速率,使旋转非常不连贯.这在Mathematica中发生的程度远远大于其他3D应用程序.

  1. 为什么Mathematica中的抗锯齿速度不成比例地慢?

  2. 一种极大地增强3D图形感觉的方法是在旋转期间关闭AA,但是一旦旋转停止就将其打开.可以在Mathematica 7中完成吗?


要求提供一个例子.我将使用迈克代码的变体.请先尝试以下Edit > Preferences > Appearance > Graphics设置No antialiasing然后再尝试以下操作Highest quality.还可以尝试两者之间的设置.对我来说,除此之外的任何设置No antialiasing都不顺利.我可以在视觉上区分三种不同级别的AA,所以这不是我的GPU强迫所有或没有,但所有这些都很慢.

Animate[Plot3D[{x^2 + y^2, -x^2 - y^2}, {x, -2, 2}, {y, -2, 2},
  ImageSize -> 700,
  ViewPoint -> 
   Dynamic[{Sin[theta] Cos[phi], Sin[theta] Sin[phi], Cos[theta]}]],
 {theta, 0, Pi}, {phi, 0, 2 Pi},
 RefreshRate -> 120
]
Run Code Online (Sandbox Code Playgroud)

更新和观察

在玩Alexey和Mike的代码时,发生了一些奇怪和好事.我突然有光滑的抗锯齿旋转!我不知道是什么导致了这种变化,我还没有关闭Mathematica,因为担心它会消失,但这证明了我所怀疑的,它可以很快.

更奇怪的是,我在同一个笔记本中并行发生了缓慢而快速的行为.一个图形平滑旋转,另一个图形生成相同的代码是不连贯的.我推测通过运行Alexey和Mike的代码修改了一些单元格选项,它具有非常理想的效果.我会尽力弄清楚它是什么.


RotationAction -> "Clip", SphericalRegion -> True偶然出现在Alexey的代码中的有用选项.这些,或者它们的效果(ViewAngle),以与旋转相同的方式"粘贴"图形,因此我能够在没有这些选项的情况下键入新代码,并运行它,并且仍然可以获得平滑旋转(这解释我在上面看到的).请参阅下面的答案进行详细说明.

虽然已经发现了一个可行的解决方法,但我仍然对使用AA进行不稳定旋转的解释感兴趣.我不认为图形的"拟合"是一种解释,而只是一种相关性,因为拟合仍然需要在AA关闭的情况下进行,然而旋转是平滑的.

Mik*_*ley 7

在Wizard先生指出改变ViewAngle提高性能之后,我对这是什么造成了预感.

通常,当您在Mathematica中旋转图形时,您会注意到包含图形的框在图像旋转时会自行调整大小.为什么?大多数设置都设置为默认设置Automatic,因此他们试图摆弄,使图形在屏幕内很好地适应.具体来说,Plot3D(和许多其他3D Plot函数)都有一个名为的参数RotationAction.根据Mathematica文档:

默认情况下,3D图形会在交互式旋转时调整大小并移动以适应

此参数默认为RotationAction->"Fit",尝试始终确保整个3D图形适合屏幕.相反,您可以使用强制图形剪辑RotationAction->"Clip".这会使边界框保持不变.它不是调整大小,而是仅仅关闭屏幕上的任何内容.由于Mathematica无需不断重塑图像以使所有内容都适合屏幕,因此性能得到了显着提升.

示例代码:

Plot3D[{x^2 + y^2, -(x^2 + y^2)}, {x, -2, +2}, {y, -2, +2}, 
 ImageSize -> 700, RotationAction -> "Fit"]

Plot3D[{x^2 + y^2, -(x^2 + y^2)}, {x, -2, +2}, {y, -2, +2}, 
 ImageSize -> 700, RotationAction -> "Clip"]
Run Code Online (Sandbox Code Playgroud)

进一步说明

经过进一步分析,RotationAction->"Clip"最初有一些轮换问题.在图形的第一次旋转时,它旋转得非常快.我不知道为什么会这样,只有Wolfram Research可能会回答这个问题.然而,在初始旋转之后,它以正常速度旋转,如同任何其他图形一样.

通过以下方式给出了为我完成良好旋转的最顺畅的方法:

 Plot3D[..., RotationAction -> "Clip", ViewAngle -> 0.4]
Run Code Online (Sandbox Code Playgroud)

这与尽可能接近默认剪裁体积一样,没有任何与快速旋转或切断图形有关的奇怪问题.

  • Wolfram应该认真考虑记录这个选项会对性能产生重大影响的事实 (2认同)

Mr.*_*ard 2

我似乎发现了\xe2\x80\x94 对于我的配置\xe2\x80\x94 一个神奇的选项,允许在完全抗锯齿打开的情况下实现平滑的 3D 旋转。这适用于我尝试过的每种 3D 绘图类型,因此除非这也神奇地停止工作,否则我有我的解决方案。我很想知道这对其他系统是否有同样的效果。

\n\n

选项是ViewAngle. 任何数值似乎都有效;Automatic才不是。

\n\n

评估第一个图形下方的代码旋转效果不佳,而第二个图形旋转平滑。

\n\n
Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}, ImageSize -> 900]\n\nPlot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}, ImageSize -> 900, ViewAngle -> 0.43]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

我对迈克的RotationAction -> "Clip"方法有疑问,因为旋转图形时会出现意外且有时极端的裁剪。但是,添加SphericalRegion -> True会恢复我使用 得到的行为ViewAngle,并且角度会自动选择:

\n\n
Plot3D[{x^2 + y^2, -(x^2 + y^2)}, {x, -2, +2}, {y, -2, +2}, \n ImageSize -> 700, SphericalRegion -> True, RotationAction -> "Clip"]\n
Run Code Online (Sandbox Code Playgroud)\n