Tutorial für Orgre3d für PB?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Tutorial für Orgre3d für PB?

Beitrag von tft »

Hallo,

Ich ging bisher davon aus das man für die Verwendung von Ogre keine externe API benötigt. Die Befehle
sind in PB bereits integriert. Bestimmt nicht alle, aber ich denke die Meisten die wichtig sind. Ich habe mich
bisher nur mit den PB eigenen Engin3D Befehlen befast. Das ganze fust auf Ogre.
Das ist alles unter "3D Spiele & Multimedia Libraries" zusammen gefast. Und die Deutsche übersetzung ist
gut. Lediglich die sache ... wie manche dinge zusammen funktionieren sind nicht sonderlich erklärt.

Gruss TFT

PS: Ich habe gerade im Forum für allgemeines einen Post gemacht wo ein 3D Programm läuft das auf Ogre basiert.
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Tutorial für Orgre3d für PB?

Beitrag von GPI »

Ich arbeite Gerade ein Tutorial für Orge durch und glaub mir, da wurde massiv viel angepasst. Oft wird in der Anleitung (ich nehme die englische) nicht mal erwähnt, was für Werte man da eingeben kann. Oft werden Floats hergenommen, ohne das sie gekennzeichnet werden. Das ist mehr oder minder Try&Error was ich da gerade mache....
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Tutorial für Orgre3d für PB?

Beitrag von tft »

Hallo,
um die Problematik mit der Kamera näher zu betrachten, sind einige Grund dinge voraus zu setzen.
Um #pb_parent zu verwenden muss die Kamera an einer Node hängen , die Position in der Welt ergibt sich aus , Position von Parent in der Welt + die Locale
Position relativ zu Parent.
#pb_world bewegt die Kamera immer relativ in der Welt, weil die Welt immer bei 0,0 ihre Mitte hat.
#pb_local bewegt die Kamera ohne Node relativ in der Welt und mit Node relativ zum Parent . Denn die Node ist in diesem
fall der Parent der Kamera.
Diese Situation gilt für alle Objecte. Ob Node,Entity oder Welt. Wobei Objecte damit nicht so gemeint sind wie beim OOP.
Sondern eher für alles steht, was sich drehen und bewegen lässt.

Hoffentlich bringt das jetzt nicht noch mehr Verzweiflung auf.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Tutorial für Orgre3d für PB?

Beitrag von GPI »

ich würde sagen fast richtig :)

#pb_local bewegt immer relativ zur Aktuellen Position und in Blickrichtung des Objects. Absolut würde auch keinen Sinn hier machen.

#pb_parent - wenns an keinen Node hängt, ist es identisch mit den Weltkoordinaten. Wichtig ist hier aber, wenn das Parent "verdreht" ist, dann beachtet das #pb_parent. Es ist also nicht nur die Kordinaten, sondern auch blickrichtung. Bspw. Wenn das Parent nicht nach norden, sondern osten blickt, dann ist ein Schritt vorwärts mit #pb_parent ein schritt nach osten, ein Schritt vorwärts mit #pb_world ein Schritt nach norden!

Aber hier der versprochene Codefetzen:

Code: Alles auswählen

