3D Tiles verschweissen[Erledigt]

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Foppele

Betreff: 3D Tiles verschweissen[Erledigt]

BeitragMo, Nov 26, 2007 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich will eine Tilemap aus 3D Elementen aufbauen. Damit man keine Nähte zwischen den einzelnen Elementen sieht, müssen die Vertexnormalen an den Stellen, wo sich 2 Vertices berühren, angepasst werden.

Ich wollte das ungefähr so machen:

1. Sichtbare/aktive Tiles bestimmen, z.B. ein Feld von 3*3 Tiles.

2. Alle Vertices, die am Rand eine Tiles liegen anhand ihrer lokalen Koordinaten bestimmen,
und in ein alle aktiven Tiles umfassendes Dim Array packen, Indexnr, XYZ Welt-Koordinaten und Vertexnormal
ebenfalls darein.

3. Dieses Array Vertex für Vertex auf Koordinatengleichheit durchchecken. Haben 2 Vertices dieselben
Koordinaten, Normalen miteinander Verrechnen und neue Normalen ins Array schreiben.

4. Die Vertexnormalen anhand der Daten im Array neu setzen.


Bevor ich jetzt loslege wollt ich mal ein paar Kommentare von euch haben, ob ihr das für eine vernünftige Lösung haltet.
  • Zuletzt bearbeitet von Foppele am Do, Nov 29, 2007 12:01, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Nov 26, 2007 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu 1.
Man kann sich das etwas einfacher machen. Die schnellste Kombination zwischen Anzahl Vertices und Anzahl Surfaces, ist pro Surface etwa 48x48 Tiles (x2 Triangles) zu machen. Da 48 doch nur Probleme beim erstellen verursacht, so ist eine 32x32 Tilesgröße pro Surface vorzuziehen. Machst du nun diese Blöcke nebeneinander, so kannst du die Surfaces mit EntityAutoFade automatisch nach einer bestimmten Entfernung ausschalten lassen (Sprichwort: keine richtige Tileengine in dem Sinne, als nur eine Kamerabewegung auf einer ''2D-Platte''). Eine Minitileengine kommt dann nun noch aufgrund eines 2D-Arrays in Betracht, um damit eventuelle Kollisionen und andere Dinge wie Wegekosten oder Pathfindig zu berechnen.

Zu 2. bis 4
Bei EntityFX =1 brauchst du keine Anpassung der Vertexnormalen. Dieser Mode ist auch für Sachen wie einer Tileengine vorzuziehen.

Dieses ist nur ein Vorschlag, wie ich es machen würde.



Ich habe mal ein Meshterrain gemacht, welches im grunde in groben mal angeschaut werden kann.

https://www.blitzforum.de/foru...p;start=67

edit1: Sorry, du meinst mit Vertexnormalen sicherlich eine UV-Anpassung, daher passt mein Text oben nicht genau zu allen deinen Fragen. Eine richtige UV-Anpassung machst du, indem du pro Tile nur max ''Kantenlänge - 1'' anwendest, da die Pixel im Randbereich jeweils ins andere Pixel überlaufen. Daher musst du minimum 0.5 Pixel umrum weg nehmen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Foppele

BeitragMo, Nov 26, 2007 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo hectic,

Nee, ich meine schon die Vertexnormalen. Und da ich das normale Shading benutzen will, kann ich auch nicht entityFX auf 1 setzen.

Ich kann wg. Serverproblem grad keinen Screenshot hochladen, das würde mein Anliegen illustrieren. Bin aber auch mit meinem Code relativ weit fortgeschritten und ich denke, ich krieg das heute noch auf Reihe.
 

Dreamora

BeitragMo, Nov 26, 2007 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Dumme frage, aber warum willst du die normalen angleichen?
Sinn von Tiles ist es eigentlich, dass sie prinzipiell schon zusammen passen, wenn sie das nicht tun, dann wärs sinnvoller nochmal über die Tiles zu gehen und diese selbst zu fixen statt zu versuchen im Code Fehler zu korrigieren die beim Modelling entstanden sind.

