如何解决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")
是否有任何方法可以修改此函数中的代码来避免此问题?是什么原因造成的?这可能与表面的法线有关吗?
解决方法
这里的问题是椭圆体的前表面和后表面在同一平面上绘制。 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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。