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

rgl:如何避免透明3D椭球体中的莫尔效应?,3d,rgl,3d,Rgl,在我的heplots软件包中,我绘制了假设和误差三维椭球来表示多元线性检验。 我发现当H椭球体实际上只有2D时,我得到了一个令人不快的莫尔效应,如下图所示。 请注意,错误椭球体不存在此缺陷 在此MWE中调用heplot3d,不指定线框,而是使用曲面的透明着色 library(rgl) library(heplots) data(penguins, package="palmerpenguins") peng <- penguins peng.mod0 <-lm(

在我的
heplots
软件包中,我绘制了假设和误差三维椭球来表示多元线性检验。 我发现当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)
图书馆(七楼)
数据(企鹅,package=“palmerpenguins”)

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

避免这种情况的最简单方法是在调用中使用
back=“cull”
来绘制椭球体。这样的话,背部就不会被拉伤,事情看起来会好得多

两个椭球相交的地方仍然会有问题;解决这个问题更难。您需要将红色椭球体分解为蓝色椭球体两侧的部分,然后分别绘制它们。可能还需要分别绘制红色部分和蓝色部分的外部部分。现在使用
clipMesh3d
函数可以实现这些功能,但很难做到正确

编辑以添加:

这里更好的解决方案是在绘制透明椭球体时设置
depth\u mask=FALSE
。(这是另一个材质属性,默认为
TRUE
)以下是说明:

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

  • 很难决定对透明对象使用哪种设置。因为它们是在绘制之前排序的,所以深度遮罩应该无关紧要,但因为排序只是近似的,所以有时会有所帮助。在本例中,您正在绘制两个形状,它们的深度完全相同,直到舍入误差为止。使用
    depth\u mask=TRUE
    ,有时第二个图形不会绘制,因为舍入误差使其看起来更远。如果设置
    depth\u mask=FALSE
    ,将始终绘制这两个选项,并且椭圆看起来更好。这并非适用于所有形状,但在本例中,它是有效的

  • 我做过的一些计算建议在
    alpha>0.5
    时使用
    depth\u mask=TRUE
    ,对于较小的
    alpha
    值,使用
    depth\u mask=FALSE


谢谢;据我所知,当椭球体是平面(2d)时,我只需要使用
back=“cull”
。我试试看。我不太担心交点。我认为这是可行的,尽管舍入误差可能意味着非常薄但不太平的椭球也会出现问题。在我的使用案例中,3D椭球只有整数维(协方差矩阵的秩),但有些3D椭球可能确实非常平,即使在数学上不是平面。我会接受这个答案,因为它解决了我提出的问题。