#Move_Direction       =#PB_Local
#Move_ParentRelative  =#PB_Parent|#PB_Relative
#Move_ParentAbsolute  =#PB_Parent|#PB_Absolute
#Move_WorldRelative   =#PB_World|#PB_Relative
#Move_WorldAbsolute   =#PB_World|#PB_Absolute
Procedure Node_Move(*self.sNode,x.f,y.f,z.f,mode=#Move_ParentRelative)
      Select mode
        Case #Move_WorldAbsolute
          MoveNode(*self\handle,
                   x- NodeX( *self\handle,#PB_Absolute),
                   y- NodeY( *self\handle,#PB_Absolute),
                   z- NodeZ( *self\handle,#PB_Absolute),
                   #PB_World)
        Case #Move_WorldRelative
          MoveNode(*self\handle,x,y,z,#PB_World)
        Case #Move_Direction
          MoveNode(*self\handle,x,y,z,#PB_Local)
        Case #Move_ParentAbsolute,#PB_Absolute
          MoveNode(*self\handle,x,y,z,#PB_Absolute)
        Case #Move_ParentRelative,#PB_Relative
          MoveNode(*self\handle,x,y,z,#PB_Relative)
      EndSelect
    EndProcedure
 Procedure Camera_Move(*self.sCamera,x.f,y.f,z.f,mode=#Move_ParentRelative)
      ;Rotate(pitch.f,yaw.f,roll.f,mode=#PB_Absolute)
      Protected ox.f,oy.f,oz.f,ow.f
      Select mode 
        Case #Move_Direction
          MoveCamera(*self\handle,x,y,z,#PB_Local)
        Case #Move_ParentAbsolute,#PB_Absolute
          MoveCamera(*self\handle,x,y,z,#PB_Absolute)
        Case #Move_ParentRelative,#PB_Relative
          MoveCamera(*self\handle,x,y,z,#PB_Relative)
        Case #Move_WorldRelative
          FetchOrientation(CameraID(*self\handle),#PB_Relative)
          CameraDirection(*self\handle,0.0,0.0,-1.0)
          MoveCamera(*self\handle,x,y,z,#PB_Local)
          SetOrientation(CameraID(*self\handle),GetX(),GetY(),GetZ(),GetW())
        Case #Move_WorldAbsolute
          FetchOrientation(CameraID(*self\handle),#PB_Relative)
          CameraDirection(*self\handle,0.0,0.0,-1.0)
          MoveCamera(*self\handle,
                     x-CameraX(*self\handle,#PB_Absolute),
                     y-CameraY(*self\handle,#PB_Absolute),
                     z-CameraZ(*self\handle,#PB_Absolute),
                     #PB_Local)
          SetOrientation(CameraID(*self\handle),GetX(),GetY(),GetZ(),GetW())
          
      EndSelect 
      
    EndProcedure
Der Code ist notwendig, weil es bspw kein #pb_world|#pb_absolut gibt. Es ist immer relativ. Lösen kann man es, indem man die Weltkordinaten abzieht und so das Object wieder "Nullt" und dann in die gewünsche Richtung gehe.
#PB_Local hab ich in "#Move_Direction" umbenannt, weil es imo für mich mehr Sinn ergibt. Man muss sich das wie ein Ferngesteuertes Auto vorstellen, genauso verhält es sich.
#PB_Parent|#pb_absolute bzw #PB_Parent|#pb_relative verhält sich so, wie ich es erwarte.

Eine Besonderheit ist die Camera. Da gibts einfach - aus welchen Gründen auch immer - kein #pb_world. Ich hab das so gelöst, das ich die Kamera wieder "Auf Null/Norden" ausrichte, dann entspricht #pb_local quasi #pb_world|#pb_relative und dann entsprechend bewege und die Kamera wieder zurückdrehe. Da ja kein "RenderWorld()" kommt, merkt der Spieler davon nichts.

Wie gesagt, ich hab geflucht. Ich hab halt festgestellt, das nur #pb_absolute, #pb_relative, #pb_world und #pb_local Sinn machen. Also von kombinieren kann nicht die Rede sein. ich müsste nochmal probieren (keine lust gerade ;) - aber #pb_parent|#pb_absolute verhält sich wie #pb_parent|#pb_relative. Nur #pb_absolute alleine hat funktioniert und ist dann absolut von #pb_Parent :)

Ganz komische Geschichte.... Sollte das mal gefixted werden, dann kann ich mit meiner Procedure einfach anpassen und es ist überall dann richtig. Ich bau eh gerade alle PB-Engine3D-Befehle in Klassen um. Von daher, egal was kommt, ich kanns einfach wieder umbiegen :)

Mein persönliches Highlight aktuell:
https://www.purebasic.com/documentation ... point.html
und
https://www.purebasic.com/documentation ... ition.html

Erstmal schön, das eines ein "Get" an Anfang hat, das andere nicht. Und laut Beschreibung machen beide das gleiche, nur das eine hat mehr Parameter. Erklärt wird allerdings nichts....
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Tutorial für Orgre3d für PB?

Beitrag von tft »

Hallo,

da halte ich doch glat mit der deutschen übersetzung mit.

Code: Alles auswählen

GetTerrainTileHeightAtPoint()

Syntax

Ergebnis = GetTerrainTileHeightAtPoint(#Terrain, TileX, TileY, x, y)
Beschreibung

Gibt die Höhe des Terrain-Tile (Kachel im Gelände) an der angegebenen Position zurück. 
Parameter

#Terrain Das zu verwendende Terrain.  
TileX Der 'x' Index des Tile (Kachels).  
TileY Der 'y' Index des Tile (Kachels).  
x Die 'x' Position im Tile (in Pixel), um die Terrain-Höhe zu ermitteln.  
y Die 'y' Position im Tile (in Pixel), um die Terrain-Höhe zu ermitteln.  

Rückgabewert

Gibt die Höhe (in Welt-Einheiten) des Terrain-Tile an der angegebenen Position zurück. 
Siehe auch

CreateTerrain(), SetTerrainTileHeightAtPoint() 
Unterstützte OS 

Alle

ist doch voll logisch ... oder ?
Mit diesem Befehl ermittelt man den Abstand in z/welt zur Kachel. Das wird benötigt, damit ein Object das sich an der Position x,y befindet weis
wie-weit der Abstand zum Boden ist. Dazu musst du aber wissen über welcher Kachel du dich befindest. Was ja relativ einfach zu ermitteln ist.

Code: Alles auswählen

TerrainTileHeightAtPosition()

Syntax

Ergebnis = TerrainTileHeightAtPosition(#Terrain, TileX, TileY, Layer, x, y)
Beschreibung

Gibt die Höhe des Terrain-Tile (Kachel im Gelände) an den angegebenen Koordinaten zurück. 
Parameter

#Terrain Das zu verwendende Terrain.  
TileX Der 'x' Index des Tile (Kachels).  
TileY Der 'y' Index des Tile (Kachels).  
Layer Der Index des Layers (der Ebene). Der Index des ersten Layers beginnt bei 0. Die maximale Zahl an Layern wird beim Erstellen des Terrain definiert, siehe hierfür CreateTerrain().  
x Die 'x' Position im Tile (in Pixel), um die Terrain-Höhe zu ermitteln.  
y Die 'y' Position im Tile (in Pixel), um die Terrain-Höhe zu ermitteln.  

Rückgabewert

Gibt die Höhe des Terrain-Tile (in Welt-Einheiten) an den angegebenen Koordinaten zurück. 
Siehe auch

CreateTerrain() 
Unterstützte OS 

Alle

und da eine Kachel mehrere Ebenen haben kann, gibt es noch diesen hier.

über die Namensgebung einiger Funktionen lässt sich streiten.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Antworten