Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 05:04

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: und nochmal newton...
BeitragVerfasst: Fr Okt 01, 2004 23:48 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hi,

Ich hab ein Problem bei den Coltrees von newton.
Ich erzeuge eine Heightmap mit dem unten stehenden constructor und erstelle dann die faces+DisplayList.
nun zum problem: die heightmap wird einwandfrei gezeichnet. die kollision allerdings funktioniert so gut wie garnicht.
alle testcubes fallen durch die heightmap durch, es sei denn, ich hab ne relativ hohe auflösung bei der map. aberselbst dann bleiben
nur manche in der landschaft stecken.
Code:
  1.  
  2. constructor TMap.Create(FileName: String; Resolution: Integer; Position, Rotation: TVector; Size,
  3.                         ProcentualHeight: Single; PerPlaneTexture: Boolean; var nWorld: PNewtonWorld);
  4. var
  5.    Bmp: TBitMap;
  6.    x, z, i: Integer;
  7.    Ratio: Single;
  8.    FieldSize: Single;
  9.    Vertex: Array[0..3] of Array[0..2] of Single;
  10.    VertPos: Array[0..3] of Array[0..1] of Integer;
  11.    collision: PNewtonCollision;
  12.    BoxA, BoxB: TVector;
  13.    count: Integer;
  14. begin
  15.      VertPos[0][0] := 0;
  16.      VertPos[0][1] := 0;
  17.      VertPos[1][0] := 1;
  18.      VertPos[1][1] := 0;
  19.      VertPos[2][0] := 1;
  20.      VertPos[2][1] := 1;
  21.      VertPos[3][0] := 0;
  22.      VertPos[3][1] := 1;
  23.  
  24.      Matrix_SetIdentity(MapMatrix);
  25.      Matrix_SetTransform(MapMatrix, V4(Position.x, Position.y, Position.z));
  26.      Matrix_SetRotation(MapMatrix, V3(Rotation.x, Rotation.y, Rotation.z));
  27.  
  28.      MapResolution := Resolution;
  29.      MapSize := Size;
  30.      MapProcentualHeight := ProcentualHeight;
  31.  
  32.      Bmp := TBitMap.Create;
  33.      try
  34.         Bmp.LoadFromFile(FileName);
  35.         Ratio := Bmp.Width / Bmp.Height;
  36.         SetLength(HeightData, Resolution+1);
  37.         for x := 0 to Resolution do
  38.         begin
  39.              SetLength(HeightData[x], Resolution+1);
  40.              for z := 0 to Resolution do
  41.              begin
  42.                   HeightData[x, z] := Trunc(Bmp.Canvas.Pixels[Trunc(X/Resolution*Bmp.Width),Trunc(Z/Resolution*Bmp.Height)] / clWhite * 255);
  43.              end;
  44.         end;
  45.      finally
  46.         Bmp.Free
  47.      end;
  48.      FieldSize := MapSize / MapResolution;
  49.      collision := NewtonCreateTreeCollision(nWorld, nil);
  50.      NewtonTreeCollisionBeginBuild(collision);
  51.      count := (Resolution-1)*(Resolution-1)*4;
  52.      DisplayList := glGenLists(1);
  53.      glNewList(DisplayList, GL_COMPILE);
  54.  
  55.      glBegin(GL_QUADS);
  56.  
  57.      for z := 0 to MapResolution - 1 do
  58.       for x := 0 to MapResolution - 1 do
  59.       begin
  60.            for i := 0 to 3 do
  61.            begin
  62.                 Vertex[i][0] := (x + VertPos[i, 0]) * FieldSize;
  63.                 Vertex[i][2] := (z + VertPos[i, 1]) * FieldSize;
  64.                 Vertex[i][1] := HeightData[x + VertPos[i, 0], z + VertPos[i, 1]] * ProcentualHeight;
  65.  
  66.                 if PerPlaneTexture then
  67.                   glTexCoord2f(VertPos[i][0], VertPos[i][1])
  68.                 else
  69.                   glTexCoord2f((x + VertPos[i, 0]) / MapResolution, (z + VertPos[i, 1]) / MapResolution);
  70.                 glVertex3fv(@Vertex[i]);
  71.            end;
  72.            NewtonTreeCollisionAddFace(collision, 4, @Vertex, SizeOf(TVector), 1);
  73.       end;
  74.  
  75.      glEnd;
  76.      glEndList;
  77.  
  78.      NewtonTreeCollisionEndBuild(collision, 1);
  79.      MapBody   := NewtonCreateBody(nWorld, collision);
  80.      
  81.      NewtonBodySetMatrix(MapBody, @MapMatrix);
  82.      NewtonCollisionCalculateAABB(collision, @MapMatrix, @BoxA, @BoxB);
  83.  
  84.     // set the world size
  85.     NewtonSetWorldSize(nWorld, @BoxA, @BoxB);
  86.  
  87.     // release Collision
  88.     NewtonReleaseCollision(nWorld, collision);
  89. end;


nWorld ist vorhanden, daran kanns also nicht liegen - Die cubes selbst sind auch in ordnung(geprüft)...
ich hoffe ihr seht irgendwo was...

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 02, 2004 08:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Liegts vielleicht daran:
http://www.physicsengine.com/forum/viewtopic.php?t=518 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 02, 2004 13:17 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
danke - flächen waren nicht gegen dem urzeigersinn :)

is echt cool die engine

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 18, 2004 21:45 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Und nochmal was:
es geht wieder um objecttrees.
es hat alles ganz gut funktioklappert bis ich versucht habe, das ganze mittels quadstrips zu rendern (hab mir dadurch geschwindigkeitsvorteile erhofft, gibt es dadürch eigentlich welche?). Die Landschaft sieht absolut makellos aus. sobalt dich aber versuche, alles in einen objecttree zu schreiben, gibt es einen ähnlichen effekt, als würde man in einer schleife hängen, wenn ich newton sage dasses den tree schließen soll.
Das merkwürdige ist, wenn ich den letzten Parameter von NewtonTreeCollisionEndBuild, also laut den tutorials die verbesserung des trees, auf 0 setze, funktioniert es. aber die kollisionsabfrage ist dann nicht ganz korrekt (ab un zu löcher oder "stufen" in der landschaft). mein vater sacht immer, zu 99% sitzt das problem vorm bildschirm - hatter recht oder isses nen bug von newton?

