来自 rgl/persp3d 的 3D 模型在旋转时闪烁
3D model from rgl/persp3d flickers when rotating
用鼠标闪烁旋转我的 rgl
模型(注意模型底部的黑线,旋转时会四处乱跳)。这是错误还是我的代码有问题?
install.packages("rgl")
library(rgl)
x <- seq(-pi, pi, len = 10)
y <- seq(-pi, pi, len = 10)
f <- function(x, y) { r <- sqrt(x^2 + y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp3d(x, y, z, col = "Red")
surface3d(x, y, z, back = "lines")
surface3d(x, y, z, front = "lines")
我的环境
R version 3.4.1 (2017-06-30)
Platform: x86_64-apple-darwin16.7.0 (64-bit)
Running under: macOS Sierra 10.12.6
rgl_0.98.1
闪烁的通常原因是舍入误差:您在同一个地方重叠绘制三个表面,但使用不同的方法来显示它们("fill",默认值和 "lines"。每个你对 surface3d
的调用两者都做。)不同的方法被用来计算每个像素的深度,有时一个出现在前面,有时另一个出现,即使第一个表面(红色的)应该赢在任何情况下,除非您修改了 material3d("depth_test")
.
在 rgl 中很难做你想做的事。您可以使固体表面半透明,例如
persp3d(x, y, z, col = "red", alpha = 0.8)
surface3d(x, y, z, front = "lines", back = "lines")
但这并不完美。如果您编写 "shader",您可能会做得更好,但这很难,并且仅在 WebGL 中受支持。
如果您稍微移动线条表面并使用 depth_test
,例如
,您的特定示例的最佳显示可能会出现
persp3d(x, y, z, col = "red")
surface3d(x, y, z+0.01, front = "lines", back = "lines", depth_test = "lequal")
surface3d(x, y, z-0.01, front = "lines", back = "lines", depth_test = "lequal")
但是移动的量和方向取决于您要显示的内容,因此这并不总是容易实现。
用鼠标闪烁旋转我的 rgl
模型(注意模型底部的黑线,旋转时会四处乱跳)。这是错误还是我的代码有问题?
install.packages("rgl")
library(rgl)
x <- seq(-pi, pi, len = 10)
y <- seq(-pi, pi, len = 10)
f <- function(x, y) { r <- sqrt(x^2 + y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp3d(x, y, z, col = "Red")
surface3d(x, y, z, back = "lines")
surface3d(x, y, z, front = "lines")
我的环境
R version 3.4.1 (2017-06-30)
Platform: x86_64-apple-darwin16.7.0 (64-bit)
Running under: macOS Sierra 10.12.6
rgl_0.98.1
闪烁的通常原因是舍入误差:您在同一个地方重叠绘制三个表面,但使用不同的方法来显示它们("fill",默认值和 "lines"。每个你对 surface3d
的调用两者都做。)不同的方法被用来计算每个像素的深度,有时一个出现在前面,有时另一个出现,即使第一个表面(红色的)应该赢在任何情况下,除非您修改了 material3d("depth_test")
.
在 rgl 中很难做你想做的事。您可以使固体表面半透明,例如
persp3d(x, y, z, col = "red", alpha = 0.8)
surface3d(x, y, z, front = "lines", back = "lines")
但这并不完美。如果您编写 "shader",您可能会做得更好,但这很难,并且仅在 WebGL 中受支持。
如果您稍微移动线条表面并使用 depth_test
,例如
persp3d(x, y, z, col = "red")
surface3d(x, y, z+0.01, front = "lines", back = "lines", depth_test = "lequal")
surface3d(x, y, z-0.01, front = "lines", back = "lines", depth_test = "lequal")
但是移动的量和方向取决于您要显示的内容,因此这并不总是容易实现。