Seite 28 von 35

Verfasst: 31.12.2007 13:32
von tft
Hallo ..

ein Manual.... wäre echt klasse. Auch wenn ich die bedeutung einzelner Befehle auch so begreife. Ist mir das zusammenspiel der einzelnen Funktionen absolute unklar. Mann kann Nodes in die Colisions erkennung aufnehmen, das in verschiedenen Formen (Box,Sphere,Complex). Die Dimensionen werden aus den übergebene Mesh und Node daten übernömmen. Es gibt auch Funktionen um Seestrahl und x/y Cords zu prüfen.
Aber wie reagiert man darauf? Ich hätte erwartet das es über eine Callback funktion gemacht wird. Aber dazu habe ich bis jetzt noch nichts gefunden.
Es wird sicher was geben. Aber ich bin noch zu neu bei Irrlicht um das zu sehen. :-)

MfG und eine schönen neues Jahr, TFT

Verfasst: 31.12.2007 16:25
von Thalius
Bissl Geduld. Bin gerade dabei ein neues Manual System zu basteln- welches auch Useredits erlauben soll und webbasierend ist. Damit sollts einfacher sein für einige offensichtliche änderungen vorzunehmen. Imo bin ich durch 90% aller Funktionen durch und copy / paste imo alles rüber ( da ich irgendwo nen Bug für den Parser geschossen habe und das langsam richtig viel Text wird ).

Mache so schnells geht mit der neuen Manual - all meien Freizeit imo. Wenisgtens bin ich mit der Linux n stück weiter und fokussier mich wieder uaf die stable ( auch mein workprojekt ist endlich abgeschlossen ).

Bissl Geduld , bin leider ned so schnell wie Fred & Team mit Releases :)

Thalius

Verfasst: 31.12.2007 16:58
von tft
Hi ...

du machst das in der Freizeit ... da ist alle Zeit der Weld erlaubt. In der zwischenzeit werde ich eine Andere Lösung nehmen. Collision läst sich ja auch anders realisieren.

Verfasst: 31.12.2007 17:37
von Thalius
nah, spezifisch was willst du erreichen ( Collsionweise )? ich kann die nötigen funktionen auch schnell beschreiben . Siehe unten. Sollt mal Dinge bissl vereinfachen bis ich zum rest komm.

EDIT: ( working on... )
Mal etwas haesslich - aber imo hab ich nur zeit zwischen den reboots des servers an dem ich hier arbeite was zu hacken.

Code: Alles auswählen

NAME
IrrGetCollisionGroupFromComplexMesh() - creates a collision selector from a complex node like a map

SYNOPSIS

    *Collision = IrrGetCollisionGroupFromComplexMesh( *BSPMesh, *BSPNode )
INPUTS

   *BSPMesh           - pointer to our MeshObject 

   *BSPNode           - pointer to our Octree Scenenode
FUNCTION

   Creates a Triangle Selector, optimized by an octtree. 

   Triangle selectors can be used for doing collision detection. This triangle selector is optimized for huge amounts of triangles, it
   organizes them in an octtree. 

EXAMPLE

  *BSPMesh = IrrGetMesh( "media\map.dmf" ) ; This can be any Object or for example a precompiled Quake3 BSP Map

  *BSPNode = IrrAddMeshToSceneAsOcttree( *BSPMesh ) ; We add the mesh as Octree, because a map usually has alots of Triangles.

  ; the first thing we need to do with collision is to create an object called a

  ; selector that contains a selection of triangle to be used in the collision

  ; calculations there are a number of different ways of doing this depending on

  ; the type of mesh you are working with. in this example we are using the

  ; complex BSP map and therefore should use the following command



  *MapCollision = IrrGetCollisionGroupFromComplexMesh( *BSPMesh, *BSPNode ) 

  ; now we can add the sixth and final animator to our camera object, the collision

  ; animator...

  ; See Example 12 for action. ;) .

RESULT

    Pointer to a Triangle-Selector

--

 NAME

   IrrGetCollisionGroupFromBox() - Creates a simple dynamic TriangleSelector, based on a axis aligned bounding box. 

 SYNOPSIS

   *Collision = IrrGetCollisionGroupFromBox( *SceneNode )

 INPUTS

   *SceneNode           - pointer to our SceneObject 

 FUNCTION

   Creates a simple dynamic TriangleSelector, based on a axis aligned bounding box. 

   Triangle selectors can be used for doing collision detection. Every time when triangles are queried, the triangle selector gets the  bounding box 

   of the scene node, and creates new triangles. In this way, it works fine with animated scene nodes. 

 EXAMPLE

  

 RESULT

    Pointer to a Triangle-Selector

--

 NAME

    IrrGetCollisionGroupFromTerrain() - Creates a triangle selector which can select triangles from a terrain scene node.

 SYNOPSIS

    *Collision =  IrrGetCollisionGroupFromTerrain( *TerrainSceneNode, LevelOfDetail.l )

 INPUTS

    *TerrainSceneNode           - pointer to our TerrainSceneNode 

   LevelOfDetail.l                   - Level of detail, 0 for highest detail. 

 FUNCTION

   Creates a triangle selector which can select triangles from a terrain scene node.

 EXAMPLE

  

 RESULT

    Pointer to a Triangle-Selector

--

 NAME

    IrrCreateCombinedCollisionGroup() - Creates a meta triangle selector. 

 SYNOPSIS

    *CollisionGroup =  IrrCreateCombinedCollisionGroup( )

 INPUTS

 - NONE

 FUNCTION

   A meta triangle selector is nothing more than a collection of one or more triangle selectors providing together the interface of one 

   triangle selector. In this way, collision tests can be done with different triangle groups in one pass. 



 EXAMPLE

   ; build collision information for the BSP map

  *IrrMapSelector = IrrGetCollisionGroupFromComplexMesh( *IrrMesh, *IrrMap)



 ; creates a meta-selector that is a group of selector objects

  Define  *IrrCombinedCollision.irr_selector

 *IrrCombinedCollision = IrrCreateCombinedCollisionGroup ()



  Define *IrrTerrainCollision.irr_selector

  *IrrTerrainCollision = IrrGetCollisionGroupFromTerrain ( *IrrTerrainNode, 1 )



; creates a meta-selector that is a group of selector objects

  IrrAddCollisionGroupToCombination ( *IrrCombinedCollision, *IrrMapSelector )

  IrrAddCollisionGroupToCombination ( *IrrCombinedCollision, *IrrTerrainCollision )



 ; add a collision animator to the camera that interacts with the map

 ; parameters define: camera radius, gravity and offset

  *IrrCollisionAnimator = IrrAddCollisionAnimator( *IrrCombinedCollision, *IrrCameraNode, 30.0,30.0,30.0, 0.0,-3.0,0.0, 0.0,50.0,0.0 )

 RESULT

    Pointer to a MetaTriangle-Selector

--

 NAME
    IrrAddCollisionGroupToCombination() - Adds a triangle selector to the collection of triangle selectors in this metaTriangleSelector.

 SYNOPSIS

    IrrAddCollisionGroupToCombination(  *CollisionGroup, *Collision )

 INPUTS

   *CollisionGroup           - pointer to our meta triangle selector 

   *Collision                     - pointer to our Terrain, Mesh, Octree, Box , youNameit Triangle Selector.

 FUNCTION

   Adds a triangle selector to the collection of triangle selectors in this metaTriangleSelector.



   a metaTriangleSelector is basically a Group of selectors packed together. Useful to for example check

   a collision with a Terrain and an MeshObject in a single Pass.



 EXAMPLE

   ; build collision information for the BSP map

  *IrrMapSelector = IrrGetCollisionGroupFromComplexMesh( *IrrMesh, *IrrMap)



 ; creates a meta-selector that is a group of selector objects

  Define  *IrrCombinedCollision.irr_selector

 *IrrCombinedCollision = IrrCreateCombinedCollisionGroup ()



  Define *IrrTerrainCollision.irr_selector

  *IrrTerrainCollision = IrrGetCollisionGroupFromTerrain ( *IrrTerrainNode, 1 )



