Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-04-2009, 14:46   #1 (permalink)
Neuer User
 
Registriert seit: Apr 2009
Beiträge: 3
Question Papervision 2.0 Probleme mit Clipping

Hallo Alleseits,

bin ein ziemlicher noob was Papervision angeht und hab so einige Probleme. Meine Aufgabe ist einen Flug über die Erde zu simulieren. Auf der Erde befinden sich Gebäude die ich per Geocode platziere.
Meine Herangehensweise bis jetzt ist, dass ich eine Sphere erzeuge, die Kamera leicht nach unten geneigt über dem nordpol platziere und um zu den Punkten zu fliegen einfach die Sphere rotiere. Soweit so gut... allerdings habe ich bei geringem Abstand von Erde und Kamera massive Clipping Probleme am unteren Bildrand. Habe jetzt auch schon versuch das ganze mit FrustumClipping zu rendern dabei aber das Problem dass ich dann noch eine Framerate von ca. 8 Fps habe und ich die QuadrantRenderEngine nicht mehr benutzen kann.
Hat vielleicht jemand schonmal etwas ähnliches gemacht und eine Ahnung wie ich das Clipping in den Griff bekomme ohne massive Performance Probleme?

Hier noch mal ein bischen Code:

Code:
package {
	import gs.TweenLite;
	
	import net.hires.debug.Stats;
	
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.cameras.DebugCamera3D;
	import org.papervision3d.core.clipping.FrustumClipping;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.render.QuadrantRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;	

	public class Earth extends Sprite {

		private var vp : Viewport3D;
		private var cam : Camera3D;
		private var scene : Scene3D;
		private var bre : BasicRenderEngine;
		private var sphere : Sphere;
		private var mat : WireframeMaterial;
		private var mat1 : BitmapFileMaterial;
		private var radius : Number = 6378;
		private var myCollada : Sphere;
		private var myLat : Number = 48.853873;
		private var myLng : Number = 2.351074;
		private var latLng : Object = {lat:myLat, lng:myLng};
		private var myLat1 : Number = 53.545204;
		private var myLng1 : Number = 10.003052;
		private var latLng1 : Object = {lat:myLat1, lng:myLng1};
		private var geoArr : Array;
		private var FRA : Object;
		private var PAR : Object;
		private var posIndex : int = 0;
		private var myCollada1 : Sphere;
		private var cont : DisplayObject3D;
		private var camTarget : Cube;
		private var debugCam : DebugCamera3D;
		private var mat2 : ColorMaterial;
		private var qre:QuadrantRenderEngine;

		public function Earth() {
			setupPV3D();
			buildShpere();
			buildMarker();
			addEventListener(Event.ENTER_FRAME, loop);
			stage.addEventListener(MouseEvent.CLICK, nextLocation);
			addChild(new Stats());
		}

		private function setupPV3D() : void {
			vp = new Viewport3D(800, 600, false);
			debugCam = new DebugCamera3D(vp);
			cam = new Camera3D();
			cam.z = 0;
			cam.x = 0;
			cam.y = radius + 10;
			scene = new Scene3D();
			qre = new QuadrantRenderEngine(QuadrantRenderEngine.CORRECT_Z_FILTER);
			bre = new BasicRenderEngine();
			bre.clipping = new FrustumClipping(FrustumClipping.BOTTOM);
			//qre.clipping = new FrustumClipping(FrustumClipping.ALL); 
			addChild(vp);
		}

		private function buildShpere() : void {
			cont = new DisplayObject3D();
			mat = new WireframeMaterial(); 
			mat1 = new BitmapFileMaterial("earthmap2k.jpg");
			mat2 = new ColorMaterial(0xffff00);
			sphere = new Sphere(mat2, radius, 200, 200);
			cont.addChild(sphere);
			scene.addChild(cont);
			var mtl : MaterialsList = new MaterialsList({all:mat});
			camTarget = new Cube(mtl, 5, 5, 5);
			sphere.addChild(camTarget);
			camTarget.z = 1;
			camTarget.x = 1;
			camTarget.y = radius + 5;
			cam.target = camTarget;
		}

		private function buildMarker() : void {
			//myCollada = new Collada("Parktower/models/model.dae");
			//myCollada1 = new Collada("Parktower/models/model.dae");
			myCollada = new Sphere(mat, 50);
			myCollada1 = new Sphere(mat, 50);
			sphere.addChild(myCollada);
			sphere.addChild(myCollada1);
			placeMarker(myCollada, latLng);
			placeMarker(myCollada1, latLng1);
			PAR = {marker:myCollada, latLng:latLng};
			FRA = {marker:myCollada1, latLng:latLng1};
			geoArr = [PAR,FRA,PAR,FRA,PAR,FRA,PAR,FRA,PAR,FRA,PAR,FRA];
			myCollada.scaleX = myCollada.scaleY = myCollada.scaleZ = .1;
			myCollada1.scaleX = myCollada1.scaleY = myCollada1.scaleZ = .1;
		}

		private function placeMarker(pMarker : DisplayObject3D, pLatLng : Object) : void {
			var position : Object = getGeoLocation(pLatLng);
			pMarker.x = position.x;
			pMarker.y = position.y;
			pMarker.z = position.z;
			pMarker.lookAt(sphere);
			pMarker.rotationX -= 90;			
		}

		private function getGeoLocation(pLatLng : Object,offSet : int = 0) : Object {
			var phi : Number = (90 - pLatLng.lat) * Math.PI / 180;
			var theta : Number = (pLatLng.lng + 180) * Math.PI / 180;
			var position : Object = {x:(radius + offSet) * Math.sin(phi) * Math.cos(theta), y:(radius + offSet) * Math.cos(phi), z:(radius + offSet) * Math.sin(phi) * Math.sin(theta)};
			return position;
		}

		private function nextLocation(event : MouseEvent) : void {
			flyTo(geoArr[posIndex]);
			posIndex++;
		}

		private function flyTo(pLocationTo : Object) : void {
			
			var lat : Number = pLocationTo.latLng.lat;
			var lng : Number = pLocationTo.latLng.lng;
			var targetPos : Object = getGeoLocation(pLocationTo.latLng, 10);
			TweenLite.to(camTarget, 3, {x:targetPos.x, y:targetPos.y, z:targetPos.z});
			TweenLite.to(sphere, 6, { rotationY:lng - .5});
			TweenLite.to(cont, 6, { rotationZ:lat - 90 - .5});
		}

		
		
		
		
		private function loop(event : Event) : void {
			//bre.renderScene(scene, cam, vp);
			qre.renderScene(scene, cam, vp);
		}
	}
}

