Problem mit Gruppen aus einem Mesh extrahieren
Übersicht

fliegeBetreff: Problem mit Gruppen aus einem Mesh extrahieren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie könnte ich eine Gruppe aus einem beliebigen Mesh extrahieren (also *.3ds, *.b3d, *.x, *.md2)?
Ich habs mit FindChild versucht, doch leider findet er nichts, Parameter stimmen aber alle. Gibts da eine andere Möglichkeit die einzelnen Gruppen eines Meshes anzusteuern? Ich arbeite hauptsächlich mit Milkshape3D, wär also sehr nett, wenn mir jemand erklärt, wie man das in Milkshape machen könnte ![]() Freue mich natürlich über jede Antwort Fliege |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
was in milkshape gruppen sind, sind in b3d surfaces, denke ich.. | ||
MrKeks.net |
fliege |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay, das ist schonmal gut zu wissen ![]() Laut der Angabe des Befehls "FindSurface" http://www.blitzbase.de/befehle3d/findsurface.htm braucht die Funktion einen Pinsel um ein Surface zu finden. Was muss ich angeben, wenn ich ein nicht texturiertes Objekt verwende? Gibt es da keine Möglichkeit nach Namen zu suchen? Fliege |
||
Wer weiß was kommt.. ? |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Schau Dir mal die Befehle CountSurfaces(mesh) und GetSurface(mesh,index) an! ![]() |
||
KhanLeo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
ich teste ein bißchen mit B3D rum zum Kennenlernen und stehe gerade vor dem selben Problem : ich möchte ein Raumschiff mit "Schadenszonen" bauen. Ich habe nachfolgenden Code benutzt : Code: [AUSKLAPPEN] ;initilisieren
resX = 1024 resY = 768 MidResX = resX / 2 MidResY = resY / 2 Dim arrObjectInfoText$(4) Dim arrChildren$(2, 10) Global g_SelectedObject Graphics3D resX, resY, 16, 1 MoveMouse MidResX, MidResY crosshair = LoadImage("ressources/images/crosshair.bmp") Type tNode Field TypeHandle ;ID des Types-Objektes Field TypeEntityID ;ID des Child-Meshes Field NodeText$ ;Anzeigetext im Spiel Field NodeType$ ;Knotentype ID Field NodeHealth# ;Knotengesundheit in % (= Modifikator für Knotenaktivität) End Type ;Test Schiff Global defaultShip = LoadAnimMesh("ressources/models/miranda.b3d") ;Kamera CameraPivot = CreateSphere(8) Global Camera = CreateCamera(CameraPivot) PositionEntity Camera, 0, 15, -150 ;Event-Knoten erstellen For i = 1 To CountChildren(defaultShip) tmpChildHandle%=GetChild(defaultShip, i) fctCreateNode(EntityName$(tmpChildHandle%), tmpChildHandle%, i) Next tmpChildHandle%=GetChild(defaultship, 1) ;Hauptschleife While Not KeyHit(1) SetBuffer BackBuffer() ;Bewegung der Kamera per Tastatur If KeyDown(203) Then TurnEntity CameraPivot, 0, -1, 0 ;nach links drehen If KeyDown(205) Then TurnEntity CameraPivot, 0, 1, 0 ;nach rechts drehen If KeyDown(200) Then TurnEntity CameraPivot, 1, 0, 0 ;nach oben drehen If KeyDown(208) Then TurnEntity CameraPivot, -1, 0, 0 ;nach unten drehen ;Maus-Eingaben ;Objekt auswählen If MouseDown(1)=1 Then ;Hier wird der Wert von PickedEntity() nur CameraPick(camera,MouseX(),MouseY()) ;einmalig genutzt (wenn der Nutzer die Maustaste drückt) g_SelectedObject = PickedEntity() ;So wird das in fctObjectInfo auf 0 gesetzte g_SelectedObject End If If g_SelectedObject <> 0 Then fctObjectInfo() ;Tastatur-Eingaben (erstmal zu Testzwecken) Select True Case KeyHit(30) ;= "A" ;fctDestroyNode Case KeyHit(31) ;= "S" ;fctRepairNode End Select ;3D-Operationen UpdateWorld RenderWorld ;2D-Operationen Color 255,255,255 Text 10, 0, "Mouse X : " + MouseX() Text 10, 15, "Mouse Y : " + MouseY() Text 10, 30, "Object : " + g_SelectedObject Text 10, 45, "Children : " + CountChildren(defaultShip) Text 10, 60, "Surfaces : " + CountSurfaces(defaultShip) DrawImage crosshair, MouseX()-16, MouseY()-16 ;Cursor Image ist 32 x 32 Pixel groß If g_SelectedObject <> 0 Then fctShowObjectInfo End If ;Darstellung auf dem Bildschirm Flip Wend Function fctCreateNode.tNode(ndText$, ndHandle%, x) Local pntNewNode.tNode pntNewNode= New tNode pntNewNode\TypeHandle=Handle(pntNewNode) pntNewNode\TypeEntityID= ndHandle% pntNewNode\NodeType$= "???" pntNewNode\NodeText$= ndText$ pntNewNode\NodeHealth%= 100 NameEntity pntNewNode\TypeEntityID, pntNewNode\TypeHandle EntityPickMode pntNewNode\TypeEntityID, 3 arrChildren$(1, x) = pntNewNode\TypeEntityID arrChildren$(2, x) = pntNewNode\NodeText$ ;test = CreateCube() ;PositionEntity test, EntityX(ndHandle%), EntityY(ndHandle%), EntityZ(ndHandle%) End Function Function fctObjectInfo() ;Objekt unter dem Mauszeiger wählen und projezierte 2D-Koord. an die Funktion "ObjectInfo" übergeben. ;diese erstellt die Objekt-Info und zeigt sie an CameraProject Camera, EntityX(g_SelectedObject, 1), EntityY(g_SelectedObject, 1), EntityZ(g_SelectedObject, 1) tmpTypeHandle = Int(EntityName(g_SelectedObject)) pntNode.tNode = Object.tNode(tmpTypeHandle) arrObjectInfoText$(0) = pntNode\NodeText$ arrObjectInfoText$(1) = pntNode\NodeType$ arrObjectInfoText$(2) = pntNode\NodeHealth% arrObjectInfoText$(3) = pntNode\TypeHandle + " / " + pntNode\TypeEntityID End Function Function fctShowObjectInfo() tmpColor% = Int(arrObjectInfoText$(2)) Select tmpColor% Case tmpColor% > 60 Color 0,255,0 Case tmpColor% > 25 Color 0,255,255 Case tmpColor% <= 25 Color 255,0,0 End Select tmp2D_X = ProjectedX() ;projezierte 2D X-Koord. tmp2D_Y = ProjectedY() ;projezierte 2D Y-Koord. Rect tmp2D_X-25, tmp2D_Y-25, 50, 50, 0 Text tmp2D_X+53, tmp2D_Y-50, arrObjectInfoText$(0) Text tmp2D_X+53, tmp2D_Y-35, arrObjectInfoText$(1) Text tmp2D_X+53, tmp2D_Y-20, arrObjectInfoText$(2) Text tmp2D_X+53, tmp2D_Y-5, arrObjectInfoText$(3) End Function Das model habe ich mit Milkshape editiert : es hat 3 Gruppen (Root, Warp1, Warp2) und 2 Joints (bridge, Warp1). Die Joints werden als Children erkannt, die Gruppen aber gar nicht. Auch der Tipp mit den Surfaces funzt nicht, es wird nur eine Surface angezeigt, es müßten doch 3 sein ? Trotz 2-tägiger Suche habe bisher ich leider nichts finden können, was mir weiterhilft. Daher bitte ich um Hilfe zum Grundverständnis : kann man mit Milkshape überhaupt ein model so erstellen, dass in B3D implizite Model-Informationen in "Children" umgesetzt werden ? Wenn ja, wie ? Und wenn nicht, wie sollte mans dann machen ? Muss man wirklich jede Schadenszone als separates mesh laden und dann das Ganze zusammenfriemeln ? Download : Test mesh Danke im Voraus für deine Hilfe Lars |
||
Blitz3D 1.94
Milkshape 1.8.5 BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2 |
vanjolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Kahn
kurz gesagt: In Milkshape gibt es keine Gruppen. Du kannst zwar gruppieren damit fügst du aber einzelne Teile zusammen. Childs heißen in Milkshape Joints. Diese must Du setzen und mit den Vertics verbinden. Das ist alles. |
||
***************************
in Entwicklung: Tank Battles - Panzeraction Pacific Battles - Rundenstrategie abgeschlossenes Projekt: Harrier Assault |
KhanLeo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi vanjolo,
habe deinen Tipp nach folgender Anleitung aus dem Web umgesetzt : Zitat: ... Dazu wähle "Joints" in Milkshape und dort den entsprechenden Animationspunkt aus, mit dem es verbunden werden soll z.B. 'Neck'. Unter "Groups" wähle nun das Objekt mit Select aus z.B. 'frame'. Klicke, wieder unter "Joints", auf "Assign" und die Zuordnung erfolgt und das Objekt folgt im Spiel den Bewegungen "Tutorial zum Erstellen von Accessoires aus Brillen - Sims 2 Package Editor"
Hat aber nicht zum gewünschten Ergebnis geführt. Vielleicht habe ich mein Anliegen auch nicht richtig erklärt : ich möchte, dass definierte Bereiche des meshes als eigentändige "Zone" gelten, um diese auf eine Kollision zu überprüfen oder sie anwählen zu können. Beispiel : Ich möchte die "Warp-Gondel" anwählen können, wenn ich irgendwo auf sie klicke (rot umrandet). Später sollen diese "Teile" auch auf Kollisionen überprüfbar sein. Bisher kann ich sie aber nur anwählen, wenn ich exakt den Joint treffe (grau umrandet). Wie kann ich das bewerkstelligen ? Bin dankbar für weitere Vorschläge Lars |
||
Blitz3D 1.94
Milkshape 1.8.5 BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2 |
vanjolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Setz den Joint mittig in die Gondel und wähle ihn unter Joints aus. Markier dann alle Vertices von der Gondel und verbinde diese mit dem Joint. Du kannst unter Joints die verbunden Vertics farblich anzeigen lassen. So siehst du was verbunden wurde.
Alternativ kannst du auch das Model aufteilen und die einzelnen Mesh seperat laden. |
||
***************************
in Entwicklung: Tank Battles - Panzeraction Pacific Battles - Rundenstrategie abgeschlossenes Projekt: Harrier Assault |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe eine Corvette mit 2 zusätzlichen Geschütztürmen in meinem Spiel drin.
Die 2 Türme sind eigentlich vollständige, eigene Objekte (auch separate Meshes und eigene KI-Führung) genauso wie das Schiff selber. Die sind nur miteinander (durch Parent/Child Verhältniß und durch Einheiten Type Logik) verbunden und die Turrets können sich nicht bewegen. Die haben auch ihre eigene Kollisionsobjekt. Außerdem die sind (wie ich das nenne) "Death Linked". Wenn das Hauptschiffsmodell (rumpf mit eine Bordkanone) zerstört wird, dann werden auch alle angehängte Turrets mitzerstört. Wenn aber nur ein Turret zerstört wird, dann tut sich bei den anderen Teilen nichts. Dieses System funktioniert recht gut. In deinem Fall müßte der Gondell aus deinem 3D Modeller als eigenständiger Mesh abgespeichert werden. Das Rumpf ohne Gondell auch. Der Gondell wird als Child an das Hauptschiffskörper angehängt. Wenn die so eigenständig sind, dann können sie auch alleine für sich selektiert und angegriffen werden. |
||
KhanLeo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo ihr beiden,
danke für eure Hilfe ! @ vanjolo : ich habe das linken wiefolgt in Milkshape durchgeführt : - Joint ausgewählt - vertexes ausgewählt - auf Tab "Joints" auf "Assign" geklickt. Wenn ich auf "SelAssigned" klicke, werden auch die vorher ausgewählten Vertexes als gelinkt angezeigt - hat soweit also geklappt. Exportiere ich das Ganze als .b3d, kann ich im Spiel aber immernoch nur direkt den Joint anwählen, nicht das umliegende Mesh. Liegt das vielleicht an meinem Code, mit dem ich den Aufrufe durchführe : Code: [AUSKLAPPEN] ;Objekt auswählen
If MouseDown(1)=1 Then CameraPick(camera,MouseX(),MouseY()) g_SelectedObject = PickedEntity() End If If g_SelectedObject <> 0 Then fctObjectInfo() @beide : die Idee mit den zusammenbasteln aus einzelnen Teilen hatte ich auch bereits, aber wie sieht das mit der Performance aus ? Ein Schiff besteht in meiner Vorstellung aus 7 - 20 Teilen (Rumpf, Power, Antrieb, u.U. mehrere Waffen und Schilde usw). Lanfristig möchte ich ein echtes kleines Spiel daraus machen, bei dem sich dann mehrere Schiffe gleichzeitig auf dem Bildschirm tummeln. Wenn dann z.B. 20 Schiffe dargestellt werden, sind das 140 - 400 Objekte plus Schüsse, Effekte usw. Schafft Blitz das darzustellen, ohne dass die Performance in die Knie geht ? Ich habe da einfach noch kein Gefühl, was Blitz zu leisten vermag. Und was mir noch einfiel : wenn ich die einzelnen Raumschiffteile zerstörbar machen will, müsste ich dann nicht in jedem Fall die Methode mit den einzelnen meshes umsetzen ? Download : Test Schiff Nochmals danke soweit für eure Hilfe Lars |
||
vanjolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe einfach mal ein Beispiel aus einem alten Projekt herauskopiert. Also der komplette Teil des Mesh (alle die darin vorkommenden Vertics "Punkte") werden durch den Aufruf des Joint angesprochen. Man muss nicht zwingend das Model aufteilen. Bei der Animation der Panzerkette Beispielsweise wurde das Mesh Kette getrennt und extra geladen.
Wieviel Meshteile du lädst ist unterheblich. Die Anzahl der Vertics ändert sich nicht. Code: [AUSKLAPPEN] Const BODY=1,WHEEL=2,SCENE=3,PROJ=4,ENEMY=5 ;Kollisionen Collisions BODY,SCENE,2,3 Collisions WHEEL,SCENE,2,3 Collisions PROJ,SCENE,2,1 Collisions PROJ,ENEMY,3,1 ;Panzer Mesh panzeriii_l = LoadAnimMesh("models\panzeriii_l.b3d") turm = FindChild (panzeriii_l, "turm") rohr = FindChild (panzeriii_l, "rohr") m_rohr = FindChild (panzeriii_l, "m_rohr") EntityParent rohr,turm EntityType panzeriii_l,BODY EntityRadius panzeriii_l,0.1,0.1 ;Kette des Spielers PanzerKette = LoadMesh("models\panzeriii_kette.b3d", panzeriii_l) chain_tex = LoadTexture("models\panzeriii_kette.png") EntityTexture PanzerKette,chain_tex ;.... und so weiter Bei Deinem Problem würde ich auch zu der Lösung tendieren das Modell entsprechend in einzelteile zu speichern und aufzurufen. Geht auch ganz einfach und schnell in Milkshape. Markiere einfach die Teile die Du nicht brauchst und lösche sie. Exportiere als z.b. miranda_rumpf.b3d dann geh wieder auf "undo" und lösche und exportiere den nächsten Teil. Btw: Dein Raumschiff Modell ist sehr schön erstellt. Freut mich das Du auch Milkshape verwendest. |
||
***************************
in Entwicklung: Tank Battles - Panzeraction Pacific Battles - Rundenstrategie abgeschlossenes Projekt: Harrier Assault |
KhanLeo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok,
dann baue ich die Schiffe aus Einzelteilen. Dank Parent/Children-System aus B3D ist es ja kein Problem, sie dann zusammenzufügen. Ich wollte halt mein Spiel nur nicht auf etwas aufbauen, was dann am Ende das Programm bei ein paar mehr Objekten in die Knie zwingt. Wundert mich einfach nur, dass das bei dir mit den Vertics verlinken funzt und bei mir nicht. Vielleicht komme ich irgendwann noch mal auf den Fehler. Danke soweit an alle für die Hilfe, wird wahrscheinlich nicht meine letzte Frage gewesen sein .... ![]() Lars P.S.: das modell habe ich nicht selbst erstellt (wäre schön), das habe ich aus ST Armada bzw. einen mod dafür. Die lassen sich prima in Milkshape importieren und konvertieren nach .b3d . Und Milkshape ist super einfach für kleinere Korrekturen zu bedienen ![]() |
||
Blitz3D 1.94
Milkshape 1.8.5 BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group