Linie auf Y-Achse nicht sichtbar / Grid zeichen

Started by fosb, March 09, 2011, 10:33:21 PM

Previous topic - Next topic

fosb

Noch eine Frage:

Wenn aus diesem Topic
http://www.jpct.net/forum2/index.php/topic,1091.0.html

diesen Code

public Object3D createLine3D(SimpleVector from, SimpleVector to)
{
Object3D object=new Object3D(4);

SimpleVector delta=to.calcSub(from);
SimpleVector zaxis=delta.getRotationMatrix().getZAxis();
zaxis=zaxis.normalize();
zaxis.rotateY(1.571f);
SimpleVector from1=new SimpleVector(from);
from1.add(zaxis);
SimpleVector to1=new SimpleVector(to);
to1.add(zaxis);
object.addTriangle(from, 0, 0, from1, 0, 1, to1, 1, 1);
object.addTriangle(to1,1,1,to,1,0,from,0,0);
from1=new SimpleVector(from);
from1.y-=2f;
to1=new SimpleVector(to);
to1.y-=1f;
object.addTriangle(from, 0, 0, from1, 0, 1, to1, 1, 1);
object.addTriangle(to1,1,1,to,1,0,from,0,0);
object.build();
object.setCulling(Object3D.CULLING_DISABLED);
return object;
}


benutzte um eine Linie auf der Y-Achse zu zeichnen, ist diese nicht sichtbar.
(Wenn ich die Linie leicht schräg zeichne, z.B. den Anfang und das Ende auf der x-Achse leicht versetzt wird die Linie gestrichelt dargestellt)

Woran liegt das und kann ich das Problem beheben?


Danke nochmals

fosb

#1
Mir ist dazu noch mehr eingefallen,

ich habe "Linien" aus dem Grund des oben genannten Problems so gezeichnet:

cylinder = Primitives.getCylinder(2, 0.1f, 100000f);

Ich habe da aber sehr starke Probleme mit alaising (hoffe ich verwende den Begriff richtig).

Die Linien (in einem Gitter angeordnet) werden je nachdem wie nahe dran oder weit entfernt ich bin - oder/und in  in
welchem Winkel ich sie betrachte nicht oder gestört angezeigt..

Kann man so etwas beheben?
Bzw. wie zeichne ich ein Grid richtig, das es egal wie ich zoome gut angezeigt wird?



EgonOlsen

Du könntest mal mit der Dicke der Zylinder rumspielen. Letztendlich wirst du aber mit diesem Ansatz immer ab einer gewissen Zoomstufe Probleme mit dem Undersampling bekommen, also zu wenig Punkte für zuviel Linie und dann wird die Linie ausfransen und unterbrochen werden. Du kannst es auch mal mit Anti-Aliasing probieren, aber das können die meisten Intel-Grafikchips nicht...ansonsten habe ich jetzt auch keine so richtig schlaue Idee. Vielleicht hilft ein Screenshot, damit man besser versteht, was genau du damit eigentlich machen willst.

fosb

Ich habe jetzt mal ein paar Bilder gemacht als Beispiele (handelt sich hierbei nur um Ausschnitte):

sieht gut aus:
http://img694.imageshack.us/i/exampl1.jpg/

weiter "herausgezoomt", sieht schon nicht mehr so gut aus,
die etwas dikeren "Linien" kreuzen sich in der Mitte des Screens:
http://img851.imageshack.us/i/exampl2.jpg/

noch weiter "herausgezoomt", jetzt fehlen "Linien":
http://img851.imageshack.us/i/exampl3.jpg/

dann mit einem anderen Blickwinkel:
http://img848.imageshack.us/f/exampl4.jpg/

und ein letztes Beispiel:
http://img3.imageshack.us/i/exampl5.jpg/


Gibt es da irgendwelche Tipps wie man sonst so ein Gitter besser zeichnen
oder das Problem lösen kann?

EgonOlsen

Ich hätte noch eine Idee, aber dazu müsste ich genau wissen, was da noch kommt. Ich sehe das Gitter und den Nebel im Hintergrund, der offenbar als Textur auf einer Plane klebt, die hinter dem Gitter liegt, richtig? Kommt da noch was drüber? Planeten, Raumschiffe, fliegende Pferde... ???

fosb

Genau,

Plane hinter Gitter.
Geplant sind Planeten die ihren Mittelpunkt im Grid haben und dieses dann teilweise überlagern,
außerdem Raumschiffe, Asteroiden darüber...
Und vielleicht auch Linien, die angeben wo sich die Objekte hinbewegen (wenn das einigermaßen hinhaut mit den Linien).

ja und vielleicht auch noch fliegende Pferde - who knows,
oder eine Schildkröte mit 4-5 Elefanten auf ihrem Rücken, die wiederum eine Scheibenwelt tragen ^^



EgonOlsen

Hmm...also dann...aber es ist nicht schön:


  • FrameBuffer löschen
  • Alle Objekte auf unsichtbar setzen bis auf die Hintergrundplane, normal zeichnen mit renderScene/draw
  • Alle Objekte auf unsichtbar setzen bis auf das Gitter bzw. sonstige Linienobjekte, normal zeichnen mit renderScene/drawWireframe
  • Plane und Gitter/Linenobjekte auf unsichtbar, alle anderen sichtbar und dann normal zeichnen mit renderScene/draw/update/display

Könnte gehen...alternativ zu dem ganzen Umgesetze der Sichtbarkeiten kann man auch mit mehreren World-Instanzen arbeiten, aber das wäre komplizierter zu erklären gewesen. Letztendlich ist OpenGL leider nicht wirklich für das Zeichnen von Linien gemischt mit "echtem" 3D optimiert, weil die Linien mit dem Tiefenpuffer nichts anstellen usw.

Andere Idee: Eine Textur bauen, die nur aus einem schwarzen Rand besteht und in der Mitte transparent ist. Diese Textur als zweiten Texturlayer auf die Nebelplane aufbringen und die u/v-Koordinaten dabei so wählen, das sich die Textur sehr oft wiederholt.

fosb

okay,


erstmal vielen Dank für deine Hilfe,
ich werd mich da dran setzen und ausprobieren,
wenn ich ein (gutes) Resultat habe gebe ich nochmal Rückmeldung,
kann allerdings dauern, viel zu viele Baustellen ^^


Danke nochmals

fosb