3D Tiles verschweissen[Erledigt]
Übersicht

![]() |
FoppeleBetreff: 3D Tiles verschweissen[Erledigt] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, ich will das unbedingt so machen ![]() 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... |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cooles Teil, dein Meshterrain ![]() 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! |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
so, hier mal ein Bild davon was ich vorhabe: Schnell hingerotzt aber ich denke es wird deutlich, was diesen Ansatz anders macht. ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
[Gelöscht weil ich Fehler gefunden habe] | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na toll, nun habe ich mich auf die Suche gemacht, festgestellt, dass mir dein Code etwas zu ''durcheinander'' schien und dann mein Meshterrain modifiziert. ![]() 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... ![]() |
||
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
hectic hat Folgendes geschrieben: Falls wir nicht die ganze Zeit aneinander vorbei geredet haben....
Ja, ich hatte ein wenig das Gefühl ![]() 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 ![]() 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 ![]() [EDITED] Bescheuerte if-Konstruktion ersetzt. |
||
- Zuletzt bearbeitet von Foppele am Do, Nov 29, 2007 1:15, insgesamt 3-mal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Foppele |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group