TypeError: Error #1007: Versuchte Instanziierung für einen Nicht-Konstruktor.

intercorni

Erfahrenes Mitglied
Hallo,

ich versuche gerade, das Papervision Beispiel der rotierenden Erdkugel nachzubauen:
http://www.insideria.com/2009/02/creating-an-interactive-globe.html]

Allerdings bekomme ich immer die Fehlermeldung:
TypeError: Error #1007: Versuchte Instanziierung für einen Nicht-Konstruktor.
at StaticPapervisionGlobe()

Das Script habe ich fast ausnahmslos aus dem Tutorial verwendet:

PHP:
package 
{
   import caurina.transitions.Tweener;
   
   import flash.display.Bitmap;
   import flash.events.Event;
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent;
   import flash.filters.DropShadowFilter;
   import flash.geom.Point;
   import flash.text.TextField;
   
   import org.papervision3d.core.math.Matrix3D;
   import org.papervision3d.core.math.Number3D;
   import org.papervision3d.materials.BitmapMaterial;
   import org.papervision3d.objects.DisplayObject3D;
   import org.papervision3d.objects.primitives.Sphere;
   import org.papervision3d.view.BasicView;
   
   [SWF(backgroundColor = "0xFFFFFF", frameRate="30")]
   public class StaticPapervisionGlobe extends BasicView
   {
      [Embed(source="assets/earthmap1k.jpg")]
      private var textureImage:Class;
      private var sphere:Sphere;
      private var container : DisplayObject3D;
      
      private var previousMousePoint : Point = new Point();
      private var targetScale : Number = 1;
  
       private static const FORWARD:Number3D = new Number3D(0, 0, 1);
  
      public function StaticPapervisionGlobe()
      {
         super();
   
         var bmp:Bitmap = new textureImage() as Bitmap;
         var bmpMaterial:BitmapMaterial = new BitmapMaterial( bmp.bitmapData );
         
         sphere = new Sphere(bmpMaterial, 600, 64, 64);
         
         sphere.alpha = .5
         sphere.rotationX = 0;
         sphere.rotationY = 180;
         sphere.rotationZ = 0;
         
         container = new DisplayObject3D();
         container.addChild( sphere, "sphere" );
         
         scene.addChild(container);
         singleRender();
         
         this.stage.doubleClickEnabled = true;
         this.stage.addEventListener( MouseEvent.DOUBLE_CLICK, onDoubleClickHandler );
         this.stage.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDownHandler );
         this.stage.addEventListener( MouseEvent.MOUSE_WHEEL, onMouseWheelHandler );
         this.stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyDownHandler );
         
         var text : TextField = new TextField();
         text.width = 200;
         text.text = "Use the mouse to drag/pan\nUse the mouse wheel to zoom\nR - reset to default view\n+/- to zoom in/out";
         this.stage.addChild( text );
         
         resetView();
       }
      
      private function onKeyDownHandler( event : KeyboardEvent ) : void
      {
         trace( event.keyCode );
         switch ( event.keyCode ) 
         {
            case 187: // +
            case 107: // +
              zoom( 3 );
              break;    
            case 189: // -
            case 109: // -
              zoom( -3 );
              break;
            case 82: // r (reset)  
              resetView();
              break;  
          }
       }
      
      private function onMouseWheelHandler( event : MouseEvent ) : void
      {
         zoom( event.delta );
       }
      
      private function onDoubleClickHandler( event : MouseEvent ) : void
      {
         zoom( 10 );
       }
      
      private function onMouseDownHandler( event : Event ) : void
      {
         Tweener.removeAllTweens();
         this.startRendering();
         previousMousePoint = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
         this.stage.addEventListener( MouseEvent.MOUSE_MOVE, onMouseMoveHandler );
         this.stage.addEventListener( MouseEvent.MOUSE_UP, onMouseUpHandler );
       }
      
      private function onMouseUpHandler( event : Event ) : void
      {
         this.stopRendering();
         this.stage.removeEventListener( MouseEvent.MOUSE_MOVE, onMouseMoveHandler );
         this.stage.removeEventListener( MouseEvent.MOUSE_UP, onMouseUpHandler );
       }
      
      private function onMouseMoveHandler( event : Event ) : void
      {  
         var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
    
         var difference:Point = currentMousePoint.subtract(previousMousePoint);
          var vector:Number3D = new Number3D(difference.x, difference.y, 0);
    
         var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
         rotationAxis.normalize();
    
         var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
         var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/(600*Math.pow(container.scale, 5)));
    
         container.transform.calculateMultiply3x3(rotationMatrix, container.transform);
         
         //this line used to apply transform to actual rotation values, so that if you change scale, the changes are persisted
         container.copyTransform(container);
         
         previousMousePoint = currentMousePoint
         
         trace( container.rotationX, container.rotationY, container.rotationZ, container.scale ); 
       }
      
      private function zoom( delta : Number ) : void
      {
         targetScale = targetScale + (delta * .01);
         targetScale = Math.max( targetScale, .5  );
         targetScale = Math.min( targetScale, 1.6 );
         Tweener.addTween( this, {sceneScale:targetScale, time:1, transition:"easeOutQuart"} )
       }
      
      public function resetView() : void
      {
         Tweener.addTween( container, {time:3, rotationX:-45, rotationY:0, rotationZ:0, transition:"easeOutQuart"} )
         Tweener.addTween( this, {sceneScale:1, time:3, transition:"easeOutQuart"} )
       }
      
      public function set sceneScale( value : Number ) : void
      {
         container.scale = value;
         singleRender();
       }
      
      public function get sceneScale() : Number
      {
         return container.scale;
       }
      
    }
}