; creates a meta-selector that is a group of selector objects

  IrrAddCollisionGroupToCombination ( *IrrCombinedCollision, *IrrMapSelector )

  IrrAddCollisionGroupToCombination ( *IrrCombinedCollision, *IrrTerrainCollision )



 ; add a collision animator to the camera that interacts with the map

 ; parameters define: camera radius, gravity and offset

  *IrrCollisionAnimator = IrrAddCollisionAnimator( *IrrCombinedCollision, *IrrCameraNode, 30.0,30.0,30.0, 0.0,-3.0,0.0, 0.0,50.0,0.0 )

 RESULT

    NONE

--

 NAME

    IrrRemoveAllCollisionGroupsFromCombination() - Removes all triangle selectors from the collection. 

 SYNOPSIS

    IrrRemoveAllCollisionGroupsFromCombination(  *CollisionGroup )

 INPUTS

   *CollisionGroup           - pointer to a meta triangle selector 

 FUNCTION

   Removes all triangle selectors from the collection. 



   a metaTriangleSelector is basically a Group of selectors packed together. Useful to for example check

   a collision with a Terrain and an MeshObject in a single Pass.



 EXAMPLE



 RESULT

    NONE

--

 NAME

    IrrRemoveCollisionGroupFromCombination() - Removes all triangle selectors from the collection. 

 SYNOPSIS

    IrrRemoveCollisionGroupFromCombination(  *CollisionGroup, *Collision )

 INPUTS

   *CollisionGroup           - pointer to a meta triangle selector 

   *Collision                     - pointer to our Terrain, Mesh, Octree, Box , youNameit Triangle Selector.

 FUNCTION

   Removes a specific triangle selector which was added before from the collection. 



   a metaTriangleSelector is basically a Group of selectors packed together. Useful to for example check

   a collision with a Terrain and an MeshObject in a single Pass.



 EXAMPLE



 RESULT

    NONE

--


Thalius

Verfasst: 31.12.2007 18:29
von tft
Hallo ...

danke für deine Mühe ....

was ich konkret brauche ist eine Colisions abfrage für einzelne Nodes.
In dem stil.

Die Nodes 1-10 gehören zu einer Colisions Gruppe.
Wenn einer der Nodes Kollidiert. Bestimme welche Nodes Kollidiert sind und reagiere darauf.
Füge neue Nodes in die Kolisions Gruppe ein.
Entferne Nodes aus der Colisions Gruppe.

Fürs erste würde es reichen wenn es sich dabei um Sphere Colision handelt.
Im Moment mache ich das durch zuweisung von Radien und Entvernungsmessung. Aber ich möchte schon gerne Irrlicht ganz verstehn.

Apropos verstehn. Ich komme mit einer sache überhaupt nicht klar.

Wenn ich eine Node in die Sceene setzt. Diese dann Positioniere. Wird die Position erst 1-3 Frames später übernommen. Und die Node wird solange im Zentrum der Weltcoordinaten dargestellt.
Ausserdem scheint Irrlicht in einem eigenen Process zu laufen. Fieleicht habe ich desswegen bei einigen Funktionsaufrufen. So komische effeckte. Habe einen QuadCode 2.4 GHz.

Wirken alle Befehle direckt. Oder werden sie in einer Schlange gehalten und erst durch aufruf von IrrShow() übernommen.

Habe jetzt mal volgendes gemacht.

