Aktuelle Zeit: 09.05.2024, 14:03

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Node und Terrain Kollision
BeitragVerfasst: 12.04.2007, 11:43 
Offline

Registriert: 09.04.2007, 17:37
Beiträge: 30
Hi ich bins mal wieder :) ,

Ich habe folgenden Code:
Code:
//TriangleSelektor erstellen
ITriangleSelector TriangleSelektor = this.mDevice.SceneManager.CreateTerrainTriangleSelector(this.mTerrain, 0);
ISceneNodeAnimator NodeAnimator = this.mDevice.SceneManager.CreateCollisionResponseAnimator(TriangleSelektor, this.mNode, new Vector3D(800, 800, 800), new Vector3D(0, -0.1f, 0), this.mNode.Position, 0);
this.mNode.AddAnimator(NodeAnimator);


Ich versuche also, meinem Model (das Sydney Mesh aus dem Media Ordner) beizubringen, nicht durch das Terrain zu fliegen. Es klappt jedoch nicht richtig. Das Model ca. zur Hälfte durch und dann steht es plötzlich auf der Position 0,0,0 auf der Karte und bleibt stehen.
Ändere ich den EllipsoidRadius auf 0,0,0 dann fliegt sie einfach durch bis ins Datennirvana.

Gibts eine Methode/Property, mit dem ich den korrekten Wert aus dem Node auslesen kann?
Wofür genau ist eigentlich der letzte Vektor: EllipsoidTranslation? Er scheint mein Node zu positionieren...bin aber nicht sicher obs auch wirklich dafür ist.

Guß Thomas


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12.04.2007, 15:12 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
also soweit ich weiß gibt createCollisionResponseAnimator einen ISceneNodeCollisionResponseAnimator zurück... ;) den sollte man dann auch netsprechend benutzen. die mögliche reduzierung auf einen ISceneNodeAnimator ist ja auch gewollt, nur ist es selten sinnvoll eine spezialisierte Instanz zu erzeugen nur um ihre basisfunktionen zu nutzen... ;)

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12.04.2007, 15:26 
Offline

Registriert: 09.04.2007, 17:37
Beiträge: 30
Hi,

Ich habe das selbe gemacht, wie in dem Terrain Tutorial gemacht wird, damit die Kamera nicht durchs Gelände fliegen kann, nur eben diesmal nicht auf die Kamera sondern an ein Node (Spielfigur) angehängt.

Gruß Thomas


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12.04.2007, 17:10 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
also für den ellipsoidRadius steht in der doku:
Code:
core::aabbox<f32> box = yourSceneNode->getBoundingBox();
core::vector3df radius = box.MaxEdge - box.getCenter();

die ellipsoidTranlation brauchst du wenn das ellipsoid nich um den mittelpunkt des scnenenode haben willst sondern verschoben.

btw wie bewegst du denn die figur?

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12.04.2007, 18:30 
Offline

Registriert: 09.04.2007, 17:37
Beiträge: 30
Hi,

Noch bewegt sich meine Figur garnicht. Sie soll erstmal auf dem Boden stehen können. =)
Ich schau mir das später an.

Gruß Thomas


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 13.04.2007, 20:28 
Offline

Registriert: 09.04.2007, 17:37
Beiträge: 30
Hiho,

Es gibt wieder mal ein Probem. Meine Figur landet jetzt auf dem Terrain. Ich kann sie mit einem Mausklick bewegen ABER sie sinkt dabei in den Boden.

Hier der Codeausschnitt zum Bewegen:
Code:
// Kollisionserkennung
Box3D BoundingBox = this.mNode.BoundingBox;
Vector3D Radius = BoundingBox.MaxEdge - BoundingBox.getCenter();
//TriangleSelektor erstellen
ITriangleSelector TriangleSelektor = this.mDevice.SceneManager.CreateTerrainTriangleSelector(this.mTerrain, 0);
ISceneNodeAnimator NodeAnimator = this.mDevice.SceneManager.CreateCollisionResponseAnimator(TriangleSelektor, this.mNode, Radius, new Vector3D(0, -0.1f, 0), new Vector3D(0,0,0), 1);
this.mNode.AddAnimator(NodeAnimator);

// Bewegen
Line3D ScreenRay = this.mDevice.SceneManager.SceneCollisionManager.GetRayFromScreenCoordinates(this.mDevice.CursorControl.Position, this.mCamera);
ITriangleSelector TriangleSelektor = this.mDevice.SceneManager.CreateTerrainTriangleSelector(this.mTerrain, 0);

Vector3D TargetVektor;
Triangle3D TargetTriangle;
                        this.mDevice.SceneManager.SceneCollisionManager.GetCollisionPoint(ScreenRay, TriangleSelektor, out TargetVektor, out TargetTriangle);

ISceneNodeAnimator NodeAnimator = this.mDevice.SceneManager.CreateFlyStraightAnimator(this.mNode.Position, TargetVektor, 1000, false);
this.mNode.SetMD2Animation("run");
this.mNode.AddAnimator(NodeAnimator);


Sollte mein bereits hinzugefügter Kollisionsdetektor das Einsinken in den Boden verhindern, oder überschreibt der neue Animator den alten?

Gruß Thomas


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 14.04.2007, 09:03 
Offline
Moderator

Registriert: 26.03.2007, 20:06
Beiträge: 114
Hi!
Ich muss zugeben, das ich für Terrainkollisionen den Collision Response Animator überhaupt nicht benutze, denn wie euch vll aufgefallen ist, hat dieser mit dem Terrainmesh einige Probleme, wie zum Beispiel das feststecken der Camera, auch wenn sonst alles prima läuft, gibt es immer wieder Stellen im Terrain, an denen die Camera hängenbleibt und erst weitergeht, wenn man in eine andere Richtung schaut.

Ich nutze die Funktion getHeight() aus dem Terrainnode. Diese ist allerdings etwas fehlerhaft implementiert. Wenn sie dann aber läuft, ist sie verdammt schnell. Das ist sehr nützlich, wenn man viele Objekte in der Spielwelt pro Frame auf dem Terrain platzieren muss.

Wenn ihr wollt, suche in dann die Codestellen der irrlicht Engine raus, die geändert werden müssen, damit das ganze funktioniert. Allerdings kommt ihr dann um eine neukopilation der Engine nicht herum. Ich könnte euch allerdings auch eine fertige DLL ohne DX8 Support schicken...

MfG Lynxeye


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 14.04.2007, 11:31 
Offline

Registriert: 16.03.2007, 03:26
Beiträge: 75
Wohnort: Dresden
Kannst den Code ja mal hier rein stellen und ihn am besten noch im Forum auf irrlicht.sourcefore.net posten, damit es in die svn aufgenommen wird


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17.04.2007, 19:03 
Offline
Moderator

Registriert: 26.03.2007, 20:06
Beiträge: 114
So, nachdem ich das erst mal vergessen hatte...

Hier die Änderungen am Code:

IrrMath.h -- Hier müsst ihr erst mal diese Funktion hier ingesammt hinzufügen:
Code:
//! returns bilinear interpolation of a,b,c,d with ratios u and v
   // #########    v
   // # c # d #    |
   // #########    |
   // # a # b #    ---->u
   // #########
   template<class T>
   inline T blerp(const T a, const T b, const T c, const T d, const T u, const T v)
   {
      return ((a*u*v) + (b*(1.0f-u)*v) + (c*u*(1.0f-v)) + (d*(1.0f-u)*(1.0f-v)));
   }


CTerrainSceneNode.cpp -- Diese Funktion ist schon in der Datei enthalten, muss aber geändert werden! Ich will jetzt nicht alles Kommentieren, deshalb gibts hier die Funktion als ganzes.
Code:
f32 CTerrainSceneNode::getHeight( f32 x, f32 z )
   {
      f32 height = -999999.9f;

      core::matrix4 rotMatrix;
      rotMatrix.setRotationDegrees( TerrainData.Rotation );
      core::vector3df pos( x, 0.0f, z );
      rotMatrix.rotateVect( pos );
      pos -= TerrainData.Position;
      pos /= TerrainData.Scale;

      s32 X(core::floor32( pos.X ));
      s32 Z(core::floor32( pos.Z ));

      if( X >= 0 && X < TerrainData.Size && Z >= 0 && Z <= TerrainData.Size )
      {
         video::S3DVertex2TCoords* Vertices = (video::S3DVertex2TCoords*)Mesh.getMeshBuffer( 0 )->getVertices();
         core::vector3df a = Vertices[ X * TerrainData.Size + Z ].Pos;
         core::vector3df b = Vertices[ (X + 1) * TerrainData.Size + Z ].Pos;
         core::vector3df c = Vertices[ X * TerrainData.Size + ( Z + 1 ) ].Pos;
         core::vector3df d = Vertices[ (X + 1) * TerrainData.Size + ( Z + 1 ) ].Pos;

         f32 dx = pos.X - X;
         f32 dz = pos.Z - Z;
         f32 invDX = 1.0f - dx;

         height = core::blerp(d.Y,c.Y,b.Y,a.Y,dx,dz);
         height *= TerrainData.Scale.Y; 
      }


Das wärs eigentlich. Die Funktion ist verdammt schnell, ich hab einen kleinen Test gemacht und nebenbei pro Frame 300 Berechnungen mit der Funktion gemacht, ohne einen erkennbaren Unterschied in der Framerate.

MfG Lynxeye


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17.04.2007, 19:26 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
ist ja auch (fast) selbsterklärend..

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de