Woran könnte das liegen?
 
Woraus kompilierst du? Von Flex oder aus der Flash IDE?
PHP:
 [Embed(source="assets/earthmap1k.jpg")]
      private var textureImage:Class;

Metadaten erkennt nur der Flex Compiler.
 
Da muss ich dich leider berichtigen: Auch aus der Flash IDE kann man Metadaten kompilieren, sofern der Pfad zum Flex-SDK 3 dem Flash bekannt ist!
 
Ja das Beispiel funktioniert nur mit Flex, wusste ich leider nicht. Das sind auch meine ersten Erfahrungen mit AS3 :)
Das Bild habe ich nun so eingebunden:

PHP:
erdmaterial = new BitmapFileMaterial("assets/earthmap1k.jpg");
			erdmaterial.doubleSided = true;
			erdmaterial.smooth = true;
			erdmaterial.interactive = true;
So funktioniert es.
Allerdings habe ich extreme Probleme, ein Scripting zu enwickeln, welches ein
Dragging mit der Maus ermöglicht: die Erdkugel soll mit der Maus gedreht werden.
Dazu habe ich drei Bereiche definiert:
1. onMouseDown
2. onMouseUp
3. onMouseMove

Leider gelingt es mir nicht, damit die Erdkugel drehbar zu machen.
Würde mich sehr über Hilfe freuen
Hier meine Scripting:

PHP:
package{
	// flash
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.filters.DropShadowFilter;
	
	//papervision
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.events.InteractiveScene3DEvent; 
	import org.papervision3d.core.math.Matrix3D;
   	import org.papervision3d.core.math.Number3D;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.view.BasicView;
	

	// Primitives
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.objects.primitives.Sphere;

	//material
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.shaders.PhongShader;
	import org.papervision3d.materials.shaders.ShadedMaterial;
	import org.papervision3d.render.BasicRenderEngine;

	[SWF(width ="1024", height="768", backgroundColor = "0xFFFFFF", frameRate="30" )]


	public class plane extends Sprite {
		private var viewport: Viewport3D;
		private var scene: Scene3D;
		private var camera: Camera3D;
		private var material: ColorMaterial;
		private var primitive: Plane;
		private var erde: Sphere;
		private var renderer: BasicRenderEngine;
		private var wolkenmaterial: BitmapFileMaterial; 
		private var erdmaterial: BitmapFileMaterial; 
		private var container : DisplayObject3D;
		private var previousMousePoint : Point = new Point();
      	private var targetScale : Number = 1;
  		private static const FORWARD:Number3D = new Number3D(0, 0, 1);
		
		private function objectClicked( erde:InteractiveScene3DEvent ) : void
			{
    			//trace( erde.displayObject3D );
				//erde.rotationY += (((mouseX-(stage.stageWidth/2))/5)-erde.rotationY)/3;
      			//erde.rotationX += ((((mouseY-(stage.stageHeight/2))/2))-erde.rotationX)/3;
			} 
		
		
		public function plane():void {
			viewport = new Viewport3D(1024, 768, false, true, true, true);
			viewport.buttonMode = true;
			addChild(viewport);
			viewport.interactive = true;
			viewport.interactiveSceneManager.addEventListener( InteractiveScene3DEvent.OBJECT_CLICK, objectClicked );
			

			scene = new Scene3D();
			camera = new Camera3D();
			camera.x = 0;
			camera.y = 0;
			camera.z = -340; 
			renderer = new BasicRenderEngine();
			material = new ColorMaterial(0x333333);
			material.doubleSided = true;

			wolkenmaterial = new BitmapFileMaterial("assets/himmel.jpg");
			wolkenmaterial.doubleSided = true;
			wolkenmaterial.interactive = true;


			erdmaterial = new BitmapFileMaterial("assets/earthmap1k.jpg");
			erdmaterial.doubleSided = true;
			erdmaterial.smooth = true;
			erdmaterial.interactive = true;
	

			primitive = new Plane(wolkenmaterial, 1024, 768, 3, 3);
			primitive.x = 0;
			primitive.y = 0;
			scene.addChild(primitive);
			//camera.lookAt(primitive);//Kamera auf Plane ausrichten

			erde = new Sphere(erdmaterial, 120, 18, 18);//Erde
			scene.addChild(erde);
			
			this.stage.doubleClickEnabled = true;
			this.stage.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDownHandler );
			
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			function onEnterFrame(e:Event):void {
      			//erde.rotationY += ((-(mouseX-(stage.stageWidth/2))/5)-erde.rotationY)/3;
      			//erde.rotationX += ((-((mouseY-(stage.stageHeight/2))/2))-erde.rotationX)/3;

				//renderer.renderScene(scene, camera, viewport);
			}
			
			

		}
		//---------------------------------------------------------------------------------------------------
			private function onMouseDownHandler( event : Event ) : void
      		{
         		renderer.renderScene(scene, camera, viewport);
				trace("onMouseDown");
         		previousMousePoint = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
         		this.stage.addEventListener( MouseEvent.MOUSE_MOVE, onMouseMoveHandler );
         		this.stage.addEventListener( MouseEvent.MOUSE_UP, onMouseUpHandler );
       		}
			private function onMouseUpHandler( event : Event ) : void
      		{
				trace("onMouseUp");
         		//stopRendering();
         		this.stage.removeEventListener( MouseEvent.MOUSE_MOVE, onMouseMoveHandler );
         		this.stage.removeEventListener( MouseEvent.MOUSE_UP, onMouseUpHandler );
       		}
      
      		private function onMouseMoveHandler( event : Event ) : void
      		{  
				trace("onMouseMove");
         		var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
    
         		var difference:Point = currentMousePoint.subtract(previousMousePoint);
          		var vector:Number3D = new Number3D(difference.x, difference.y, 0);
    
         		var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
         		rotationAxis.normalize();
    
         		var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
        		//var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/(600*Math.pow(container.scale, 5)));
    
         		//container.transform.calculateMultiply3x3(rotationMatrix, container.transform);
         
         		//container.copyTransform(container);
         
         		//previousMousePoint = currentMousePoint
         
       		}
			//-----------------------------------------------------------------------------------------------------------------

	}

}
 
