| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: Apr 2009
Beiträge: 3
|
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) |
| | |
| | #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 |
| | |
| | #3 (permalink) |
| experience++; 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
__________________
Chuck Norris hat den Flash Player für alle mobilen Betriebssysteme! |
| | |
![]() |
| Lesezeichen |
| Stichworte |
| clipping, papervision, pv3d |
| Themen-Optionen | |
| Ansicht | |
| |