hier noch der code:
Code:
  1.  
  2. Bmp := TBitMap.Create;
  3.      try
  4.         Bmp.LoadFromFile(FileName);
  5.         Size := Bmp.Width;
  6.         PHTerrain.MapResolution := Resolution;
  7.         PHTerrain.MapSize := Size;
  8.         PHTerrain.MapProcentualHeight := ProcentualHeight;
  9.         Ratio := Bmp.Width / Bmp.Height;
  10.         SetLength(PHTerrain.HeightData, Resolution+1);
  11.         SetLength(PHTerrain.Normals, Resolution+1);
  12.         for x := 0 to Resolution do
  13.         begin
  14.              SetLength(PHTerrain.HeightData[x], Resolution+1);
  15.              SetLength(PHTerrain.Textures[x], Resolution+1);
  16.              SetLength(PHTerrain.Normals[x], Resolution+1);
  17.  
  18.              for z := 0 to Resolution do
  19.              begin
  20.                   PHTerrain.HeightData[x, z] := Trunc(Bmp.Canvas.Pixels[Trunc(X/Resolution*Bmp.Width),Trunc(Z/Resolution*Bmp.Height)] / clWhite * 255) * ProcentualHeight;
  21.                   PHTerrain.Textures[x, z, 0] := 0;
  22.                   PHTerrain.Textures[x, z, 1] := 1;
  23.              end;
  24.         end;
  25.              // Landschaft glätten
  26.              for f := 0 to smoothness - 1 do
  27.              for x := 0 to Resolution do
  28.              for z := 0 to Resolution do
  29.              begin
  30.              if x > 0 then
  31.                 a := PHTerrain.HeightData[x - 1][z]
  32.              else
  33.                 a := 0;
  34.  
  35.              if x < Resolution then
  36.                 b := PHTerrain.Heightdata[x + 1][z]
  37.              else
  38.                 b := 0;
  39.  
  40.              if z < Resolution then
  41.                 c := PHTerrain.Heightdata[x][z + 1]
  42.              else
  43.                 c := 0;
  44.  
  45.              if z > 0 then
  46.                 d := PHTerrain.Heightdata[x][z - 1]
  47.              else
  48.                 d := 0;
  49.  
  50.              g := PHTerrain.HeightData[x][z];
  51.  
  52.              e := (c + d + a + b + g) / 5;
  53.              PHTerrain.Heightdata[x][z] := e;
  54.              end;
  55.      finally
  56.         Bmp.Free
  57.      end;
  58.  
  59.      SetTextureARBs(TerrainTexture, PHTerrain);
  60.      FieldSize := PHTerrain.MapSize / PHTerrain.MapResolution;
  61.      collision := NewtonCreateTreeCollision(nWorld, nil);
  62.      NewtonTreeCollisionBeginBuild(collision);
  63.                                                                            
  64.     ************************
  65.      ... Normalenberechnung ...
  66.     ************************
  67.  
  68.      PHTerrain.DisplayList := glGenLists(1);
  69.      glNewList(PHTerrain.DisplayList, GL_COMPILE);
  70.  
  71.      glActiveTexture(GL_TEXTURE0);
  72.      glBindTexture(GL_TEXTURE_2D, PHTerrain.Terrain);
  73.      glActiveTexture(GL_TEXTURE1);
  74.      glBindTexture(GL_TEXTURE_2D, PHTerrain.Detail);
  75.      glEnable(GL_TEXTURE_2D);
  76.      glEnable(GL_BLEND);
  77.  
  78.      for z := 0 to PHTerrain.MapResolution - 1 do
  79.      begin
  80.           x := 0;
  81.           glBegin(GL_QUAD_STRIP);
  82.           while x <= PHTerrain.MapResolution - 1 do
  83.           begin
  84.                For I := 0 to 1 do
  85.                begin
  86.                     Vertex[i].x := x * FieldSize;
  87.                     Vertex[i].z := (z + i) * FieldSize;
  88.                     Vertex[i].y := PHTerrain.HeightData[x, z + i];
  89.  
  90.                     glNormal3fv(@PHTerrain.Normals[x, z + i]);
  91.                     glMultiTexCoord2fARB(GL_TEXTURE0, (Vertex[i].x)/(PHTerrain.MapSize), (Vertex[i].z)/(PHTerrain.MapSize));
  92.                     if x mod 2 = 0 then
  93.                     begin
  94.                          glMultiTexCoord2fARB(GL_TEXTURE1, VertPos[i, 0], VertPos[i, 1])
  95.                     else
  96.                          glMultiTexCoord2fARB(GL_TEXTURE1, VertPos[i + 2, 0], VertPos[i + 2, 1]);
  97.                     end;
  98.                     glVertex3fv(@Vertex[i]);
  99.                 end;
  100.  
  101.            For i := 0 to 3 do
  102.            begin
  103.                 NewtonVertex[i].x := (x + VertPos[i, 0]) * FieldSize;
  104.                 NewtonVertex[i].y := PHTerrain.HeightData[x + VertPos[i, 0], z + VertPos[i, 1]];
  105.                 NewtonVertex[i].z := (z + VertPos[i, 1]) * FieldSize;
  106.            end;
  107.             NewtonTreeCollisionAddFace(collision, 4, @NewtonVertex, SizeOf(TVector), 1);
  108.            x := x + 1;
  109.       end;
  110.       glEnd;
  111.      end;
  112.  
  113.  
  114.      glActiveTexture(GL_TEXTURE1);
  115.      glDisable(GL_TEXTURE_2D);
  116.      glDisable(GL_BLEND);
  117.      glActiveTexture(GL_TEXTURE0);
  118.  
  119.      glEndList;
  120.  
  121.      NewtonTreeCollisionEndBuild(collision, 1);
  122.      PHTerrain.MapBody   := NewtonCreateBody(nWorld, collision);
  123.      NewtonBodySetMaterialGroupID(PHTerrain.MapBody, levelID);
  124.      NewtonBodySetMatrix(PHTerrain.MapBody, @PHTerrain.MapMatrix);
  125.      NewtonCollisionCalculateAABB(collision, @PHTerrain.MapMatrix, @BoxA, @BoxB);
  126.      NewtonSetWorldSize(nWorld, @BoxA, @BoxB);
  127.      NewtonReleaseCollision(nWorld, collision);
  128.  


edit:

