7
votes

Comment augmenter la douceur des sphères3D dans RGL

Quand j'utilise rgl :: spheres3d () code>, les sphères rendues ont des bords faces de facettes clunky.

spheres = data.frame(x = c(1,2,3), y = c(1,3,1),
                     color = c("#992222" , "#222299", "#229922"))
open3d()
spheres3d(spheres$x, spheres$y, radius = 1, color = spheres$color)

r rgl

0 commentaires

6 Réponses :


2
votes

Ce n'est pas facile; Je pense si vous voulez faire cela, vous allez avoir à

  • Téléchargez le Source RGL de Cran
  • Déballez-le et modifiez la ligne 24 de src / sphhereset.cpp , qui est actuellement xxx

    pour appeler la fonction avec des valeurs plus grandes (cette fonction est définie sur la ligne 25 de src / spheremesh.cpp ; les arguments sont in_segments et in_sections ...)

    • construire / installer le package à partir de la source; Cela nécessitera non seulement les outils de compilation standard, mais également les bibliothèques OpenGL pertinentes (sur un système d'exploitation de Debian Linux, vous pouvez utiliser sudo apt-get Build -p R-Cran-RGL pour les obtenir, je pense ...)

      Je n'ai pas essayé cela. Bonne chance ... alternativement, vous pouvez demander au responsable de l'emballage de faire un paramètre réglable via matériaux3D ou d'une autre manière ...


1 commentaires

J'essaierais de télécharger la source, modifiant la ligne mentionnée ci-dessus et the description (code> (pour vous définir pour être le responsable), puis téléchargez-le via FTP sur win-builder.r-project.org



3
votes

Bien que RGL :: spheres3d () ne peut pas faire cela, une alternative consiste à écrire votre propre fonction pour dessiner des sphères. Voici une fonction qui rend une sphère comme une grille de quadrilathereaux espacée à des degrés égaux de latitude et de longitude. XXX

Il devrait être possible de s'améliorer à ce sujet, par exemple en utilisant icosphère (c.-à-d. Dessiner la sphère comme icosohedron étiré). Mais cette version dessine déjà de très bonnes sphères si vous faites des lats et des longs suffisamment haut.

Un exemple de la fonction en action: xxx

entrez Description de l'image ici


1 commentaires

Oui, dessiner votre propre sphère est la voie à suivre. Une amélioration possible si vous voulez qu'une seule couleur est que vous pouvez dessiner une seule sphère et la réutiliser comme un sprite 3D. Cela enregistre la mémoire, ce qui n'a probablement pas d'importance dans R, mais fera une différence notable de la taille du fichier si vous exportez la scène à l'aide de rglwidget () .



3
votes

Une approche beaucoup plus simple consiste à utiliser subdivision3d () . Ici, profondeur = 4 n'est pas tout ce qui est lisse, mais vous pouvez augmenter cela. xxx

 Entrez la description de l'image ici


3 commentaires

L'ajout de normales le rend encore mieux. Vous pouvez le faire en ajoutant sphère $ normales <- SPHERE $ VB pour une sphère ou plus généralement forme <- addnormals (forme) .


J'aime la simplicité de cette approche. Et il peut être amélioré en utilisant dodécaèdre3d () plutôt que cube3d () . Malheureusement, cela ne fonctionne pas pour les sphères haute résolution. Si j'augmente la profondeur supérieure à 6, j'ai tendance à obtenir des erreurs d'allocation de la mémoire. Cela dit, Dodecaedron3D à la profondeur 6 a l'air assez passable, si quelque peu lent à traiter


Suite à mon dernier commentaire, ajoutez la suggestion de @ user2554330 d'ajouter des normales à icosaedron3d () subdivisé à la profondeur 6, fait de très belles sphères



2
votes

Voici mon approche en utilisant persp3d.function () xxx

 Entrez la description de l'image ici


2 commentaires

Cela fait de très belles sphères en douceur et est nettement plus rapide de traiter que ma fonction à base de QMESH3D. La seule chose qui me retient d'accepter cette réponse est que les sphères ont des défauts autour des pôles, où il y a des lacunes dans la surface et une légère crête à l'équateur où les deux hémisphères ne correspondent pas tout à fait. Avez-vous des idées sur la manière de résoudre ces problèmes?


@dww; Malheureusement, cela semble impossible. Il y a des méthodes pour exprimer une sphère avec deux variables. Mais la zone de densité faible ou élevée et / ou des points dupliqués se posent de quelque manière que ce soit.




0
votes

Une autre possibilité est d'utiliser la fonction vcgsphere du package rvccg . xxx

 Entrez la description de l'image ici < / a>


0 commentaires