Tris erstellen unter schwierigen Bedingungen
Übersicht

![]() |
eizdealerBetreff: Tris erstellen unter schwierigen Bedingungen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Wie würdet ihr folgendes Problem angehen: Gegeben ist ein quadratisches Tile, in dem die Eckpunkte einer zu erstellenden Fläche gegeben sind. Beispiel: Ecke links oben, Ecke rechts unten und Ecke rechts oben -> Triangle zwischen diesen Punkten. Das ganze lässt sich natürlich noch sehr viel komplizierter gestalten, z.b. durch deutlich mehr Punkte, die auch innerhalb des Vierecks liegen. Das Ziel ist es jetzt, die Eckpunkte möglichst effektiv miteinander zu verbinden, sodass die Fläche gefüllt wird. Wie gesagt, vorhanden sind: Die X/Y/Z Werte der Punkte und die Fläche. Möglichkeiten gibt es sicher viele, eigentlich scheint es auch recht leicht zu gehen. Aber wie bringe ich das konkret Blitz bei? Die Tris müssen ja auch richtigrum sein etc. Edit: Das war jetzt zugegebenermaßen nicht sonderlich gut beschrieben, deswegen habe ich noch ne kleine Skizze gemacht: ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Edit: Gut mit deinem Edit ergibt das kein Sinn mehr ![]() Nochmals ein Edit: Finde heraus, in welchen triangle sich der vorgegebene Punkt befindet, lösche dieses heraus. Du hast ja noch die Vertices V0 bis V2 diese verbindest du in folgender Reihenfolge durch ein Tris: V0 - P - V1; V1 - P - V2; V2 - P V0. ![]() |
||
vertex.dreamfall.at | GitHub |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja hast du alle punkt im 3d-raum verteilt - dann kannst du nicht so einfach fläche bilden - wenn du allerdings alle punkte auf einer ebene hast, dann ist es einfacher.
Ich hatte ein ähnliches Problem. Ich habe Umrisspunkte vorgegeben - es sollte dann eine Fläche erzeugt werden. Man kann diese Fläche rechtsrum oder linksrum erzeugen. Ich habe darum einen Punkt genommen und dann 2 nächste Punkte. Wenn es ein rechtsdrehender Dreieck ist, dann erstellst du einen Dreieck. Ansonsten lässt man es. Dann machst du nächste Punkte - bis keine Dreiecke übrig bleiben. Also wenn eine Fläche linksrum erstellt wurde, dann dürfen nur Dreiecke mit "linksdrehenden" Punkten erstellt werden. Also wenn eine Fläche rechtsrum erstellt wurde, dann dürfen nur Dreiecke mit "rechtsdrehenden" Punkten erstellt werden. Da man es nicht weiß, ob eine Fläche rechts/linksrum erstellt wurde, muss man beide Lösungen verfolgen - und nur eine lässt sich lösen - VORAUSGESETZT du hast keine Überschneidungen !!! Wenn du allerdings aus 3D-Punkten einen Raumkörper bilden willst, dann gute Nacht |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank schonmal für die Antworten, ist schließlich nicht selbstverständlich, sich in seiner Freizeit in solch ein komplexes Thema einzuarbeiten ![]() Vertex: Deine Lösung habe ich leider nicht ganz verstanden. Bedenke, dass es auch sehr viel mehr Punkte mit unterschiedlichen Koordinaten sein können. Wo fange ich an? Wie sage ich Blitz das? TheShadow: Im Prinzip brauche ich eine Funktion, bei der ich die Eckpunkte eines Vierecks angebe sowie Punkte, an denen dieses Viereck einen zusätzlichen Vertexpunkt bekommen soll. Wie rum die Tris gedreht werden müssen, dürfte eher ein kleineres Problem sein, da die Kameraperspektive feststeht. |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm stellt sich als komplizierstes heraus, als ich dachte. Ersteinmal ist es wichtig, das Du alle punkte in einem Type abspeicherst mit X, Y und Z Koordinaten sowie den index des gepickten Triangles(PickedTriangle) und das Handle des gepcikten Surfaces(PickedSurface). Jetzt kannst Du die Liste via For - Each - Schleife abarbeiten. Nun musst Du das Triangle löschen, das gepickt wurden ist, und durch 3 weitere ersetzen. Dies geschieht, in dem Du zuerst die Triangledaten ebenfalls in einem Type absicherst, der die 3 Vertexindices beinhaltet. Jetzt wo alle Triangles gespeichert sind, kannst alle Triangles im Surface löschen via ClearSurface point/surface, False, True und per newPoint = AddVertex(point/surface, point/x#, point/y#, point/z#) den neuen Vertex hinzufügen. Jetzt musst Du den Triangle type wieder per For - Each - Schleife abarbeiten, und die Triangles ins triangleleere Surface hineinerstrellen. Dabei wird aber das triangle point/triangleIndex ausgelassen. Für dieses erstellst Du 3 andere Triangles, die mit dem neuen punkt verbunden sind. Also
AddTriangle point/surface, triangle/v0, newPoint, triangle/v2 AddTriangle point/surface, triangle/v1, newPoint, triangle/v1 AddTriangle point/surface, triangle/v2, newPoint, triangle/v0 Dabei wird auch automatisch das BackfaceCUlling richtig gesetzt. Ist dies erledigt, kannst Du den Triangletype via Delete Each triangle löschen. Das ganze mit dem Kopieren ist denke ich sau langsam, das man in Blitz nicht neue Vertexindices einem Triangle zuweisen kann. Alles ohne Gewär, aber das muss eigentlich so funzen. Edit: TS: Einen ganzen Körper so zu bauen, geht auch. Man berechnet per Trianglenormals, welches Triangle am nähsten an den zu erstellenden Vertex ist, und geht genau wie oben beschrieben vor. Die Normals der Vertices müssten vorerst senkrecht auf dem Triangle stehen. Wenn dann alles fertig ist, kann man den Vertices die Normals an den Bruchstellen der Triangles an den Vertexecken benutzen um aus denen den Durchschnitt zu bilden, und den jeweiligen Vertex zu zu weisen (also praktisch ein smoothen der Normals) mfg olli |
||
vertex.dreamfall.at | GitHub |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für dein Problem gibt es bestimmt fertige algorythmen aber
die meisten werden in C++ sein . |
||
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vertex: Sorry, das habe ich leider nicht ganz verstanden ![]() Wie gesagt, das einzige was ich habe, sind die Positionen der Ecken und die der Zwischenpunkte. Diese sind in einem Type gespeichert. Deswegen weiß ich leider nicht ganz, welches Dreieck ich picken soll ![]() Markus: Ich wäre dir sehr dankbar, wenn du mir den Link zu so einer Funktion geben könntest, bzw. mir sagen wonach man da konkret suchen muss. |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@eizdealer
müßte unter Triangulieren fallen . Link habe ich gerade nicht hier ... |
||
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, dank ST hat es Klick gemacht und ich hab das verstanden. Jetzt habe ich aber gleich das nächste Problem (*g*). OJay meinte, dass das nur mit höherer Mathenatik zu lösen ist, kommt halt dumm wenn man erst in der 11. ist.
Folgendes: Ich habe die Breite und Länge eines Rechtecks, seinen Mittelpunkt und seine Umdrehung in Grad. Nun möchte ich die Koordinaten der Eckpunkte berechnen. Hört sich mal wieder einfach an, aber der Teufel steckt eben im Detail. Hoffe, ich habe das einigermaßen verständlich erklärt, das ist ja auch nicht immer ganz einfach *g* |
||
![]() |
DCSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() Sowas? Und da die Eckpunkte ermitteln? Also ich würde so vorgehen um z.b. hier die obere Ecke zu ermitteln (angenommen Rechteck ist um 45° nach Rechts gedreht): 1. Rote Linie: Mit Sin und Cos vom Mittelpunkt aus um die Hälfte der Breite (x/2) bewegen, so dass man auf den Rand kommt. Als Winkel bei Sin und Cos einfach den Winkel der Drehnung nehmen. Hier also: 45°-90° 2. Grüne Linie: Von dort aus mit Sin und Cos in Richtung der Drehung (45°) um die Hälfte der Höhe (Y/2) des Rechtecks bis zur Ecke bewegen. Fertig. Das kann man dementsprechend auch für die anderen 4 Ecken abwandeln. Ist sicherlich nicht die beste Lösung, aber müsste gehen. |
||
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com | www.CarnageContest.com | www.Stranded3.com |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke DC, damit hat's geklappt.
Für alle, die irgendwann mal auf das gleiche Problem stoßen: Code: [AUSKLAPPEN] SetX# = 320
SetZ# = 240 Width# = 100 Height# = 50 Rotation# = 50 Graphics 640,480,0,2 SetBuffer BackBuffer() Repeat Rotation = Rotation + MouseXSpeed() AddX1# = Cos(Rotation) * Width# AddX2# = Sin(Rotation) * Height# AddZ1# = Sin(Rotation) * Width# AddZ2# = Cos(Rotation) * Height# X1# = SetX# - AddX1# + AddX2# Z1# = SetZ# - AddZ1# - AddZ2# X2# = SetX# - AddX1# - AddX2# Z2# = SetZ# - AddZ1# + AddZ2# X3# = SetX# + AddX1# - AddX2# Z3# = SetZ# + AddZ1# + AddZ2# X4# = SetX# + AddX1# + AddX2# Z4# = SetZ# + AddZ1# - AddZ2# Line X1, Z1, X2, Z2 Line X2, Z2, X3, Z3 Line X3, Z3, X4, Z4 Line X4, Z4, X1, Z1 Text X1, Z1, "1" Text X2, Z2, "2" Text X3, Z3, "3" Text X4, Z4, "4" Flip Cls Until KeyHit(1) : End |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group