旋转时rgl / persp3d的3D模型闪烁

时间:2017-08-19 09:41:59

标签: r rgl

用鼠标闪烁旋转我的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

Flickers on the underside of the image

1 个答案:

答案 0 :(得分:1)

闪烁的常见原因是舍入错误:你在同一个地方过度绘制三个曲面,但使用不同的方法来显示它们(“填充”,默认和“行”。每次调用{{1两种情况都有。)不同的方法被用来计算每个像素的深度,有时一个出现在前面,有时是另一个,即使第一个表面(红色表面)应该在每种情况下都胜出,除非你已修改users-count

rgl很难做你想做的事情。您可以使固体表面半透明,例如

private final JTextField searchText;
searchText= new JTextField(20);  
JButton go=new JButton("Go!!");
        go.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        String query=searchText.getText();




                       Coordinate p = JMapViewer.getPosition(SearchAction.search(query));
                         LayerGroup search=new LayerGroup("Search");
                        Layer searchGroup=search.addLayer("Search Layer");
                          String res= map().getName();
                        double latpos=p.getLat();
                          double lonpos=p.getLon();
                         MapMarkerDot show=new MapMarkerDot(searchGroup,query,latpos,lonpos);

                    }

            private String search(String query) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            private String searchAction(String query) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

                });

但它并不完美。如果你写一个“着色器”,你可能会做得更好,但这很难,并且只在WebGL中支持。

如果您稍微移动线条表面并使用surface3d进行播放,则可能会出现针对您的特定示例的最佳显示,例如

material3d("depth_test")

但转移的数量和方向取决于您要显示的内容,因此这并非易事。