2017-04-08 8 views
0

J'écris un force-directed graph tridimensionnel dans SceneKit où je modélise des noeuds comme des sphères physiques avec des charges et des masses fixes.Comment combiner des champs de physique dans SceneKit?

Ces sphères doivent exercer les champs gravitationnels et électriques radiaux afin d'obtenir la dynamique nécessaire:

En général, les forces d'attraction printanières basé sur la loi de Hooke sont utilisés pour attirer les paires de points d'extrémité des bords du graphique l'un vers l'autre, tout en simultanément des forces répulsives comme celles des particules chargées électriquement basées sur la loi de Coulomb sont utilisées pour séparer tous les paires de nœuds.

Le problème se pose lorsque l'on remarque que SCNNode offres, mais une seule propriété physicsField.

Actuellement, je ne vois aucun moyen d'accomplir cela sans avoir deux nœuds physiques séparés occupant le même espace (beurk et impossible?). J'ai essayé d'insérer des corps d'enfant avec des corps physiques statiques/dynamiques afin d'accommoder plusieurs champs, mais cette approche ne semble pas fonctionner du tout (c'est-à-dire que rien ne se passe).


Sur une note un peu connexe - le moteur de SceneKit physique se sent assez incomplète pour moi, étant donné que le dessin graphique-force dirigée 3D tombe sous utilisation typée de ces cadres. Par exemple, SceneKit ne dispose pas d'une version 3D de SKPhysicsJointSpring, ce qui rend extrêmement pénible l'implémentation de la physique d'attraction de périphérie de nœud à nœud. Bien qu'il fonctionnalité SCNPhysicsBehavior, il n'existe pratiquement aucune documentation sur la sous-classe pour créer des comportements personnalisés.

Pire encore, l'interface publique offre aucune méthode pour passer outre, ce qui en fait inverse ingénierie risqué et dangereux pour l'utilisation App Store:

open class SCNPhysicsBehavior : NSObject, NSSecureCoding { 
} 

Répondre

0

Avertissement: Je n'ai pas écrit de code SceneKit et ce est juste basé sur la lecture des documents, alors s'il vous plaît prendre cette réponse avec un grain de sel de bonne taille. Un SCNPhysicsField détermine la façon dont la position des nœuds affectés change au fil du temps. Il est facile de gérer un champ à la fois, mais ce n'est pas le cas lorsque différents types de champs interagissent. Je soupçonne qu'il n'est pas possible d'être à la fois correct et rapide pour calculer l'effet de plusieurs champs affectant un nœud simultanément, et c'est pourquoi vous ne pouvez pas avoir des combinaisons de physicsField s sur un nœud à la fois.

Vous pouvez cependant créer un champ personnalisé dans SceneKit avec SCNPhysicsField.customField() et appliquer ce champ uniquement aux enfants du nœud du champ. Ensuite, dans votre implémentation de SCNFieldForceEvaluator, vous pouvez effectuer des calculs en manipulant vous-même la loi de Hooke et la loi de Couloumb pour positionner tous les nœuds enfants. Un moyen plus simple mais moins précis (et je ne sais pas si cela fonctionnerait) serait de le faire purement en utilisant des champs électriques, avec la polarité d'un nœud enfant étant opposée à celle de son nœud parent.

+0

L'utilisation pure de champs électriques ne fonctionnerait certainement pas. –

+0

Ce ne serait pas la même chose que d'utiliser les lois de Hooke et Coulumb, mais il semble que cela pourrait servir de base à une visualisation graphique. Pouvez-vous expliquer pourquoi vous dites que cela ne fonctionnerait pas? – roop