Ansonsten wäre deiner einer der möglichen ansätze, gibt vermutlich noch einige weitere. Den den ich nehmen würde wäre die tiles berechnen die um eine "vertexposition" sind, dort die anliegenden triangles holen, deren normalen (pickednxyz) und dann mit hilfe derer die vertexnormale angleichen. Denn das ist das was du benötigst, was die vertices für normalen hatten interessiert net. Wenn sie falsch waren wirds höchstens noch falscher wenn du sie benützt um weiter zu rechnen.

Damit kannst du dir dann auch den Array sparen, der enthält ja eh nichts was du später noch brauchst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragMo, Nov 26, 2007 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
O.K., Ich versuchs mal zu erklären:

Ich habe z.B. ein Tileelement welches einen kleinen Hügel darstellt. Die Normalen der Randvertices werden aus der Flächennormalen errechnet. Sind jetzt die Randflächen nicht gerade, sind auch die Normalen der Randvertices nicht gerade.
Grenzen nun 2 Tiles aneinander, gibt es eine hässliche Nahtstelle, erzeugt durch das Smoothing, da 2 angrenzende Vertices unterschiedliche Normalen haben.

Jetzt gibt es denke Ich 2 Wege, das zu beheben.

1. Gleich so modellieren, das die Normalen der Randvertices immer zur benachbarten Tile passen. Dies ist quasi unmöglich, es sei denn man umfasst jedes Tile mit einer Reihe platter Polygone, eine Hügellandschaft wäre gar nicht möglich.

2. So ne Funktion schreiben wie ich es grade tue Wink
 

Dreamora

BeitragMo, Nov 26, 2007 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde eine Hügellandschaft auch nicht mittels Tiles lösen sondern ein Meshterrain drunter legen und darauf tilebasiert etwas legen.
Oder mir direkt einen "Tilemapper" nehmen.

Wenn du von der ganz faulen sorte bist, dann Rifrafs Mapcrafter.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragDi, Nov 27, 2007 0:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich will das unbedingt so machen Smile

Ich will quasi das handgemalte 2D Flair, wo jeder Pixel da war wo er hingehörte, in die 3D Welt übertragen.
Mit Tiles kann man viel liebevollere Details verwirklichen, als wenn man so'n schnödes Meshterrain nimmt und da sein Gedöns drauf plaziert, ne pixelige Shadowmap draufhaut und fertig.

Ist halt mal ein anderer Ansatz...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 27, 2007 0:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich es nun ichtig verstanden habe, dann würde ich es so machen:

Du machst dir eine Funktion, die 32x32er Tileblöcke erstellt, wobei jedes Tile (Quad) seine eigenen vier Vertices hat. Jedes Tile hat somit eigene UV-Informationen. Die Normalen der Vertices werden aus einer weiteren Heightmap gelesen (Heightmap und Levelmap kann im selben Image untergebracht werden. Beispiel: Rot=Height, Grün=Tile). Da jedes Tiles seine Höheninformation aus nur einer Heightmap heran zieht, wird es auch zu keinen problemematischen Berechnungen kommen, ein Tileblock umrum mit den richtigen Normalenrichtung zu versehen.

P.S. Du kannst dir immernoch dazu mein Meshterrain anschauen. Was noch rein müsste ist eben das manuelle umrechnen der Vertexnormalen einzelner Vertices.

- Willst du ein weiches Licht berechnen lassen, so musst du die Normalen immer aus dem Winkel (Höhenunterschied) der beiden benachbarten Vertices berechnen.

- Willst du harte Lichtkanten haben (sowas wie EntityFX +4), so muss die Vertexnormale aufgrund des Winkel des Quads berechnet werden. Hier werden aber mehr als im weichem Licht die Triangles sichtbar, wenn alle vier Vertices zusammen keine eine Fläche ergeben.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Foppele

BeitragDi, Nov 27, 2007 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Cooles Teil, dein Meshterrain Wink

Ich will trotzdem Tiles nehmen - du kennst sicher alte 2D Strategiespiele wie C&C oder Warcraft (wer nicht...)