hab durch n' bisschen rumprobiern rausgekriegt, dasses irgend was mit dem glätten der heightmap zu tun haben muss.
wenn ich für smoothness 0 übergebe (parameter bei prozeduraufruf), gibt es keine fehler - will aber schon gerne ne gewisse glättung haben

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 18, 2004 22:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Es gibt einen Bug der auftritt wenn man den Collisiontree optimieren tut (also zweiter Parameter <> 0), der ist aber im neusten Beta-SDK gefixt und trat auch sonst nur in seltenen Fällen auf, besonders bei eigenwilligen Skalierungen der Objekte. Ansonsten tippe ich mal darauf (wegen deines letzten Edits) dass das Problem eher bei dir liegt als bei Newton. Also prüf mal genau dein Heightmapberechnungen. Wenn du dann immernoch sicher bist es wäre Newtons Schuld, lad mal ne Demo hoch und ich probiers mit der neusten Beta-DLL.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
habe jetzt mal ne demo hochgeladen. Bitte nicht die Texturen vom Gras falsch bewerten :) das sind nur platzhalter für ordentliche texturen und ich hatte noch keine lust solche zu machen. zurück zum thema: das programm startet mit einer heightmap, die nicht funktioniert. ich hab nämlich auch noch rausgefunden, dasses mit ner anderen funktioniert! (liegt übrigens auch bei). IMHO ist es also denke ich mal kein fehler meinerseits.
habe versehentlich die newton dll noch mitgepackt - hoffe das ist nicht so schlimm. um die funktionierende heightmap einzubinden, einfach hm2.bmp zu hm.bmp umbennen und ggf. auch noch terrain2.jpg zu terrain.jpg (liegt im texturen verzeichnis) machen.
@SW: ich benutze die neuste, auf der seite angebotene sdk (1.24) und hab mir vor 2 wochen oder so den delphiheader runtergeladen. wenn du ne neuere version hast bei der das erste terrain funktioniert, kann ich die vielleicht dann haben?

und noch ne klitzekleine frage am rande: bringt es geschwindigkeitsvorteile, so wie ich das terrain mit gl_quadstrip im mom aufbaue ggü. gl_quads?

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 12:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wo ist der Downloadlink? Und nein, ich kann dir die Beta-DLL nicht zuschicken, auch wenns damit klappt. Die ist nur für interne Entwickler und damit würde ich im Endeffekt die NDA brechen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 12:35 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
ups Oo
ganz vergessen: http://www.omega.mynetcologne.de/oenewton.rar

wann käme die denn raus?
is nämlich net so doll wenn die kollisionsabfrage net stimmt.....

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 12:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
@ Demo :
Das Teil funktioniert nicht, oder es braucht für meinen Geschmack viel zu lange bis es startet. Habs grade mal ne Minute lang im Taskmanager beobachtet, und als es dann noch nicht gestartet war hab ich es abgeschossen. Schau mal dass du die Startzeit verkürzt, hab keine Lust da ne Ewigkeit zu warten.

@ DLL :
Die nächste Version des SDKs kann noch drei Wochen auf sich warten lassen, evtl. aber auch früher. Und wie gesagt tritt der Kollisionsbug nur in sehr seltenen Fällen auf und auch nur wenn die Optimierung an ist. Wenn die bei dir aus ist und es trotzdem Probleme gibt liegt der Fehler bei dir. Stelle sicher dass alle Dreiecke oder Quads deines Terrains die gleiche Wicklungsrichtung haben, die für Newton übrigens entgegen der Richtung von OpenGL ist.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 12:53 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
also bei mir dauert es max. 6 sek bis es gestartet is. wie gesagt: es startet nicht, wenn die "problemheightmap" verwendet wird (im rar archiv "hm.bmp"). die andere ("hm2.bmp") funktioniert bei mir einwandfrei - weshalb ich annehme, das der wicklungssinn stimmt - werde es aber nochmal testen. kannst du nochmal ausprobieren, ob das andere terrain bei dir funktioniert?

edit:
wie oben schon gesagt, tritt das problem nicht auf, wenn ich den parameter für die optimierung auf 0 stelle

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 12:58 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Statt Quadstrips solltest du gleich auf Trianglestrips umstellen. Die sollen die schnellsten sein. (Angeblich schneller als Trianglefan laut meinem CompGraphik Prof. :roll: stimmt das?)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 13:00 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
was is triangle fan?? wie werden die aufgebaut??

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 13:11 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
GL_TRIANGLE_FAN siehe wiki.delphigl.com/glBegin

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 13:23 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
danke - obwohl ich mir kaum vorstellen kann, das man daraus eine heightmap bauen könnte :)
nochwas zu quad- und trianglestrips: gibt es einen befehl an opengl, der einen neuen strip beginnt, ohne wieder glEnd u- glBegin aufzurufen?
kostet so nur unheimlich zeit

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 19, 2004 13:32 
Offline
DGL Member

Registriert: Do Nov 20, 2003 19:52
Beiträge: 48
Wohnort: Tillingen bei Chemnitz
..und ob man damit Heightmaps rendern kann, bei dem in Tutorial vorgestellten LOD-Algorithmus wirds standardmäßig so gemacht.
Soweit ich weiß gibts solche Befehle nicht, glEnd macht ja genau das.

_________________
...die Idee ist gut, doch die Welt noch nicht bereit...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


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
[ Time : 0.009s | 14 Queries | GZIP : On ]