Mesh erzeugt.
2 Node erzeugt und in Sceene eingesetzt.
Node Position mit IrrGetNodePosition() ermittelt.
Node Position mit IrrSetNodePosition() verschoben
Node Position mit IrrGetNodePosition() ermittelt.
Dann Mit IrrDraw() ausgegeben.

Und stelle wirklich fest das die Posizionierung erst 2-4 Frames spater kommt.

Stehe also wider am Anfnag und hoffe auf rat.

Schönes feiern ......

Verfasst: 31.12.2007 18:41
von Thalius
Die Nodes 1-10 gehören zu einer Colisions Gruppe.
Wenn einer der Nodes Kollidiert. Bestimme welche Nodes Kollidiert sind und reagiere darauf.
Füge neue Nodes in die Kolisions Gruppe ein.
Entferne Nodes aus der Colisions Gruppe.
ok - schaue heute abend das ich dir das mal feddich dokumentiern kann. Ist eigentlich relativ easy.
Wenn ich eine Node in die Sceene setzt. Diese dann Positioniere. Wird die Position erst 1-3 Frames später übernommen. Und die Node wird solange im Zentrum der Weltcoordinaten dargestellt.
Ausserdem scheint Irrlicht in einem eigenen Process zu laufen. Fieleicht habe ich desswegen bei einigen Funktionsaufrufen. So komische effeckte. Habe einen QuadCode 2.4 GHz.
. .. delay im loop ? dx9 pder opengl ? pm mir mal son beispeilcode am besten.
Ausserdem kannst du die nodes auch invisible hinzufügen dann nach pos-änderung de-invisen (dadurch werden diese nur gecached aber nicht gerendert).
Wirken alle Befehle direckt...
Jein, je nach Subsystem findet ein eigener loop vom driver statt ( Opengl zb. ) welcher es ermöglicht auch noch 100 fps zu haben bei 1% cpu load da code und drawing synchron behandelt werden. Aber wie gesagt schick mal n Schnipsel wo das auftritt dann kann ich dir mehr drüber sagen... will noch soviel schreiben tuts usw.

Dann hängts noch ab wie dein OS den Quadcore scheduled. Wenn die load von einem process gleichmaessig über alle cores verteilt wird ist das sehr schlecht für die synchronisation ( set affinity! ) - damit haben viele games probleme. Wie man sowas handhabt wird wohl eher ein "Advanced Thread Tutorial ..."

Schönes feiern ......
Ja, jedem andern auch - ich hab 2 Tage 20h Schicht... /:->

Thalius

Verfasst: 31.12.2007 19:04
von marco2007
2 Tage 20 Stunden? Was machst Du?

Verfasst: 31.12.2007 19:20
von Thalius
SysAdmin und technisches Managment / Entwicklung für div Grosskunden.

Verfasst: 01.01.2008 17:14
von tft
Hallo ..

Habe dir ein Pm geschickt. Hir nochmal ein Code der das Problem sehr gut veranschaulicht. Zumindestens bei mir.

Code: Alles auswählen

;
; -------------------------------------------------------------------------------
;
;   PureBasic - Irrlicht
;
;   Von 0 auf 100 (c) 2008 - TFT
;
;   Part 004
;
; -------------------------------------------------------------------------------
;
; In allen Parts sind die Komentare des vorherigen Parts gelöscht. Und der Code 
; soweit gerafft. Das die Übersichtlichkeit nicht all zu arg leidet. Die Neuen
; Code segmente sind mit ;--- gekenzeichnet. Das Procedure Fenster zeigt die
; entsprechenden Sprungmarken.
;
; Den meisten wird es nicht auffallen. Und bei nodes bei denen das BackfaceCulling
; eingeschaltet, oder die Camera an der Position 0.0.0 steht. Wird man es nicht bemerken.
; Aber die Funktion  IrrSetNodePosition(*cube,0,0,4) arbeitet verzögert. Die Objecte 
; werden immer mindestens 1 Frame lang an der Position 0.0.0 gezeichnet. Die genaue
; Ursache ist mir im Moment noch nicht bekannt. Aber das ist echt lästig. Wenn das 
; bei der inizialisierung einer Sceen passiert. Fällt das nicht auf. Aber bei der 
; Erstellung von Objecten zur Laufzeit. Kann das unschöne effekte herforrufen.
; Und ob das auch bei SingelCore vorkommt. Werden ich durch euer Feedback erfahren.
; Um das Problem sichbar zu machen. Werden wir das ganze extrem verlangsamen. Sowie
; Die Camera nach hinten ... also aus dem 0,0,0 position verschieben.