Wenn ich mir dann solche Segmente in 3D baue, z.B. Felsen, Strassen, Gebäude - hat das folgenden optischen Vorteil: Ich kann mir jedes Segment ganz liebevoll zurechtfrickeln, hier ein Steinchen, da ne Blume,
und dann mit Schatten und Global Illumination alles in eine Textur rendern, exportieren, fertig!

Wenn man wie gewöhnlich Objekte auf Terrain verteilt, fügen sich diese selten gut zusammen, weder von der Geometrie noch von der Beleuchtung her... wenn ich ausserdem eine pseudo-Isometrische Kameraperspektive nehme, kann ich die einzelnen Segmente extrem detailliert gestalten, da ich ja alles was nicht im Sichtfeld ist ausblenden kann.

Na ja, soweit bin ich aber noch nicht,
hab jetzt gerade das Problem gelöst, die Vertexkoordinaten aller Tiles zu vergleichen, mit #ner 4-fach verschachtelten For...Next Schleife.

Mir raucht mal wieder der Schädel, gute Nacht!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 27, 2007 3:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Unterschied zwischen einem Meshterrain und deiner Idee ist nur, dass deine Tilemap pro Quad eben vier Vertices mit eigener UV-Mapping benötigt, wärend ein Meshterrain diese ineinander verschmelzen kann, da XZ-Vertexposition skallierte UV-Position ist. Was ich die ganze Zeit sagen will ist, dass ein modifiziertes Meshterrain deinen Ansprüchen genügen würde. Und je nachdem welche Schattierung du haben willst, jeweils anders die Normalen berechnen musst (anhand einer Heightmap die nur zur Berechnung der Normalen dient und nicht die Tiles an sich in ihrer Höhe ändert). Wie man sowas berechnen kann, habe ich oben kurz beschrieben. Da jedes Tile bei dir eine eigene Höhe haben kann, bietet sich das an, das Raster der Tilemap ebenfalls parallel eine Heighmap anzulegen. Dieses kann (muß aber nicht) in einem Bild gespeichert sein.

Soll ich dir mal ein Beispiel coden, damit du weisst was ich meine? Wink
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Foppele

BeitragDi, Nov 27, 2007 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
so, hier mal ein Bild davon was ich vorhabe:
Schnell hingerotzt aber ich denke es wird deutlich, was diesen Ansatz anders macht.
user posted image
 

Dreamora

BeitragDi, Nov 27, 2007 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
für den ansatz gibts keine einfache lösung, da du keine grundlegende struktur drin zu haben scheinst was es wirklich "tile artig" macht.
du scheinst zwar ein gitter raster zu haben aber das ist das einzige was daran Tile ist ...

Aufgrund dessen hast du nur wenige sinnvolle möglichkeiten.

Ich bleib bei der die ich da genannt hatte
Zitat:
Den den ich nehmen würde wäre die tiles berechnen die um eine "vertexposition" sind, dort die anliegenden triangles holen, deren normalen (pickednxyz) und dann mit hilfe derer die vertexnormale angleichen. Denn das ist das was du benötigst, was die vertices für normalen hatten interessiert net. Wenn sie falsch waren wirds höchstens noch falscher wenn du sie benützt um weiter zu rechnen.


das ist der einzig wirklich praktikable ansatz bei total freier geometrie ausser du implementierst einen OctTree und liest die tiles beim hinzufügen ein und baust komplett neue meshes auf, dann könntest du die vertices mergen und die im code archiv (hier oder bb.com) vorliegende überarbeitete "UpdateNormals()" nehmen und das ganze wär gegessen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragMi, Nov 28, 2007 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
[Gelöscht weil ich Fehler gefunden habe]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 28, 2007 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Na toll, nun habe ich mich auf die Suche gemacht, festgestellt, dass mir dein Code etwas zu ''durcheinander'' schien und dann mein Meshterrain modifiziert. Laughing Falls wir nicht die ganze Zeit aneinander vorbei geredet haben, dann frage ich mich, warum dein Code so kompliziert ist? Auf jeden Fall solltest du dir mal den Link anschauen. Da habe ich mal das gemacht, wie ich es mir die ganze Zeit habe vorgestellt.

Man kann;

- mit der Maus über die Map sich weich fortbewegen,
- mit dem Mausrad die Enrfernung zur Map bestimmen,
- sehen wie EntityAutoFade funktioniert (wenn man weit genug entfert ist),
- sich darüber freuen.

Technisches:

- Es wird automatisch die Map so generiert, dass die Koordinate 0,0,0 die Mitte der ganzen Map ist.

- EntityAutoFade ist so angepasst, dass es in allen Richtungen gleich behandelt wird. Am besten mal weiter weg Zoomen (Mausrad) und sehen.

- Die ''Highmap'' (ist ja eigentlich keine Highmap in dem Sinne) wird geladen und die Blöcke werden danach berechnet, doch es werden noch keine Vertexnormalen gesetzt. Dieses sollte aber wohl kein weiteres Problem darstellen, da jeder Pixel der ''Highmap'' auch gleich für ein Tile steht. Man kann also z.B. mit ReadPixel die benachbarten Pixel in ihrer Höhe auslesen und selbst berechnen. Je nachdem wie du die Schattierung haben willst, musst du anders vorgehen (Beispiele habe ich da oben irgendwo schon beschrieben).

- Es ist egal wie groß die Highmap bzw. die Tilemap ist. Man mit dem ersten Parameter für die Funktion die Blockgröße angeben. Diese sollte aber immer in einer zweier Potenz sein (4, 8, 16, 32,...), genau wie die Texturen auch. Es wird alles automatisch umgerechnet. Ein Tile hat dabei immer eine Kantenlönge von einer Welteinheit. Bei dem zweiten Parameter muß man angeben wie groß ein Tile in Pixel ist. Fertig


Vielleicht hilft dir das trotzdem... Question

Foppele

BeitragMi, Nov 28, 2007 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
Falls wir nicht die ganze Zeit aneinander vorbei geredet haben....


Ja, ich hatte ein wenig das Gefühl Smile

Also, mir geht es primär um das "Kantenverschweissen", ich wollte noch gar keine Tileengine draus bauen.

Das "Kantenverschweissen", also Anpassen der Normalen der Randvertices, soll halt funktionieren weil es eine Idee ist die ich ausprobieren will weil ich denke, dass es mir was nützt.
Auch wenn es andere Arten der Terrainerzeugung gibt to gut funktionieren, Ich will Mesh an Mesh setzen und die Übergänge eleminieren Mad

So, hier die neuste Version, geht aber noch nicht richtig...
Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
SetBuffer BackBuffer()
frametimer= CreateTimer(30)

;-------------------------------------------------------------------------------------------------------------

light=CreateLight(2)
   LightColor light,50,50,50
   PositionEntity light,100,100,100

AmbientLight 10,10,10

;-------------------------------------------------------------------------------------------------------------

Global dummy=CreatePivot()

Global cam=CreateCamera(dummy)

   PositionEntity cam,0,10,-10
   RotateEntity cam,45,0,0
   CameraZoom cam,1
   CameraRange cam,0.1,1000
   CameraClsColor cam,100,100,200
   
;----------------------------------------------------------------------------------------------------------

Global cursor=LoadMesh ("c:\_austausch\testcube.x")  ; das 3D Tileelement, Randvertices sollten sich ungefähr decken
EntityFX cursor,0

;------------------------------------------------------------------------------------------------------


Global marker=CreateSphere()              ; nur zur Visualisiereung
PositionEntity marker,-100,-100,-100
ScaleEntity marker,0.1,0.1,0.1
EntityColor marker,255,0,0


;-----------------------------------------------------------------------------------------------------


Type tileType                     ; Type für alle Tileelemente
Field tilemesh
End Type
Global t.tileType



Type normalmarkerType                     
Field normalmarkermesh
Field normalcolor
End Type
Global n.normalmarkerType




;--------------------------------------------------------------------------------------------------------------


Dim Vertexsammlung#(9,500,7)              ;9 Tiles max, 25 Vertex max ,X,Y,Z,NX,NY,NZ,Vertexcount



Global  Tilecount=0
Global  Vertmax=500   ; maximale Anzahl Vertices pro Tile



Global  Xpos#=0
Global   Ypos#=0
Global   Zpos#=0   

Global NormalsOn=0
   
   
   
;---------------------------------------------------------------------------------------------------------------------------------



While Not KeyHit(1)

   If KeyDown(30)  Then TurnEntity dummy,0,-2,0
   If KeyDown(32)   Then TurnEntity dummy,0,2,0

   
   If KeyHit(205) Then Xpos#=Xpos#+1
   If KeyHit(203) Then Xpos#=Xpos#-1
   If KeyHit(200) Then Ypos#=Ypos#+1
   If KeyHit(208) Then Ypos#=Ypos#-1
   If KeyHit(54)  Then Zpos#=Zpos#+1
   If KeyHit(157) Then Zpos#=Zpos#-1
   If KeyHit(82)  Then RotateMesh  cursor,0,90,0
   
   If KeyHit(14)  Then NormalsOn=NormalsOn+1
   If NormalsOn=1 Then showNormals()
   If NormalsOn=3 Then killNormals()
   If NormalsOn=4 Then NormalsOn=1
   
   
   
   
   PositionEntity cursor,Xpos,Ypos,Zpos
   
   

   If KeyHit(57) Then newTile()
   If KeyHit(79) Then writeVerts()
    If KeyHit(80) Then compareVerts()
    If KeyHit(81) Then setNormals()


                          
   UpdateWorld
   RenderWorld
   
   
   
   ;For x=0 To Tilecount-1
   ;   For y=0 To Vertmax-1
   ;     Text x*80,y*10, Vertexsammlung(x,y,4)
      
   ;   Next
      
   ;Next
   
   Text 10,540,"Backspace   ShowNormals(slow)"
   Text 10,560,"A + D für Kamera           Pfeiltasten,Strg,Rshift für Cursor           Leertaste für neues Tile  "
   Text 10,580,"1  für writeVertices       2  für  compareVertices                      3 für updateVertices      "
   
   
   
   
   


   
   WaitTimer frametimer
   Flip 0
   
Wend


;---------------------------------------------------------------------------------------------------------------------------------

Function writeVerts()  ;schreibt alle Vertices mit Koordinaten+Normalen in ein Array
   

   
   Local typeNummer1=0
   

   For t.tileType= Each tileType
   
            

      surface= GetSurface(t\tilemesh,1)
         
            For V=0 To CountVertices(surface)-1
            
TFormPoint VertexX#(surface,V),VertexY#(surface,V),VertexZ#(surface,V),t\tilemesh,0
            
Vertexsammlung(typeNummer1,V,1)= TFormedX#()
Vertexsammlung(typeNummer1,V,2)= TFormedY#()
Vertexsammlung(typeNummer1,V,3)= TFormedZ#()
            
      
;TFormNormal VertexNX(surface,V),VertexNY(surface,V),VertexNZ(surface,V),0,t\tilemesh 
            
Vertexsammlung(typeNummer1,V,4)=VertexNX(surface,V);TFormedX#()
Vertexsammlung(typeNummer1,V,5)=VertexNY(surface,V);TFormedY#()
Vertexsammlung(typeNummer1,V,6)=VertexNZ(surface,V);TFormedZ#()
            
Vertexsammlung(typenummer1,V,7)= CountVertices(surface); store Vertexcount
            
            
         
         Next
         
         typeNummer1=typeNummer1+1
   
      Next
      
End Function


;------------------------------------------------------------------------------------------------------------------------------------



Function compareVerts()   ;Vergleicht die Vertices
      

         For typeNummer2=0 To Tilecount
      
            For V2=0 To Vertexsammlung(typeNummer2,V2,7)-1
            

            
               For typenummer3=0 To Tilecount
               
               
                  If typenummer2=typenummer3 Then Goto label1      
                        
                       For V3=0 To Vertexsammlung(typenummer3,V3,7)-1
                     
   
                     
XYZtest=0
            
