Problem mit Gruppen aus einem Mesh extrahieren

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

fliege

Betreff: Problem mit Gruppen aus einem Mesh extrahieren

BeitragMo, Jan 30, 2006 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Freue mich natürlich über jede Antwort
Fliege

Mr.Keks

BeitragMo, Jan 30, 2006 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
was in milkshape gruppen sind, sind in b3d surfaces, denke ich..
MrKeks.net
 

fliege

BeitragMo, Jan 30, 2006 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, das ist schonmal gut zu wissen Very Happy
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.. ?
 

Ava

Gast

BeitragDi, Jan 31, 2006 2:52
Antworten mit Zitat
Schau Dir mal die Befehle CountSurfaces(mesh) und GetSurface(mesh,index) an! Smile
 

KhanLeo

BeitragMi, Jun 30, 2010 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 01, 2010 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 01, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 :

user posted image

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

BeitragFr, Jul 02, 2010 6:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 02, 2010 11:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 02, 2010 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 02, 2010 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 02, 2010 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 .... Wink

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 Wink
Blitz3D 1.94
Milkshape 1.8.5

BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group