|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
storky
Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 14.01.2014, 16:54 Titel: Vertexausrichtung |
|
|
Hallo,
ich hätte mal ebend eine Frage zu openGL / openB3D. Zwar habe ich einen 3D Array mit Punkten den ich gerne in Polygonen darrstellen würde. Da Cube-Entitys bei der Masse etwas zu langsam sind, hab ich mir überlegt die Mesh selbst zu erzeugen, die dann nur noch aus der Oberfläche aller Würfel besteht.
Das funktioniert auch schon und geht relativ fix (Wenn man einen Punkt entfernt, updatet er die Mesh in ~0.03s und rendert mit > 1000 FPS bei 32*32*32).
Aber Folgendes ist unklar. Wie rum muss ich die Vertexe zu Polygonen vernetzen? Sobald da Licht drauf fällt, sieht es aus wie ein unscharf beleuchteter Schwamm mit Dellen. (Als Wireframe hauts hin) Ich glaube die Vertexes sind falschrum ausgerichtet und noch dazu ist die komplette Mesh invertiert und ich muss sie flippen.
Also, wie zeichnet man richtig? Hängt es damit zusammen, dass ich pro Fläche 4 Vertexes benutze obwohl ja pro Ecker einer reicht?
Danke
PS.: Später wenn ich am PC bin werde ich den Quellcodeteil mit einfügen.
Ok da bin ich doch mal sofort aus dem Bett gekrochen Der Code sieht glaube schlimmer aus als er ist, er läuft halt das Array durch und sieht nach wo die Nachbarn fehlen um dort eine Würfelfläche zu zeichnen.
Hier das Problem. Die Oberfläche ist halt totaler Matsch, wenn man
einzelne Würfel von der Oberfläche entfernt ist es noch schlimmer:
Als Wireframe ist aber alles ok:
Code: | Sub chunkT.updateMesh()
Dim As Integer scaleFactor = 10
Dim As Integer v01, v02, v03, v04
With This
'If .mesh <> 0 Then freeEntity(.mesh)
'If .surface <> 0 Then freeEntity(.surface)
.mesh = createMesh()
.surface = createSurface(.mesh)
For y As UInteger = 0 To 32
For x As UInteger = 0 To 32
For z As UInteger = 0 To 32
If .memory(x, y, z) Then
If .memory(x - 1, y, z) = 0 or x = 0 Then
v01 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v02 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v03 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v04 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
AddTriangle (.surface, v01, v02, v03)
AddTriangle (.surface, v02, v04, v03)
EndIf
If .memory(x + 1, y, z) = 0 or x = 32 Then
v01 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v02 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v03 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v04 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
AddTriangle (.surface, v03, v02, v01)
AddTriangle (.surface, v03, v04, v02)
EndIf
If .memory(x, y, z - 1) = 0 Or z = 0 Then
v01 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v02 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v03 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v04 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
AddTriangle (.surface, v01, v02, v03)
AddTriangle (.surface, v02, v04, v03)
EndIf
If .memory(x, y, z + 1) = 0 Or z = 32 Then
v01 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v02 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v03 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v04 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
AddTriangle (.surface, v03, v02, v01)
AddTriangle (.surface, v03, v04, v02)
EndIf
If .memory(x, y - 1, z) = 0 Or y = 0 Then
v01 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v02 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v03 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v04 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor - (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
AddTriangle (.surface, v01, v02, v03)
AddTriangle (.surface, v02, v04, v03)
EndIf
If .memory(x, y + 1, z) = 0 Or y = 32 Then
v01 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v02 = AddVertex(.surface, x * scaleFactor + (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
v03 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor + (scaleFactor/ 2))
v04 = AddVertex(.surface, x * scaleFactor - (scaleFactor/ 2), y * scaleFactor + (scaleFactor/ 2), z * scaleFactor - (scaleFactor/ 2))
AddTriangle (.surface, v03, v02, v01)
AddTriangle (.surface, v03, v04, v02)
EndIf
VertexTexCoords .surface,2, y, x
End If
Next
Next
Next
flipmesh(.mesh)
UpdateNormals(.mesh)
MeshCullRadius(.mesh, 0)
End With
End Sub |
|
|
Nach oben |
|
|
storky
Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 14.01.2014, 17:25 Titel: |
|
|
Ung gleich noch was, ... wenn ihr wisst wie ich da Texturen draufbekomme, so dass es kleine Tiles werden, bitte vortragen Bzw habe ich auch noch keine Idee wie ich testen könnte wo man hingeklickt hat. Könnte man eigentlich nur von den Vertextes ableiten?
Gerne hau ich für gute Ideen auch den ganzen Anstaz über den Haufen. Habe es schon mit CSG probiert aber das ist irre langsam. |
|
Nach oben |
|
|
storky
Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 15.01.2014, 17:38 Titel: |
|
|
Kommt schon Ich bekomms nicht hin. Also um das nochmal runterzubrechen. In welcher Reihenfolge muss ich die Vertexe triangulieren? Ich habe jetzt OpenGL Tuts angesehen und es probiert mit diesen Listen, aber die werden von der Engine beim Rendern ausgelassen.
Und hab herrausgefunden, wenn man den ersten und letzten Punkt eines ganzen Quadrats vertauscht, flipt die Mesh. Es muss eine Reihenfolge geben aber ich kanns unmöglich durchtesten und finde dazu nicht wirklich etwas. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 15.01.2014, 18:31 Titel: |
|
|
Mehr als hier steht, kann ich dir über die Reihenfolge leider nicht sagen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
storky
Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 15.01.2014, 19:35 Titel: |
|
|
Danke Ja so eine Liste habe ich schon probiert aber die wird wie gesagt nicht gerendert. Also ich hab den opengl Header nochmals geincludet und einfach so eine Liste angelegt, kam nicht in die Ausgabe von openb3d mit rein.
Ich habe mir jetzt auch mal den Source von openb3d besorgt, teilweise kapier ich das aber habe auch Probleme mit der Syntax von C++ und mit OpenGL direkt. Ich werde mal probieren das zu kompilieren mit mingw, eventuell schaffe ich es da was Eigenes reinzubasteln. GL_TRIANGLE_STRIP klingt nämlich sehr vernünftig |
|
Nach oben |
|
|
storky
Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 15.01.2014, 22:29 Titel: |
|
|
Ich bekomm openb3d nicht kompiliert. Unter Linux war es kein Problem aber unter Windows (und da möchte ich entwickeln) ist irgendwas faul mit glee. Zuerst hat es gefehlt, dann hab ich es geladen, die *.lib in den lib Folder gehauen (keine .a), den Header in include. Nun findet er beim Linken aber die Exports nicht.
Hab dann versucht unter Linux Crosscompiling zu betreiben aber da findet er auch glee nicht und wär am Ende das selbe. Man |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|