If Abs(Vertexsammlung(typeNummer2,V2,1)-Vertexsammlung(typeNummer3,V3,1))<0.1 XYZtest=XYZtest+1
If Abs(Vertexsammlung(typeNummer2,V2,2)-Vertexsammlung(typeNummer3,V3,2))<0.1 XYZtest=XYZtest+1
If Abs(Vertexsammlung(typeNummer2,V2,3)-Vertexsammlung(typeNummer3,V3,3))<0.1 XYZtest=XYZtest+1
                        
                        

                        


                        ;berechne neue Normalen aus den 2 alten

If XYZtest=3 Then

Copy2X#=Vertexsammlung(typeNummer2,V2,4)
Copy2Y#=Vertexsammlung(typeNummer2,V2,5)
Copy3Z#=Vertexsammlung(typeNummer2,V2,6)
                     
Copy3X#=Vertexsammlung(typeNummer3,V3,4)
Copy3Y#=Vertexsammlung(typeNummer3,V3,5)
Copy3Z#=Vertexsammlung(typeNummer3,V3,6)
                        
                        
Copy4X#=Copy2X-Copy3X
Copy4Y#=Copy2Y-Copy3Y
Copy4Z#=Copy2Z-Copy3Z


Copy5X#=Copy3X+Copy4X*0.5
Copy5Y#=Copy3Y+Copy4Y*0.5
Copy5Z#=Copy3Z+Copy4Z*0.5




                        

Length# = Sqr#(Copy5X#^2.0+Copy5Y#^2.0+Copy5Z#^2.0)
Copy6X#= Copy5X#/Length#
Copy6Y# =Copy5Y#/Length#
Copy6Z#= Copy5Z#/Length#                        
                        
                        
                        
                        ;Überschreibe alte Normalen                  
                        
Vertexsammlung(typeNummer2,V2,4)=Copy6X#              
Vertexsammlung(typeNummer2,V2,5)=Copy6Y#                        
Vertexsammlung(typeNummer2,V2,6)=Copy6Z#
                     
                                    
Vertexsammlung(typeNummer3,V3,4)=Copy6X#
Vertexsammlung(typeNummer3,V3,5)=Copy6Y#   
Vertexsammlung(typeNummer3,V3,6)=Copy6Z#
                        
                        
EndIf                         
                        
                        
                                             
                                    
                                       
                                                                     
                                                                  
                     Next
            
               .label1
               Next
               
               
            Next
                              
      Next
            
            
            
            
End Function             
            
            
;-----------------------------------------------------------------------------------------------------------------------------            
            
            
Function setNormals() ;liest das Array und setzt die Normalen


         Local typeNummer4=0

         For t.tileType= Each tileType
         
                 surface= GetSurface(t\tilemesh,1)
         
                  For V=0 To CountVertices(surface)-1
               
               
               
               

VertexNormal surface,V,Vertexsammlung(typeNummer4,V,4),Vertexsammlung(typeNummer4,V,5),Vertexsammlung(typeNummer4,V,6)                                                                                 
                  
;PositionEntity marker,Vertexsammlung(typeNummer4,V,1),Vertexsammlung(typeNummer4,V,2),Vertexsammlung(typeNummer4,V,3)
;UpdateWorld
;RenderWorld
;Flip
 
                  
                  
                  
                  Next
            
            typeNummer4=typeNummer4+1
            
               
         Next
         
         
End Function

            
            
      

         
         


;-------------------------------------------------------------------------------------------------------------------------------


Function newTile()
   
t.tileType=New tileType
t\tilemesh=CopyMesh(cursor)
Tilecount=Tilecount+1
;UpdateNormals t\tilemesh 
PositionEntity t\tilemesh,EntityX(cursor),EntityY(cursor),EntityZ(cursor)
   
End Function



;---------------------------------------------------------------------------------------------------------------------------------



Function showNormals()    ; Zeigt Normalen für Visualisierung

        For x=0 To Tilecount

R=Rnd(100,255)
G=Rnd(100,255)
B=Rnd(100,255)

         
         For y=0 To Vertexsammlung(x,y,7)
         
