Szene flackert / verschwindet - Float-Ungenauigkeit!

Status
Nicht offen für weitere Antworten.

Florianer

Mitglied
Hi,

ich hab mal ne Frage an euch. Ich hab ne Szene, in der steht ein Würfel, ein Kirchturm mit Spitze. Das Ganze steht auf einem grünen Quader, der 2000x500x2 groß ist. Darunter befindet sich 'die Welt'. Ein weiterer Quader, der die gigantischen Ausmaße von 2000000x2000000x3 hat. Um diese Fläche habe ich eine Hemisphere gesetzt, die auf der Innenseite Sterne hat. Soweit so gut.

Das Problem ist nun, dass, selbst wenn ich nur 200m von der Mitte entfernt bin, je nach Kameraansicht [Zoom/Abstand, Neigungswinkel, Rotationswinkel] die Szene flackert. Mal ist nichts zu sehen, dann dreh ich die Kamera um 1°, dann ist alles da. 2° Neigung geändert, und die Objekte sind da, aber der grüne Streifen weg.

OK, ich hab während des Schreibens da noch mal dran rum gespielt... eigentlich war der Quader nur halb so groß. Also 1.5f hoch... es sah immer so aus, als wenn der Quader vllt springen und somit die andren Sachen verdecken würde. Aufgefallen ist mir das, weil der neue Kirchturm so hoch ist und die Spitze eigentlich immer zu sehn war, der Rest aber verschwand. Ich hab den Quader nun einfach auf 10/2=5f Höhe gesetzt. Ganze, glatte Zahl... dieses Springen scheint wohl weg zu sein.

Trotzdem die Frage: Warum passiert das? Kann man was einstellen, um das zu verhindern? (Außer die Größe so zu manipulieren)?
 

Krondor

Aktives Mitglied
Ähm ich hab so meine Zweifel dass dir jemand mit diesen Angaben helfen kann. Wie wäre es mit Beispielcode oder zumindest ein paar Informationen was du für ein System benutzt? Welche Frameworks? Welche Algorithmen etc.
 

Florianer

Mitglied
öhm... ja ;)
Java3d
Boxen im SimpleUniverse
Code:
	public BranchGroup createLoft( float shiftX, float shiftY, float shiftZ,
	float width, float height, float depth,
	Color color, String objectName, String texture){
		Box box = new Box( width/2, height/2, depth/2, box.GENERATE_NORMALS|Box.GENERATE_TEXTURE_COORDS, null);
.......
Und das ändert meine View:
Code:
	public void setViewPosition(){
		ViewingPlatform ourView = universe.getViewingPlatform();
		Transform3D locator = new Transform3D();
		//locator.setTranslation(new Vector3f(0, 3f, -3f));
		locator.lookAt( getViewer().getPosition(), getViewer().getFixedLookingPoint(), new Vector3d(0d, 1d, 0d));
		System.out.println("Pos: " + getViewer().getPosition() + " to: " + getViewer().getFixedLookingPoint());
		locator.invert();
		ourView.getViewPlatformTransform().setTransform(locator);
	}

Das sind jetzt nur 2 Codefragmente aus einem doch schon größeren Projekt... mir ginge es jetzt mehr um das theoretische Verständnis, warum bei 1.5f Darstellungsfehler auftreten, bei 5f keine. Und ob es eine Art Optimierungsparameter gibt...
 

Marco13

Top Contributor
Ist schwer zu sagen, aber solche Probleme können(!) zum Beispiel(!) auftreten, wenn man bei der View die Near- und Far-Clipping-Plane zu weit auseinander setzt (und wenn du sie so gesetzt hast, dass die ganze 2000000x2000000-Box sichtbar ist, sind sie definitiv zu weit auseinander). Das Problem ist hier beschrieben http://en.wikipedia.org/wiki/Z-fighting , und verstärkt sich eben mit steigendem Anstand zwischen near- und far clip plane...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben