JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Parent und Childobjekte

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 11:53    Titel: Parent und Childobjekte Antworten mit Zitat

Hallo,

(vorweg: Objekte == Meshes)
ich hab mal wieder ein Gedankenproblem. Ich moechte gern, wie die Ueberschrift schon sagt, Parent und Childobjekte realisieren. Ich haette das gerne so, dass ich ein "Mutterobjekt" habe und dazu 3-4 Childobjekte, die genau das tun, was die Mutter macht, also direkt verlinkt sind. D.h. wenn die Mutter ausgewaehlt wird, sind automatisch auch alle Childs angewaehlt. Wenn sich die Mutter zu einem Fleck bewegt, tun das auch ale Childs.
Jetzt hab ich schon gegruebelt und gedacht. Meine bisherige Loesung war, dass jedes Objekt beim erstellen eine ID bekommt. Wenn diese ID mit IDs anderer Objekte uebereinstimmt, ist das die Gruppe. Das Problem ist jetzt nur, wie ich dann die Aktionen ausfuehre? ICh durchlaufe immer eine Liste mit allen Objekten meiner Welt. Dann kann ich die IDs abfragen und gut. Nur was dann? Wie selektiere ich jetzt erstmal alle mit der ID? Auch eine Flag setzen, die dann z.B. auf True zeigt? Und das Groeßte Problem - wie kann man die Teile in einer gewissen Formation behalten? Wenn ich jetzt einen Zielpunkt zuweisen wuerde, rennen alle auf den gleichen Punkt zu, so das am Schluß rein optisch nur noch ein Objekt bleibt. Die sollen ja aber nen gewissen Abstand haben zueinander??

Vielen Dank fuer Anregungen und Infos...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:00    Titel: Antworten mit Zitat

Die Meshes sind doch bestimmt Objekte, oder?
Du könntest in der Klasse eine Liste von Children nutzen und eine Append Funktion, die ein Child hinzufügt. Wenn das Parent ausgewählt wird, läufst du durch die Liste und wählst alle Childs. Die Bewegung bekommst du mit Hilfe von MatrixStack sehr einfach hin.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:15    Titel: Antworten mit Zitat

Hallo,

danke schon mal fuer die Antwort, aber:

Zitat:

Du könntest in der Klasse eine Liste von Children nutzen und eine Append Funktion, die ein Child hinzufügt. Wenn das Parent ausgewählt wird, läufst du durch die Liste und wählst alle Childs.


Die Meshes sind Objekte ja. Aber den Satz, man moege mir verzeihen Crying or Very sad , verstehe ich nicht so ganz? NAch welchen Kriterien fuege ich die denn in die Liste ein und waehle sie wieder aus? Oder meinst du fuer jedes Objekt eine eigene Childliste?

Und hilf mir: Was ist ein Matrixstack?? Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:22    Titel: Antworten mit Zitat

Für jedes Objekte eine eigene Childliste, ist doch vertretbar, oder?
Schau dir mal D3DXCreateMatrixStack() in der DX-Hilfe an.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:25    Titel: Antworten mit Zitat

Hallo,

*g* ja zwischenzeitlich bin ich auf Umwegen nach der Matrix Stack fuendig geworden. Hatte es nur falsch geschrieben Wink

Das mit der Liste. Hmmm.... aber die Sache ist ja, das ich aktiv ja nur ein Objekt anwaehlen kann und ihm alle anderen ja nachrennen sollen. Wenn ich die Liste durchgehe, muesste ich ja aber alle anwaehlen? Oder meinst du den Objekten nur eine Flag verpasen, so dass sie wissen - ab jetzt nachrennen...?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:30    Titel: Antworten mit Zitat

Nein, dass sollte mit dem Matrixstack automatisch gehen. Ich habe das so gelöst, dass ich eine Liste von Childs pro Objekt habe. Die Child speichern nicht die absolute Position, sondern nur ihre Transformation bezogen auf das Parent. Mit dem MatrixStack kannst du dann dafür sorgen, dass die Transformationsmatrixen von oben (parent) bis zu den childs durchmultipliziert werden. Wenn sich das parent bewegt, bewegen sich somt auch automatisch die childs.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:42    Titel: Antworten mit Zitat

Hey das geht ja fast wie im Chat hier Wink

Also du meinst, ich sollte diese Objekte in der Liste nur fuer den Matrix Stack haben? Du hast das benutzt? Ich hab mir das jetzt ein paar Mal durchgelesen, weiß aber eigentlich nicht so recht, was damit anfangen? Wo werden denn diese Matrizen benutzt, oder wie ueberhaupt?

Ich zaehle meine Matrizen nur einmal beim Rendern zusammen. Wie kann ich denn da jetzt sowas einbauen??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 12:49    Titel: Antworten mit Zitat

Hallo,

ich mache es so.

Code:

