如何在RGL中制作更厚的飞机?

时间:2017-05-26 04:10:20

标签: r plot rgl

我将尝试使用3D打印数据为二进制分类示例制作一些很好的视觉插图。

这是我的3D情节:

require(rgl)
#Get example data from mtcars and normalize to range 0:1
fun_norm <- function(k){(k-min(k))/(max(k)-min(k))}
x_norm <- fun_norm(mtcars$drat)
y_norm <- fun_norm(mtcars$mpg)
z_norm <- fun_norm(mtcars$qsec)

#Plot nice big spheres with rgl that I hope will look good after 3D printing
plot3d(x_norm, y_norm, z_norm, type="s", radius = 0.02, aspect = T)
#The sticks are meant to suspend the spheres in the air
plot3d(x_norm, y_norm, z_norm, type="h", lwd = 5, aspect = T, add = T)
#Nice thick gridline that will also be printed
grid3d(c("x","y","z"), lwd = 5)

接下来,我想添加一个z = 0的平面,灵感来自描述Ian Walker编写的r2stl的this blog here。它应该是将所有东西组合在一起的印刷结构的基础。

planes3d(a=0, b=0, c=1, d=0)

然而,它没有体积,它是一块高度为0的薄板。我希望它为印刷结构奠定坚实的基础,这是为了将所有内容保持在一起(查看上述博客了解更多细节,他的例子很棒)。如何增加z = 0平面的厚度以达到相同的效果?

以下是导出为STL的最后一步:

writeSTL("test.stl")

根据Ian在博客中的建议,人们可以非常好地使用开源Meshlab来查看最终产品。

补充说明:我注意到,薄平面也与我在立方体的-z面上添加的网格是分开的并且是浮动的。这也可能在打印时导致问题。如何将网格与z = 0平面合并? (我会将STL文件发送给一位为我打印的朋友,我希望尽可能让他感觉轻松)

2 个答案:

答案 0 :(得分:1)

你不能让飞机变厚。你可以做一个坚实的形状(extrude3d()是要使用的功能)。它不会像飞机那样适应边界框,所以你需要最后绘制它。

例如,

example(plot3d)
bbox <- par3d("bbox")
slab <- translate3d(extrude3d(bbox[c(1,2,2,1)], bbox[c(3,3,4,4)], 0.5),
                    0,0, bbox[5])
shade3d(slab, col = "gray")

生成此输出:

sample output

这仍然不可打印(这些点没有支持),但它应该让你开始。

答案 1 :(得分:1)

matlib包中,有一个函数regvec3d(),用于绘制2-预测变量多元回归模型的向量空间表示。函数结果的绘图方法有一个参数show.base,用于绘制基础x1-x2平面,如果show.base >0则绘制得更厚。

这是一个简单的黑客,它只是在一个小的偏移处绘制第二个版本的平面。也许这对你的申请来说已经足够了。

if (show.base > 0) planes3d(0, 0, 1, 0, color=col.plane, alpha=0.2)
if (show.base > 1) planes3d(0, 0, 1, -.01, color=col.plane, alpha=0.1)