Linien zeichnen (In 3D)

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

Linien zeichnen (In 3D)

Beitrag von Stimpy »

Einen wunderschönen guten Mittag,

herjeh - Schon wieder stecke ich in meinem Projekt fest, da ich mal wieder an der Lösung verzweifel :( Ich hoffe ich gehe euch nicht auf den Senkel :roll:

Mein Problem ist folgendes:

Stage3D kennt keine Primitive, leider, lediglich Triangle. Es gibt keine Linien, Punkte, TriangleStrips oder sonst irgendwas. Das ist an sich auch nicht weiter schlimm - Sofern man nicht auf einmal doch Linien zeichnen muss. Doch genau dies muss ich jetzt, in 3D Linien zeichnen. Das ganze funktioniert auch so halbwegs schon, allerdings sehen die Linien je nach Winkel o.ä. immer anders aus. Hier einmal ein Beispiel:

Bild

Mein bisheriger Ansatz war es, den Start-Vektor - Ziel-Vektor zu subtrahieren, dadurch habe ich den ViewVector. Und diesen gehe ich so dick meine Linie sein soll vom Start Punkt weg. Das selbe beim Zielpunkt und so erhalte ich meine 4 Punkte.

Klappt ganz gut, leider allerdings weit entfernt von wirklich gleich dicken Linien.

Der Quelltext sieht so aus:

Code: Alles auswählen

		public function lineTo(x1:Number, y1:Number, x2:Number,y2:Number):void
		{
			
			var size:Number = 0.5;
			var z:Number = -5;
			
			addIndex(mVertexCount); addIndex(mVertexCount + 3); addIndex(mVertexCount +1);
			addIndex(mVertexCount + 2); addIndex( mVertexCount + 3); addIndex(mVertexCount);
		
			var tmp:CVertex = new CVertex(x1,y1,z);
			tmp.minus(new CVertex(x2,y2,z));
			tmp.normalize(tmp);
			
			// Von DrawPosition zu X,Y,Z
			addVertex(new CVertex(x1, y1, z));
			addColor(0, 0, 0); addUV(0, 0); addNormal(new CVertex(0, 0, -1));
			
			addVertex(new CVertex(x1 + (tmp.x / 3), y1 + (tmp.y / 3), z));
			addColor(0, 0, 0); addUV(1, 0); addNormal(new CVertex(0, 0, -1));
			
			addVertex(new CVertex(x2, y2, z));
			addColor(0, 0, 0); addUV(0, 1); addNormal(new CVertex(0, 0, -1));
			
			addVertex(new CVertex(x2 + (tmp.x / 2), y2 + (tmp.y / 2), z));
			addColor(0, 0, 0); addUV(1, 1); addNormal(new CVertex(0, 0, -1));
		}
Hat hier jemand evtl. eine Idee wie man es besser macht?

Vielen Vielen Dank!
Benutzeravatar
dot
Establishment
Beiträge: 1736
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Linien zeichnen (In 3D)

Beitrag von dot »

Mal die Linien im Viewspace, also Start und Endpunkt mit der Viewmatrix transformieren und dann zwischen diesen Punkten eine Linie malen ohne World Matrix ;)
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

Re: Linien zeichnen (In 3D)

Beitrag von Stimpy »

Meinst du jetzt sozusagen WorldToScreen umrechnung und dann mit Flash 2D die Linie zeichnen?!?!! Wenn ja, dann würde dies nicht gehen da die Linie schon in 3D da sein müsste.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Linien zeichnen (In 3D)

Beitrag von eXile »

dot hat geschrieben:Mal die Linien im Viewspace, also Start und Endpunkt mit der Viewmatrix transformieren und dann zwischen diesen Punkten eine Linie malen ohne World Matrix ;)
Das würde noch nicht ausreichen, weil man für überall gleich dicke Linien mindestens bis in den Projection-Space transformieren muss. D.h. für solche Linien muss man die Model-, View- und Projection-Matrizen invertieren, wenn du eine davon nicht hast, wird es schwierig.
Benutzeravatar
dot
Establishment
Beiträge: 1736
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Linien zeichnen (In 3D)

Beitrag von dot »

Das ist natürlich richtig. Ich ging nur davon aus, dass er mit "gleich dick" nicht tatsächlich überall die selbe Linienbreite meint, sondern eigentlich einfach nur einen stetigen Verlauf der Linienbreite, da er ja "3D" will...
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Linien zeichnen (In 3D)

Beitrag von eXile »

Achso, ja, das kann sein; dann hast du natürlich vollkommen recht! In dem Falle geht das auch ohne Projektionsmatrix, und zwar so:

Bild
Antworten