n.normalmarkerType=New normalmarkerType
n\normalmarkermesh=CreateCube()
EntityColor n\normalmarkermesh,R,G,B
ScaleEntity n\normalmarkermesh, 0.1,0.1,0.1
PositionEntity n\normalmarkermesh,Vertexsammlung(x,y,1),Vertexsammlung(x,y,2),Vertexsammlung(x,y,3)
            
n.normalmarkerType=New normalmarkerType
n\normalmarkermesh=CreateCube()
EntityColor n\normalmarkermesh,R,G,B
ScaleEntity n\normalmarkermesh, 0.1,0.1,0.1
PositionEntity n\normalmarkermesh,Vertexsammlung(x,y,1)+Vertexsammlung(x,y,4),Vertexsammlung(x,y,2)+Vertexsammlung(x,y,5),Vertexsammlung(x,y,3)+Vertexsammlung(x,y,6)
            
      
            
            
            
         Next
         
      Next
      
NormalsOn=2
      
End Function


;------------------------------------------------------------------------------------------------------------------------------------
                     
Function killNormals()


      For n.normalmarkerType=Each normalmarkerType
         
FreeEntity n\normalmarkermesh
Delete n
   
      Next
      
      
End Function    
      
      


Irgendwas geht bei der Berechnung der neuen Normalen schief Crying or Very sad

[EDITED] Bescheuerte if-Konstruktion ersetzt.
  • Zuletzt bearbeitet von Foppele am Do, Nov 29, 2007 1:15, insgesamt 3-mal bearbeitet
 

Dreamora

BeitragMi, Nov 28, 2007 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du keine Tileengine daraus machen willst, kannst du es auch als einzelnes mesh machen weil dann wirst du nicht sehr viel mehr als 1.5 Bildschirm gross zupflastern können wegen den Surfaces (autoface hilft da nicht viel)
Dann müsste eigentlich AddMesh und UpdateNormals bereits helfen wenns gut läuft Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragMi, Nov 28, 2007 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Na ja, Tileengine wäre dann Schritt 2 und der Grund für das hier, aber erst mal will ich das mit den Kanten hinkriegen.
Bis auf die Neuberechnung der Normalen, was zugegebenermassen der wichtigste Part ist, klappt ja alles.

Werd mir mal die mathematischen Grundlagen zu Gemüte führen müssen...Ich habe bis jetzt 2 Vektoren addiert und dann normalisiert, aber da kommt irgendwie Schrott bei raus.
 

Dreamora

BeitragMi, Nov 28, 2007 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Welche 2 Vektoren hast du normalisiert?

Weil eigentlich können es nicht 2 sein.

1. Es sind mindestens 4 (ausser ganz aussen am terrain wo es nur 2 sind)
2. Darfst du nicht die normalen der Vertices nehmen. Du musst die flächennormalen der anliegenden Triangles nehmen( wenn die Vektoren v1, v2 und v3 haben dann ist die normale (v2-v1)x(v3-v1) wobei x das kreuzprodukt ist). Denn die normale für die vertices in der ecke soll ja das gesmoothte der Flächen sein nicht irgend eine absurde kombination der schon falschen ecknormalen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragMi, Nov 28, 2007 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also eine Normale setzt sich aus den Flächennormalen aller umliegenden Triangles zusammen,O.K....

Wenn nun an einen Vertex 3 Triangle grenzen, und an einen anderen ebenfalls, und man führt diese 2 Vertices zusammen warum muss man dann alles neu berechnen? Es sind doch dann alle Flächennormalen aller angrenzenden Triangles in diesen beiden Vertexnormalen enthalten?

Mein Code hat übrigens einige anschauliche Visualisierungsfunktionen, man kann genau sehen wie sich die Berechnung auf die Normalen auswirkt. Eine absurde Kombination kommt da nicht raus, eher eine halbkorrekte.
 

Dreamora

BeitragMi, Nov 28, 2007 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Sie müssen nicht zwingend in der Vertexnormalen integriert sein, dass ist das Problem ...
Wenn du sicher sein kannst das es genau die anliegenden sind, dann ist es kein Problem, dann kannst du einfach die Vertexnormalen (der normalerweise 4 vertices, denn innen grenzen 4 tiles aneinander, nicht 2) mit einander verrechnen
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group