Ich habe jetzt die Möglichkeit, durch die Abfrage der Maus-Zustände, eine Drehung der Weltkugel zu erreichen:

PHP:
this.stage.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDownHandler );

private function onMouseDownHandler( event : Event ) : void
      		{
         		//renderer.renderScene(scene, camera, viewport);
				//trace("onMouseDown");
         		previousMousePoint = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
         		this.stage.addEventListener( MouseEvent.MOUSE_MOVE, onMouseMoveHandler );
         		this.stage.addEventListener( MouseEvent.MOUSE_UP, onMouseUpHandler );
       		}
			private function onMouseUpHandler( event : Event ) : void
      		{
				//trace("onMouseUp");
         		this.stage.removeEventListener( MouseEvent.MOUSE_MOVE, onMouseMoveHandler );
         		this.stage.removeEventListener( MouseEvent.MOUSE_UP, onMouseUpHandler );
       		}
      
      		private function onMouseMoveHandler( event : Event ) : void
      		{  
				//trace("onMouseMove");
				erde.rotationY += ((-(mouseX-(stage.stageWidth/2))/5)-erde.rotationY)/3;

         
       		}

Das funktioniert soweit schon ganz gut: die Erdkugel lässt sich nach dem Anklicken mit der Maus in der Horizontalen drehen. Allerdings hat diese Methode einen Schönheitsfehler: Ich klicke auf die Erdkugel, halte die Maustaste gedrückt, somit kann ich in diesen Zustand die Kugel drehen. Lasse ich die Maustaste los (onMouseUpHandler) und klicke dann wieder auf die Erdkugel, dreht sich die Erdkugel wieder zurück, was ich aber nicht möchte. Ich kann so also mit mehreren Mausklicks nicht die Erdkugel um 360 Grad drehen. Aber genau das möchte ich erreichen.
In einem Beispiel hatte ich folgendes AS ausprobiert, welches bei mir elider nicht funktionierte:

PHP:
private function onMouseDown( event : Event ) : void
      {
         Tweener.removeAllTweens();
         this.startRendering();
         previousMousePoint = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
         this.stage.addEventListener( MouseEvent.MOUSE_MOVE, onMouseMove );
         this.stage.addEventListener( MouseEvent.MOUSE_UP, onMouseUp );
       }
      
      private function onMouseUp( event : Event ) : void
      {
         this.stopRendering();
         this.stage.removeEventListener( MouseEvent.MOUSE_MOVE, onMouseMove );
         this.stage.removeEventListener( MouseEvent.MOUSE_UP, onMouseUp );
       }
      
      private function onMouseMove( event : Event ) : void
      {  
         var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
    
         var difference:Point = currentMousePoint.subtract(previousMousePoint);
          var vector:Number3D = new Number3D(difference.x, difference.y, 0);
    
         var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
         rotationAxis.normalize();
    
         var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
         var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/(600*Math.pow(container.scale, 5)));
    
         container.transform.calculateMultiply3x3(rotationMatrix, container.transform);
         
         //this line used to apply transform to actual rotation values, so that if you change scale, the changes are persisted
         container.copyTransform(container);
         
         previousMousePoint = currentMousePoint
         
         trace( container.rotationX, container.rotationY, container.rotationZ, container.scale ); 
       }
 
Zurück