XIncludeFile "Irr3DRequester.pb"
Irr3DRequester(#IRR3DREQ_SKIP)

neustart:

;--- Neue Camera Position
*camera.irr_camera = IrrAddCamera( 0,0,-4, 0,0,1 )

IrrSetCameraClipDistance(*Camera,10000)
IrrSetCameraNearValue(*Camera,0.1)

*cube.irr_node=IrrAddCubeSceneNode(2)
*CubeTexture.irr_texture = IrrGetTexture( "test.bmp" )
IrrSetNodePosition(*cube,0,0,4)
IrrSetNodeMaterialFlag( *cube, #IRR_EMF_LIGHTING, #IRR_Off )
IrrSetNodeMaterialTexture( *cube, *CubeTexture, 0 )

IrrSetNodeMaterialFlag( *cube, #IRR_EMF_BACK_FACE_CULLING, #IRR_OFF) 
IrrSetNodeMaterialType( *cube, #IRR_EMT_TRANSPARENT_ADD_COLOR)

*irb.irr_animator = IrrAddRotationAnimator(*cube, 1,0,0)   

Repeat

      If IrrRunning()=0
         en=1
      EndIf
              
      While IrrKeyEventAvailable()
          
          *KeyEvent.irr_key_event = IrrReadKeyEvent()
  
          Select *KeyEvent\key
          Case #IRR_KEY_ESCAPE
            en=1
          Case #IRR_KEY_F12
            IrrStop()
            Irr3DRequester(#IRR3DREQ_REQUESTER)
            Goto neustart
          EndSelect
          
      Wend
      
      LeftMouseBotonHit.l=0
      RigtMouseBotonHit.l=0
      
      While IrrMouseEventAvailable()
          
          *MouseEvent.irr_mouse_event = IrrReadMouseEvent()
          
          Select *MouseEvent\action 
          Case #IRR_EMIE_MOUSE_MOVED
            MouseSpeedX.l=MouseX.l-*MouseEvent\X
            MouseSpeedY.l=MouseY.l-*MouseEvent\Y
            MouseX.l= *MouseEvent\X
            MouseY.l= *MouseEvent\Y
          Case #IRR_EMIE_MOUSE_WHEEL
            
          Case #IRR_EMIE_LMOUSE_PRESSED_DOWN
            LeftMouseBotonDown.l=1
            LeftMouseBotonHit.l=1
          Case #IRR_EMIE_LMOUSE_LEFT_UP
            LeftMouseBotonDown.l=0
          Case #IRR_EMIE_RMOUSE_PRESSED_DOWN
            RigtMouseBotonDown.l=1
            RigtMouseBotonHit.l=1
          Case #IRR_EMIE_RMOUSE_LEFT_UP
            RigtMouseBotonDown.l=0
          EndSelect
      
      Wend
  
      IrrBeginScene(0, 0, 55 )  
      IrrDrawScene()
      IrrEndScene()
      
      ;--- Eine secunde warten
      Delay(1000)
      
Until en=1

IrrStop()
 
End 


Verfasst: 01.01.2008 17:18
von Thalius
PM bekommen, aber immernoch am arbeiten. Schaus mir evtl heut abend oder morgen an. Vorher komm ich nicht an irgendein Windows Gerät.

Thalius