Geändert von DrDawnamight (22-04-2009 um 17:01 Uhr)
DrDawnamight ist offline   Mit Zitat antworten
Alt 23-04-2009, 08:01   #2 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Ort: Braunschweig
Beiträge: 164
Ich würde den Beitrag am besten in das Forum '3D' verschieben (lassen).
Da sind die Aussichten auf Beantwortung höher.

Ansonsten kann ich dazu nur sagen, daß ich in dem Bereich auch
Probleme hatte, die ich nicht wirklich in den Griff gekriegt hatte.
Ich wollte, wenn 3D noch mal ein Thema bei mir wird, ein anderes Paket
probieren.

Grüße,
Matthias Kievernagel
mkiever ist offline   Mit Zitat antworten
Alt 23-04-2009, 12:03   #3 (permalink)
experience++;
 
Benutzerbild von salazar
 
Registriert seit: Jul 2002
Ort: Düsseldorf
Beiträge: 11.347
hallo DrDawnamight,
bitte nix doppelt posten hier im forum! ich habe deinen anderen beitrag gelöscht und diesen wie gewünscht in den 3D bereich verschoben.

cheers,
sal
__________________
Bitte keine Flashfragen an mich schicken. Dafür ist ja das Forum da! Das betrifft auch Profilnachrichten.
Chuck Norris hat den Flash Player für alle mobilen Betriebssysteme!
salazar ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
clipping, papervision, pv3d

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele