Coin3D: An die Childs einer Node rankommen
-
Ich habe in meinem Programm einen Szenengraph, unter anderem ein Spielbrett mit Spielfeldern (jeweils ein Cube, sieht aus wie ein Schachbrett)) enthält. Nun bin ich gerade an einer Funktion, die mir die Position eines Spielfeldes zurückgibt:
SbVec3f Gameboard::getPositionOfPiece(int index) { SbVec3f position; position=m_pSeparator[index]->boardTranslation.getValue(); return position; }Ich bekomme aber folgenden Fehler: 'boardTranslation' : is not a member of 'SoSeparator'. Dabei hat m_pSeparator[index] sehr wohl einen Child namens "boardTranslation". Aber wieso findet der den nicht?
-
Da musst du schon n bißchen mehr Code posten. Und warum eigentlich SoSeparator?
-
Keine Ahnung wieso SoSeparator... aber ich merke gerade, ich sollte mal findChild und getChild mit dem dazugehörigen Index probieren. Vielleicht kann ich boardTranslation nicht direkt sondern nur über den Index ansprechen...
Mehr Code kann ich Dir nicht geben, der Rest würde den Thread sprengen

-
OK, machen wir es mal abstrakter, das sollte mir auch helfen:
Nehmen wir an, ich habe folgenden Szenengraph:
SoSeparator *root = new SoSeparator; SoCone myCone = new SoCone; SoTranslation *myTranslation = new SoTranslation; myTranslation->translation.setValue(1,2,3); root->addChild(myTranslation); root->addChild(myCone);Wie kann ich später aus einer anderen Methode heraus den Translationswert auslesen?
-
OK, hat sich erledigt, SoTranslation bietet kein getValue()
Deswegen gehts nicht... muss ichs anders berechnen
-
Child vielleicht, Member nicht.
Bye, TGGC (Keine Macht den Dummen)
-
Hallo,
OK, hat sich erledigt, SoTranslation bietet kein getValue()
Wieso bietet SoTranslation kein "getValue()"?
Mach doch einfach
SoTranslation *transNode = new SoTranslation(); SbVec3f transVec = transNode->translation.getValue();Zu deiner ersten Frage wie du den SoTranslation-Node wiederfinden kannst. Wenn du weisst, dass der Translationsknoten sich unterhalb eines bestimmten Knotens befindet, gehst du einfach alle Kinder durch und schaust, ob es ein SoTranslation ist (mit isOfType(SoTranslation::getClassTypeId()) ).
Oder du benutzt gleich eine SoSearchAction und suchst von deinem Wurzelknoten an.MFG
MacMike
-
So, jetzt bin ich wieder an diesen Punkt angekommen, wo ich nicht weiss, wie ich an die Eigenschaften eines Childs komme. Diesmal muss ich seinen Wert ändern:
Ich habe einen Roboterarm, d.h. einen SoSeparator m_pGrabber, der jede Menge Childs hat, darunter viele SoRotation, SoTranslation und Polygone. 2 von den etwa 10 Rotations brauche ich für eine eindeutige Ausrichtung. Einer dieser Knoten heisst z.B. leftrightRotation (also ein Child von m_pGrabber). Aber wie ändere ich jetzt nachträglich den Rotation-Wert? Ich habe erstmal das hier probiert:
int childindex = m_pGrabber->findChild(leftrightRotation);Aber da bekomme ich ein undeclared identifier. Auch als String verkleidet will er den Knoten nicht suchen. Wie komme ich denn jetzt auf meinen speziellen Rotationsknoten, damit ich ein setValue() ausführen kann?
-
MoinMoin,
int childindex = m_pGrabber->findChild(leftrightRotation);Aber da bekomme ich ein undeclared identifier. Auch als String verkleidet will er den Knoten nicht suchen. Wie komme ich denn jetzt auf meinen speziellen Rotationsknoten, damit ich ein setValue() ausführen kann?
Wenn du mal ein wenig nachdenkst bzw. in die Coin3d Doku schaust, sollte dir klar werden, dass das, was du da versucht hast, Schwachsinn ist. findChild gibt den Index eines übergebenen SoNode's in der Liste der Child's zurück. Wenn du ihm den richtigen SoNode, also den gesuchten SoRotation-Knoten, übergeben würdest, bräuchtest du da nicht nach suchen.
Also iteriere über alle Childs und schaue, ob es der gesuchte Knoten ist:
for (int i = 0; i < m_pGrapper->getNumChildren(); i++) { SoNode *currentChild = m_pGrapper->getChild(i); if (currentChild->getName() == "leftrightNode") { // do something } }currentChild musst du dann noch auf SoRotation casten und dann setValue ausführen.
MFG
MacMike