 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Volz Guest
|
Posted: Fri Oct 14, 2005 5:39 pm Post subject: Skelett, Referenz, Pointer anlegen... |
|
|
Hi,
ich möchte ein Skelettsystem für meine 3D-Applikation verwalten.
Ich lese also alle Knochen in eine std::map ein und lege dann die
Pointer jeweils so an, dass ich Vater- und Kindknochen erreichen kann.
class Bone
{
private:
std::string name;
public:
... [Daten]
std::vector <Bone*> child_bones;
Bone *parent_bone;
Bone ();
~Bone ();
std::vector <Bone*> &getChildren () {return child_bones;}
std::string getName () {return name;}
void setName (std::string name) {this->name = name;}
};
typedef std::map <std::string, Bone> BoneMap;
Schleife zum einlesen und verzeigern der Knochen:
...
// add child bone to parents bone
bone_map[bone_name].child_bones.push_back (&bone_map[value]);
// add parent bone to child bone
Bone &parent_bone = bone_map[bone_name];
bone_map[value].parent_bone = &parent_bone;
Allerdings funktioniert das ganze nicht mehr sobald ich Daten
verändere während des Programmablaufs. Die Knochen welche ich über
child_bones oder parent_bone erreiche sind wohl nicht die selben
Objekte wie die in bone_map vorhandenen.
Sinn der Sache war eigentlich für die Vater- und Kindstruktur immer nur
Pointer auf die Objekte in der Map anzulegen. Irgendwie funktioniert
das so aber nicht. Mir ist noch eingefallen, dass ich irgendwo meine
gelesen zu haben man darf Referenzen nicht dereferenzieren. Dann wäre
das oben wohl nicht so gut. Aber wie soll ich es sonst machen?
Oder ist meine ganze Datenstruktur ungünstig für diesen Zweck. Wäre es
empfehlenswert nicht alle Knochen in einer großen map oder einem vector
anzulegen und dann zu verzeigern, sondern die Knochen gleich an der
richtigen Stelle richtig abzulegen. Allerdings dauert es dann evtl.
etwas länger einen bestimmten Knochen in der Knochenstruktur anhand
seines Namen zu finden, weil man erst alle durch laufen muss.
Kann mir jemand weiter helfen?
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Fri Oct 14, 2005 6:04 pm Post subject: Re: Skelett, Referenz, Pointer anlegen... |
|
|
On Fri, 14 Oct 2005 19:39:34 +0200, Andreas Volz
<usenet-spam-trap (AT) brachttal (DOT) net> wrote:
| Quote: | Hi,
ich möchte ein Skelettsystem für meine 3D-Applikation verwalten.
Ich lese also alle Knochen in eine std::map ein und lege dann die
Pointer jeweils so an, dass ich Vater- und Kindknochen erreichen kann.
|
Eine sehr interessante Problemstellung...
| Quote: | class Bone
{
private:
std::string name;
public:
... [Daten]
std::vector <Bone*> child_bones;
Bone *parent_bone;
|
Ist es nicht möglich, dass ein Knochen mehrere Parents haben könnte?
Oder, dass die Eltern-Kind-Beziehung nicht immer greift? Ich denke
dabei an den Unterarm, der ja aus zwei Knochen, und an den Oberarm,
der dagegen nur aus einem besteht. In der einen Richtung macht das
durchaus Sinn, die zwei Unterarmknochen als Kinder des Oberarms
abzubilden. Wie verhält es sich aber mit dem darunterliegenden
Handgelenk, das aus einer Vielzahl an kleinen Knochen besteht, und mit
der Handwurzel, die dann auf einmal weniger Knochen aufweist, als das
Handgelenk? Ist es überhaupt möglich, die einzelnen Knochen der
Handwurzel jeweils einem einzigen Knochen des Handgelenks eindeutig
zuzuweisen?
Wie verhält es sich z.B. mit dem Schädel, der aus mehreren
nebeneinanderliegenden Platten besteht? Ich stelle mir vor, dass eine
Baumstruktur viel geeigneter wäre, ein Skelett abzubilden. Die
Boost-Library hat dazu eine ganze Unterbibliothek "graph library", die
Hilfe bieten könnte:
http://www.boost.org/
Da ich aber bisher noch nicht viel mit Graphs oder Bäumen zu tun
hatte, werde ich hier die Hilfe jemandem Anderen überlassen.
| Quote: | Bone ();
~Bone ();
std::vector <Bone*> &getChildren () {return child_bones;}
std::string getName () {return name;}
void setName (std::string name) {this->name = name;}
};
typedef std::map <std::string, Bone> BoneMap;
Schleife zum einlesen und verzeigern der Knochen:
...
// add child bone to parents bone
bone_map[bone_name].child_bones.push_back (&bone_map[value]);
// add parent bone to child bone
Bone &parent_bone = bone_map[bone_name];
bone_map[value].parent_bone = &parent_bone;
Allerdings funktioniert das ganze nicht mehr sobald ich Daten
verändere während des Programmablaufs. Die Knochen welche ich über
child_bones oder parent_bone erreiche sind wohl nicht die selben
Objekte wie die in bone_map vorhandenen.
Sinn der Sache war eigentlich für die Vater- und Kindstruktur immer nur
Pointer auf die Objekte in der Map anzulegen. Irgendwie funktioniert
das so aber nicht. Mir ist noch eingefallen, dass ich irgendwo meine
gelesen zu haben man darf Referenzen nicht dereferenzieren. Dann wäre
das oben wohl nicht so gut. Aber wie soll ich es sonst machen?
Oder ist meine ganze Datenstruktur ungünstig für diesen Zweck. Wäre es
empfehlenswert nicht alle Knochen in einer großen map oder einem vector
anzulegen und dann zu verzeigern, sondern die Knochen gleich an der
richtigen Stelle richtig abzulegen. Allerdings dauert es dann evtl.
etwas länger einen bestimmten Knochen in der Knochenstruktur anhand
seines Namen zu finden, weil man erst alle durch laufen muss.
Kann mir jemand weiter helfen?
Gruß
Andreas
|
--
Bob Hairgrove
[email]NoSpamPlease (AT) Home (DOT) com[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Sat Oct 15, 2005 9:46 am Post subject: Re: Skelett, Referenz, Pointer anlegen... |
|
|
Am Fri, 14 Oct 2005 20:04:03 +0200 schrieb Bob Hairgrove:
| Quote: | Ist es nicht möglich, dass ein Knochen mehrere Parents haben könnte?
Oder, dass die Eltern-Kind-Beziehung nicht immer greift? Ich denke
dabei an den Unterarm, der ja aus zwei Knochen, und an den Oberarm,
der dagegen nur aus einem besteht. In der einen Richtung macht das
durchaus Sinn, die zwei Unterarmknochen als Kinder des Oberarms
abzubilden. Wie verhält es sich aber mit dem darunterliegenden
Handgelenk, das aus einer Vielzahl an kleinen Knochen besteht, und mit
der Handwurzel, die dann auf einmal weniger Knochen aufweist, als das
Handgelenk? Ist es überhaupt möglich, die einzelnen Knochen der
Handwurzel jeweils einem einzigen Knochen des Handgelenks eindeutig
zuzuweisen?
|
Ein Kind hat immer nur einen Vater. Die Struktur ist natürlich
anatomisch nicht ganz korrekt. Ich halte mich da an die Vorgehensweise
einschägiger 3D-Modeller (hier: Blender). Mit dieser Struktur kommt man
ganz gut zurecht. Zudem müssen anders als in der Realität zwischen
Knochen nicht unbedingt eine feste Verbindung sein. Hauptsache ihre
Bewegung folgt dem Vaterknochen.
| Quote: | Wie verhält es sich z.B. mit dem Schädel, der aus mehreren
nebeneinanderliegenden Platten besteht? Ich stelle mir vor, dass eine
Baumstruktur viel geeigneter wäre, ein Skelett abzubilden. Die
Boost-Library hat dazu eine ganze Unterbibliothek "graph library", die
Hilfe bieten könnte:
http://www.boost.org/
|
Das ist ja echt genial! Momentan funktioniert meine selbst gebastelte
Struktur relativ gut. Mal von dem Problem das ich gerade habe
abgesehen. Ich hab momentan auch nicht die Zeit das umzustellen. Aber
boost ist sehr mächtig. Ich bin am überlegen das ganze umzuschreiben
oder mit boost zu reimplementieren. Das ganze dienst momentan nur dem
Sinn erstmal das ganze Thema zu verstehen.
| Quote: | Da ich aber bisher noch nicht viel mit Graphs oder Bäumen zu tun
hatte, werde ich hier die Hilfe jemandem Anderen überlassen.
|
Wie gesagt, ich brauche momentan weniger Hilfe bei der Struktur als bei
einem C++ Problem.
| Quote: | // add child bone to parents bone
bone_map[bone_name].child_bones.push_back (&bone_map[value]);
// add parent bone to child bone
Bone &parent_bone = bone_map[bone_name];
bone_map[value].parent_bone = &parent_bone;
|
Vielleicht muss ich das Problem etwas abstrakter ausdrücken. Ich möchte
einen Pointer auf ein Objekt anlegen welches in einem Container (z.B.
map oder vector) abgelegt ist. Diese Objektidentität will ich ändern
können. Das eben einmal indem ich mir ganz normal die Referenz aus dem
Container hole und zum anderen möchte ich an geigneter Stelle eben
einen Zeiger ablegen der mich genau zu diesem Objekt in dem Container
führt. Ist das so möglich?
Die einzigen anderen Lösungen die mir einfallen sind eben in dem
Container keine Objekte, sondern Zeiger abzulegen und die Objekte mit
new zu verwalten. Dann kann ich ja mit dem Pointer darauf arbeiten wo
ich will. Die andere Lösung wäre eben in dem Baum statt Pointer auf
Kinder und Vater nur einen Knochennamen (im Fall Skelett-Map) oder einen
Knochenindex (in Fall vector) abzulegen. Das echte Objekt bekomme ich
dann eben durch direkten Zugriff auf den Container. Ich bastele mir
also sozusagen eine Alternative zu einem Zeiger.
Gibt es dazu irgendwelche Anmerkungen?
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Oct 17, 2005 11:50 am Post subject: Re: Skelett, Referenz, Pointer anlegen... |
|
|
Andreas Volz wrote:
| Quote: |
Hi,
Sinn der Sache war eigentlich für die Vater- und Kindstruktur immer nur
Pointer auf die Objekte in der Map anzulegen. Irgendwie funktioniert
das so aber nicht. Mir ist noch eingefallen, dass ich irgendwo meine
gelesen zu haben man darf Referenzen nicht dereferenzieren. Dann wäre
das oben wohl nicht so gut. Aber wie soll ich es sonst machen?
Oder ist meine ganze Datenstruktur ungünstig für diesen Zweck.
|
Ich denke das ist der Fall.
Du modelierst im Grunde ja eine Baumstruktur. Wenn Deine programminterne
Struktur daher ebenfalls eine Baumstruktur ist, dann ist das normalerweise
nicht allzu falsch.
| Quote: | Wäre es
empfehlenswert nicht alle Knochen in einer großen map oder einem vector
anzulegen und dann zu verzeigern, sondern die Knochen gleich an der
richtigen Stelle richtig abzulegen.
|
Genau das.
| Quote: | Allerdings dauert es dann evtl.
etwas länger einen bestimmten Knochen in der Knochenstruktur anhand
seines Namen zu finden, weil man erst alle durch laufen muss.
|
Nun. Du kannst immer noch eine map machen, die einen Namen mit
einem Pointer auf den richtigen Bone verknuepft. Sowas wie
ein 'Stichwortverzeichnis'. Nur musst Du es halt immer am
laufenden halten.
Ansonsten: Was erwartest Du fuer eine Baumgroesse? Wieviele
Knoten enthaelt der Baum typischerweise? Wie oft musst Du tatseachlich
einen Bone ueber den Namen finden?
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Mon Oct 17, 2005 2:15 pm Post subject: Re: Skelett, Referenz, Pointer anlegen... |
|
|
Am Mon, 17 Oct 2005 13:50:00 +0200 schrieb Karl Heinz Buchegger:
| Quote: | Allerdings dauert es dann evtl.
etwas länger einen bestimmten Knochen in der Knochenstruktur anhand
seines Namen zu finden, weil man erst alle durch laufen muss.
:-)
Nun. Du kannst immer noch eine map machen, die einen Namen mit
einem Pointer auf den richtigen Bone verknuepft. Sowas wie
ein 'Stichwortverzeichnis'. Nur musst Du es halt immer am
laufenden halten.
|
Momentan hab ich es genau umgekehrt gemacht. Ich habe die map mit den
Knochen und eine Skelettstrukur in Baumform. Jeder dieser hat einen
vector<string> child_bones und string parent_bone. Wenn ich jetzt den
Vater oder Sohn brauche gehe ich mit dem string in die map und hole
den Bone. Das ist natürlich nicht so effektiv wie anders rum. Eben
aufgrund der häufigkeit der Zugriffe.
| Quote: | Ansonsten: Was erwartest Du fuer eine Baumgroesse? Wieviele
Knoten enthaelt der Baum typischerweise? Wie oft musst Du tatseachlich
einen Bone ueber den Namen finden?
|
Zuerst war ich mir nicht sicher, weil ich noch nicht wusste wie genau
der Algorithmus abläuft. In jedem Fall sind es weit unter hundert
Knochen. Der aktuelle Algorithmus sieht vor den Knochen pro Frame
#Knochen-mal pro Animationsframe per Namen zu holen. Doch ich hoffe den
Algorithmus noch so verbessern zu können, dass er nur einmal pro Frame
geholt werden muss. Wenn man die Matrix-Berechnungen dagegen stellt ist
das schon verschindend wenig.
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|