void CMeshSceneNode::Render(LPD3DXMATRIXSTACK pMatrixStack)
{
   std::list<CSceneNode*>::iterator it;

   if(pMatrixStack)
   {
      pMatrixStack->Push();

      pMatrixStack->MultMatrixLocal (&m_matNode);
      CDirect3D::GetDevice()->SetTransform(D3DTS_WORLD,pMatrixStack->GetTop());
   }
   else
   {
      CDirect3D::GetDevice()->SetTransform(D3DTS_WORLD,&m_matNode);
   }

   if(m_pMesh)
   {      
      m_pMesh->Render();
   }

   for(it=m_listChildren.begin();it!=m_listChildren.end();it++)
   {
      (*it)->Render(pMatrixStack);
   }   


   if(pMatrixStack)
   {
      pMatrixStack->Pop();
   }
}



Was genau ist dir an dem MatrixStack und der Liste nicht klar?

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 13:25    Titel: Antworten mit Zitat

Ohh ok.. danke Christian. Nur damit niemand sagen kann ich haette Sourcecode verlangt - du hast in freiwillig gepostet Very Happy Wink

Nein zurueck:
An der Liste.... hmmm. Ich hab das jetzt so verstanden (ganz bildlich visualisiert):
Ich habe ein Objekt A das in die Welt gesetzt wird. Zu diesem Objekt A werden noch drei andere gleichen Typs in die Welt gesetzt, die aber alles das machen, was das Erste auch tut? Damit die Objekte zu A dazugehoeren, wird mit A eine Liste initialisiert in der alle anderen auch drinnen stehen, mit ihrere Initialposition und was eben noch so alles anfaellt? Sehe ich das richtig? Das ist jetzt bildlich gesprochen, da ich es im Code noch nicht verstanden hab, aber egal.

Jetzt kommt der Matrixstack ins Spiel. Eigentlich weiß ich ehrlich gesagt nicht mal genau was der tut, resp. wie er es tut. Ich weiß zwar was die Befehle machen (push, identity ...), aber nicht warum und vor allem wie er dann die Objekte zwar zu einem Ziel fuehrt aber nicht eben genau auf den Zielpunkt?
Zu deutsch: was tut dieser Stack?

BTW: Warum uebergibst du deiner Renderfunktion den Stack?? Wo wird denn der bei dir erzeugt? Im Konstruktor?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 14:17    Titel: Antworten mit Zitat

Das ein Objekt Kind eines anderen ist macht nur dann Sinn, wenn sie auch eine Beziehung zueinandern haben. Z.b. Bein hängt am Körper, Fuß hängt am Bein usw. Der Körper wäre das Parent, Bein ein Child, Fuß ein Child vom Bein:

Code:

      Körper
        |
  Bein1, Bein2
    |       |
   Fuß     Fuß



C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 14:23    Titel: Antworten mit Zitat

Hmmm ne. Bei mir sollens keine Koerperteile oder aehnliches sein, sondern Objekte, die zu einer Art "Gruppe" gehoeren. Also meinetwegen eine Gruppe von 3 Raumschiffen, die immer zusammenbleiben und alle das gleiche machen, dennoch einzelne Objekte sind...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 14:30    Titel: Antworten mit Zitat

Das ein Objekt Kind eines anderen ist macht nur dann Sinn, wenn sie auch eine Beziehung zueinandern haben. Z.b. Bein hängt am Körper, Fuß hängt am Bein usw. Der Körper wäre das Parent, Bein ein Child, Fuß ein Child vom Bein:

Code:

      Körper
        |
  Bein1, Bein2
    |       |
   Fuß     Fuß


Wenn du jetzt den Körper bewegst, ist es doch toll, wenn die Beine direkt mikommen, oder?

Der Matrixstack:

Die Koordinaten der Beine werden nicht in Weltkoordinaten sondern lokal zum Körper gespeichert. Der Matrixstack sorgt jetzt dafür, dass die Matrizen richtig gesetzt werden. Angenommen der Körper hat die Koordinaten 0,0,0 das Bein 1,1,0, der Character soll an Position 5,0,5 in der Welt angezeigt werden.

Beim ersten Aufruf von Render mit der Matrix die angibt, wo sich der Körper in der Welt befinden soll. Dann wird die lokale Matrix des Körpers mit der obersten im Matrixstack multipliziert. Damit hat der Körper die richtige Position in der Welt (5,0,5). Die ursprüngliche Matrix wird (vorher) auf den Stack gepusht. Danach kommt das Bein an die Reihe, die Matrix wird wieder gepusht und die lokale Matrix wird multipliziert, Bein ist dann an Position (6,1,5). Dann kommt der Fuß.... Danach geht es wieder hoch bis zum nächsten Bein und die Matrixen werden wieder gepopt.

Christian

Christian


C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 14:44    Titel: Antworten mit Zitat

Aha... das heißt also, dass es mit mehreren einzelnen Objekten, die eben alle zusammen was amchen mueesen das auch geht, oder??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 08.10.2003, 14:51    Titel: Antworten mit Zitat

Du kannst ja in jedem child einen zeiger auf das mutter objekt speichern.
Die childs fragen dann, wo sich das mutter-objekt gerade befindet und nähern sich, bis sie einen bestimmten mindest-abstand zur mutter erreicht haben.

Damit die child objekte nicht alle auf einem haufen stehen kannst du ja noch
einen bereich um jedes child objekt definieren, indem sich kein anderes aufhalten darf.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum