rgl:如何避免透明3D椭球中的莫尔效应?

问题描述

在我的heplots包中,我绘制了假设和错误3D椭圆形,以表示多元线性检验。 我发现,当H椭球实际上只有2D时,我会得到令人讨厌的波纹效果,如下所示。 请注意,错误椭球不会遭受此缺陷。

此MWE中对heplot3d的调用未指定线框,但使用了表面的透明阴影。

library(rgl)
library(heplots)
data(penguins,package="palmerpenguins")

peng <- penguins
peng.mod0 <-lm(cbind(bill_length,bill_depth,flipper_length,body_mass) ~ species,data=peng)
heplot3d(peng.mod0,shade=TRUE,shade.alpha=0.2,wire=FALSE,size="effect")

是否有任何方法可以修改此函数中的代码来避免此问题?是什么原因造成的?这可能与表面的法线有关吗?

enter image description here

解决方法

这里的问题是椭圆体的前表面和后表面在同一平面上绘制。 rgl绘制透明对象的方式取决于从后到前对对象进行排序,但是只能大致做到这一点:两个相交三角形的不同部分将需要不同的排序。 在您的示例中,rgl试图对扁平椭球体的正面和背面进行排序,但是数值错误意味着它会随机化绘制顺序,并且看起来真的很丑。

避免这种情况的最简单方法是在调用中使用back = "cull"绘制椭圆形。这样一来,背面完全不会被拉出来,而且看起来会更好。

两个椭球相交仍然存在问题;修复起来比较困难。您需要将红色椭圆形分解成蓝色椭圆形的每一侧,并分别绘制。可能还需要将红色部分内部的蓝色部分与外部部分分开绘制。这些功能现在可以使用clipMesh3d函数了,但是很难解决。

已编辑添加:

一种更好的解决方案是在绘制透明椭圆体时设置depth_mask = FALSE。 (这是另一个重要属性,默认为TRUE。)这是解释:

  • “深度蒙版”确定绘制对象是否会阻止后面绘制的对象后面的对象可见。不透明的对象应始终使用depth_mask = TRUE绘制,因为它们应始终隐藏其背后的内容。

  • 确定用于透明对象的设置比较困难。由于它们是在绘制之前进行排序的,因此深度蒙版不重要,但是由于排序只是近似的,因此有时会有所帮助。在您的情况下,您要绘制两个在相同深度处的形状,直至舍入误差。使用depth_mask = TRUE时,有时不会绘制第二个,因为舍入误差使它看起来更远。如果设置depth_mask = FALSE,则两者都将始终绘制,并且椭圆看起来更好。并非所有形状都正确,但是在这种情况下可以。

  • 我所做的一些计算建议在depth_mask = TRUE时使用alpha > 0.5,对于较小的depth_mask = FALSE值使用alpha

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...