태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

안드로이드용 영어 어학기 Smart LC

스마트LC 소개 링크:
http://blog.ehxm.net/123

티스토어 링크:
http://bit.ly/awW3XW

Papervision 3D Tutorial 1

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2010/01/13 13:08



Papervision 3D Tutorial 1 : 기본 클래스 구현, 기본 도형 회전




1. Papervision 3D사용을위한 설정에 대한 방법은
FLEX , Papervision 3d를 활용한 3D 갤러리 구현 을 참조하시기 바랍니다.

2. 설정이 끝나면, src폴더에 ehxm폴더를 만들고 pv3dBase.as와 tutorial.as 파일을 생성한 후 다음과 같이 코딩합니다.

ehxm/pv3dBase.as
// ActionScript file - pv3dBase.as

package ehxm{
	
	import flash.display.Sprite;
	import flash.events.Event;
		
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.cameras.*;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.render.BasicRenderEngine;
	
	public class pv3dBase extends Sprite {
		
		//pv3d를 위한 viewport, renderer, scene, camera를 정의		
		public var viewport:Viewport3D;
		public var renderer:BasicRenderEngine;
		public var scene:Scene3D; 
		public var camera:Camera3D;
		
		public function init(vpWidth:Number = 800, vpHeight:Number = 600):void {
			initPV3D(vpWidth, vpHeight); 
			init3d();
			init2d();
			initEvents();
		}
		
		protected function initPV3D(vpWidth:Number, vpHeight:Number):void {
			// viewport, renderer, scene, camera를 초기화
			
			if (vpWidth == 0) {
				viewport = new Viewport3D(stage.width, stage.height, true, true);
			}else{
				viewport = new Viewport3D(vpWidth, vpHeight, false, true);
			}
			addChild(viewport);
			
			renderer = new BasicRenderEngine();
			
			
			scene = new Scene3D();
			camera = new Camera3D();
		}
		
		protected function init3d():void {
			// models, materials, cameras 등을 초기화
		}
		
		protected function init2d():void {
		}
		
		//ENTER_FRAME 이벤트로, 프레임마다 처리해주는 함수
		protected function initEvents():void {
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		protected function processFrame():void {
			// Process any movement or animation here.
		}
		protected function onEnterFrame( ThisEvent:Event ):void {
			processFrame();
			renderer.renderScene(scene, camera, viewport);
		}
		
	}
	
}


ehxm/tutorial.as
// ActionScript file - tutorial.as
package ehxm{
	import mx.containers.Canvas;
	
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.objects.primitives.Cone;
	
	public class tutorial extends pv3dBase{
		public var cone:Cone;
		public var mat:ColorMaterial;
		
		//출력될 canvas를 매개변수로 받아서 canvas의 width, height로  viewport의 width, height설정
		public function tutorial(id:Canvas){
			init(id.width, id.height);
		}
		
		override protected function init3d():void{
			//다각뿔 생성, scene에 추가
			cone = new Cone(null);
			cone.scale = 1;
			camera.zoom=100;
			cone.pitch(-10);
			scene.addChild(cone);
		}
		override protected function processFrame():void{
			//회전
			cone.yaw(1);
		}
	}
}






3. [Ctrl + F11]을 눌러 프로젝트를 build하고 실행해 봅니다.



예제결과


관련 TAG로 검색해보세요. : papervision 3d

¬ COMMENT [0]

여러분의 커뮤니케이션을 기다리고 있습니다.

  1. : 이름
  2. : 홈페이지

  1. : 비밀번호

FLEX , Papervision 3d를 활용한 3D 갤러리 구현

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2009/06/10 23:09


위 3D 갤러리는 http://www.fotoviewr.com/ 사이트의 Fotoviewr 입니다.

Flex와 Papervision3D를 이용하여 위와같은 3D 갤러리를 구현해 보도록 하겠습니다.

구현을 위한 Flex와 Papervision 3D 개발 환경 설정

Papervision 3D 튜토리얼



관련 TAG로 검색해보세요. : 3d, Adobe, flash, flex, papervision, papervision 3d, 플렉스

¬ COMMENT [7]

  1. Posted by Favicon of http://lazyartist.tistory.com BlogIcon LazyArtist2010/01/05 14:51

    공부할 때 영어라 어려웠는데 이렇게 좋은 강좌 정말 감사합니다~ ^^;

     수정/삭제  댓글쓰기

  1. Posted by pixgram2010/03/03 17:11

    쭉 훑어보니까 플랜을 만들고 거기다가 맵을 씌우는데요.. 플랜말고 flash에서 만든 movieclip을 scene에 추가하는 방법은 없나요?

     수정/삭제  댓글쓰기

  1. Posted by pixgram2010/03/04 10:48

    답변 감사드립니다. ^^
    제가 지금 막 as3.0과 pv3d공부를 하는 초짜인데요. 한가지만 더 여쭤볼게요.. ㅠㅠ

    제가 구상하는 거는 그냥 단순히 사람모양(2d)이나 물병(2d) 모양을 한 오브젝트를 화면에 배치하고 마우스의 움직임에 따라 카메라가 살짝살짝 움직이는건데요..

    내가 만든 오브젝트(사람, 물병)를 pv3d를 이용하여 화면에 어떻게 배치하는지를 잘 모르겠습니다. 혹시 방법을 아시면 도움좀 부탁드립니다....;;

     수정/삭제  댓글쓰기

  1. Posted by ramza2010/12/15 03:53

    좋은 강좌 감사합니다. 열심히 구독하겠습니다^^

     수정/삭제  댓글쓰기

  1. Posted by love frex2011/05/28 18:09

    플랙스를 공부하고 있는 학생입니다. 이벤트 처리 과정에서 클릭 부분에서 계속 에러를 발생시키는데, 이유가 궁금합니다. 에러 메시지가 뜨는것은 아니고 화면이 검게 변합니다. 캔버스 뷰에서 받아와서 뿌려줬는데, 그부분이 문제가 아닐까 싶습니다.

     수정/삭제  댓글쓰기

여러분의 커뮤니케이션을 기다리고 있습니다.

  1. : 이름
  2. : 홈페이지

  1. : 비밀번호

Papervision 3D Tutorial 6 : Dynamic Image Material

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2009/06/10 21:57


Papervision 3D Tutorial 6 : Dynamic Image Material

Image를 URL을 통해 동적으로 불러온 후 material로 설정 해 보겠습니다.

AC3에서 동적으로 이미지를 불러오는 경우, Loader클래스를 사용합니다. ( flash.display.Loader )
material 생성자에 URL을 바로 적어서 생성할 수 있지만, 웹에서 외부 이미지를 사용할때는 그 이미지를 코드에서 사용한 시점과 다운받는 시점이 차이가 나기때문에 그 이미지를 확실히 load했을때 사용할 수 있는 방법이 필요하므로, Loader 클래스를 이용하여 이미지를 로드 할 수 있다.

Loader를 사용하기 위해서, Loader 변수를 추가하고, Loader에 이벤트를 등록하고, 이벤트를 처리하여 material로 설정하는 과정으로 이용하면 된다.
Pv3dBase 클래스를 상속 한 후 다음과 같이 변수를 추가한다.

	public class tutorial extends pv3dBase{
		
		private var plane:DisplayObject3D;
		private var cone:Cone;
		private var mat1:BitmapMaterial;
		private var loader:Loader;
		private var statText:TextField

 
생성자에서 Loader를 생성
		public function tutorial(_width:Number, _height:Number){
			loader = new Loader();
			init(_width, _height);
		}

init3d()에서 3D 기본 세팅
		override protected function init3d():void{
			mat1 = new BitmapFileMaterial("images/ehxm.jpg");
			mat1.doubleSided = true;
			mat1.smooth = true;
			
			plane = new Plane(null, 300, 200, 10, 10);
			cone = new Cone(null);
			
			plane.material = mat1;
			
			cone.material = mat1;
			
			cone.x = 150;
			cone.pitch(-30);
			
			plane.x = -150;
			plane.z = 100;
			
			camera.x=0;
			camera.y=0;
			camera.z=-1000;
			camera.zoom=100;
			
			scene.addChild(plane);
			scene.addChild(cone);
		}

init2d()에서 이미지를 불러오는 상태를 출력하는 텍스트 필드를 추가
		override protected function init2d():void{
			statText = new TextField()
			addChild(statText);
		}

initEvent()함수에서 Loader에 관한 이벤트를 등록한 후 핸들러 처리
ProgressEvent.PROGRESS는 Loader에서 이미지를 불러오는 이벤트,
Event.COMPLETE는 load가 완료되었을때의 이벤트
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, handleProgress);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleComplete);
		}

불러오는 과정을 %로 나타내기 위해 다음과 같이 사용하고 텍스트 필드로 출력
		private function handleProgress(event:ProgressEvent):void{
			var percent:Number = event.bytesLoaded / event.bytesTotal * 100;
			statText.text = "Loading . . " + percent.toString();
		}

load가 완료되면 불러온 이미지를 loader.content로 접근할 수 있으며, 여기서는 이미지 파일이므로 Bitmap으로 캐스팅 해준다. 불러온 Bitmap으로 Material 생성 후 Object에 적용
		private function handleComplete(event:Event):void{
			statText.text = "Complete";
			var _bitmap:Bitmap = Bitmap(loader.content);
			mat1 = new BitmapMaterial(_bitmap.bitmapData);
			mat1.doubleSided = true;
			
			plane.material = mat1;
			cone.material = mat1;
		}

이제 loader.load(new URLRequest("이미지주소")); 를 실행하면 이벤트가 실행되고 이미지를 로드할 수 있다.
클래스에 이미지 주소를 받는 메소드를 추가한다. 이 메소드는 Flex에서 버튼을 클릭할때 실행
		public function setImg(imgURL:String):void{
			loader.load(new URLRequest(imgURL));
		}

전체 tutorial 클래스 소스
// ActionScript file
package ehxm{
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import flash.filters.BitmapFilter;
	import flash.net.URLRequest;
	import flash.text.*;
	
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cone;
	import org.papervision3d.objects.primitives.Plane;
	
	public class tutorial extends pv3dBase{
		
		private var plane:DisplayObject3D;
		private var cone:Cone;
		private var mat1:BitmapMaterial;
		private var loader:Loader;
		private var statText:TextField
		
		//출력될 canvas를 매개변수로 받아서 canvas의 width, height로  viewport의 width, height설정
		public function tutorial(_width:Number, _height:Number){
			loader = new Loader();
			init(_width, _height);
		}
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, 

handleProgress);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleComplete);
		}
		private function handleProgress(event:ProgressEvent):void{
			var percent:Number = event.bytesLoaded / event.bytesTotal * 100;
			statText.text = "Loading . . " + percent.toString();
		}
		private function handleComplete(event:Event):void{
			statText.text = "Complete";
			var _bitmap:Bitmap = Bitmap(loader.content);
			mat1 = new BitmapMaterial(_bitmap.bitmapData);
			mat1.doubleSided = true;
			
			plane.material = mat1;
			cone.material = mat1;
		}
		public function setImg(imgURL:String):void{
			loader.load(new URLRequest(imgURL));
		}
		override protected function init3d():void{
			mat1 = new BitmapFileMaterial("images/ehxm.jpg");
			mat1.doubleSided = true;
			mat1.smooth = true;
			
			plane = new Plane(null, 300, 200, 10, 10);
			cone = new Cone(null);
			
			plane.material = mat1;
			
			cone.material = mat1;
			
			cone.x = 150;
			cone.pitch(-30);
			
			plane.x = -150;
			plane.z = 100;
			
			camera.x=0;
			camera.y=0;
			camera.z=-1000;
			camera.zoom=100;
			
			scene.addChild(plane);
			scene.addChild(cone);
		}
		override protected function init2d():void{
			statText = new TextField()
			addChild(statText);
		}
		override protected function processFrame():void{
			cone.yaw(1);
			plane.rotationY = (stage.width/2 - mouseX)/10;
			plane.rotationX = (stage.height/2 - mouseY)/10;
		}
	}
}

mxml파일에 Canvas, Button, TextInput을 추가해서 디자인을 다음과 같이 만들고, 버튼클릭시에 setImg 메소드를 호출
 복사시 이줄을 삭제해주세요

결과화면
보안처리를 해주지 않았으므로,
주소창에 http://ehxm.net/flex/images/ehxm1.jpg 라고 입력하고 클릭.

관련 TAG로 검색해보세요. : flex, papervision 3d

¬ COMMENT [0]

여러분의 커뮤니케이션을 기다리고 있습니다.

  1. : 이름
  2. : 홈페이지

  1. : 비밀번호

Papervision 3D Tutorial 5 : Interaction - Object Interactivity

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2009/06/07 18:00

Papervision 3D Tutorial 5 : Interaction - Object Interactivity

Interaction의 마지막으로, 3D 객체에서 이벤트 발생이 가능하도록 객체에 Interaction을 주는 방법을 알아보겠습니다.

객체에 사진을 Material로 지정하고 사진의 방향이 마우스를 따르고,
클릭하면 크기가 변경되는 Interaction을 구현해보겠습니다.

images폴더에 photo.jpg 라는 사진을 추가합니다. 크기는 389 X 250 pixel입니다.

papervision3d_tutorial.mxml에서 전체적인 크기를 변경합니다. 600 X 400 pixel로 변경하였습니다.

 복사시 이 줄을 생략 해 주세요

tutorial.as 파일과 pv3dBase.as 파일을 다음과 같이 처음의 내용으로 변경합니다.
tutorial.as
// ActionScript file
package ehxm{
	public class tutorial extends pv3dBase{
		
		public function tutorial(_width:Number, _height:Number){
			init(_width, _height);
		}
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		override protected function init3d():void{
		}
		override protected function processFrame():void{
		}
	}
}

pv3dBase.as
// ActionScript file

package ehxm{
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	import mx.core.UIComponent;
	
	import org.papervision3d.cameras.*;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
	
	
	public class pv3dBase extends UIComponent {
		
		//pv3d를 위한 viewport, renderer, scene, camera를 정의한다.		
		public var viewport:Viewport3D;
		public var renderer:BasicRenderEngine;
		public var scene:Scene3D; 
		public var camera:Camera3D;
		
		public function init(vpWidth:Number = 800, vpHeight:Number = 600):void {
			initPV3D(vpWidth, vpHeight); 
			init3d();
			init2d();
			initEvents();
		}
		
		protected function initPV3D(vpWidth:Number, vpHeight:Number):void {
			// viewport, renderer, scene, camera를 초기화 한다.
			
			if (vpWidth == 0) {
				viewport = new Viewport3D(stage.width, stage.height, true, true);
			}else{
				viewport = new Viewport3D(vpWidth, vpHeight, false, true);
			}
			addChild(viewport);
			
			renderer = new BasicRenderEngine();			
			
			scene = new Scene3D();
			camera = new Camera3D();						
		}
		
		protected function init3d():void {
			// models, materials, cameras 등을 초기화 한다.
		}
		
		protected function init2d():void {
		}
		
		//ENTER_FRAME 이벤트로, 프레임마다 처리해주는 함수
		protected function initEvents():void {
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		protected function processFrame():void {
			// Process any movement or animation here.
		}
		protected function onEnterFrame( ThisEvent:Event ):void {
			processFrame();
			renderer.renderScene(scene, camera, viewport);
		}
		
	}
	
}


이제, tutorial.as 파일을 다음과 같이 수정 해 보겠습니다.
DisplayObject3D 객체와,  객체 이벤트인 InteractiveScene3DEvent 클래스가 필요합니다.
package ehxm{
	import flash.events.Event;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.objects.primitives.Plane; 

tutorial 클래스에 필요한 변수를 선언합니다.
public class tutorial extends pv3dBase{
		
		private var texture:BitmapFileMaterial;
		private var plane:DisplayObject3D; 
	

init3d() 함수에서 객체를 생성하고 photo.jpg를 material로 추가합니다.
Plane 생성자의 매개변수는, Plane의 너비, 높이와, 가로의 세그먼트 수, 세로의 세그먼트 수 입니다.
 texture.interactive 속성을 true로 설정하면 객체에 interaction을 줄 수 있습니다.
 texture.doubleSided 속성을 true로 설정하면 텍스쳐를 양쪽에서 다 볼 수 있습니다.

		override protected function init3d():void{
			texture = new BitmapFileMaterial("images/photo.jpg");
			texture.interactive = true;
			texture.doubleSided = true;
			texture.smooth = true;
			
			plane = new Plane(texture, 389, 250, 10, 10);
			
			camera.x = 0;
			camera.y = 0;
			camera.z = -1000;
			camera.zoom = 100;
			
			scene.addChild(plane);
		}

이벤트를 추가하기위해 initEvents() 함수를 수정하겠습니다.
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, objectPress);
			plane.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, objectRelease);
		}

이벤트 핸들러 함수를 코딩합니다. 객체를 클릭하면 크기를 변경하도록 하겠습니다.
		private function objectPress(e:InteractiveScene3DEvent):void{
			e.displayObject3D.scale = 2;
			e.displayObject3D.alpha = 0.5;
		}
		private function objectRelease(e:InteractiveScene3DEvent):void{
			e.displayObject3D.scale = 1;
			e.displayObject3D.alpha = 1;
		}

processFrame() 함수에서 객체의 방향이 마우스를 따라다니도록 코딩합니다.
		override protected function processFrame():void{
			plane.rotationX = -(mouseY - stage.height/2)/10;
			plane.rotationY = -(mouseX - stage.width/2)/10;
		}


전체 tutorial.as 소스입니다.
// ActionScript file
package ehxm{
	import flash.events.Event;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.objects.primitives.Plane; 
	
	public class tutorial extends pv3dBase{
		
		private var texture:BitmapFileMaterial;
		private var plane:DisplayObject3D; 
		
		public function tutorial(_width:Number, _height:Number){
			init(_width, _height);
		}
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, objectPress);
			plane.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, objectRelease);
		}
		private function objectPress(e:InteractiveScene3DEvent):void{
			e.displayObject3D.scale = 2;
			e.displayObject3D.alpha = 0.5;
		}
		private function objectRelease(e:InteractiveScene3DEvent):void{
			e.displayObject3D.scale = 1;
			e.displayObject3D.alpha = 1;
		}
		override protected function init3d():void{
			texture = new BitmapFileMaterial("images/photo.jpg");
			texture.interactive = true;
			texture.doubleSided = true;
			texture.smooth = true;
			
			plane = new Plane(texture, 389, 250, 10, 10);
			
			camera.x = 0;
			camera.y = 0;
			camera.z = -1000;
			camera.zoom = 100;
			
			scene.addChild(plane);
		}
		override protected function processFrame():void{
			plane.rotationX = -(mouseY - stage.height/2)/10;
			plane.rotationY = -(mouseX - stage.width/2)/10;
		}
	}
}

결과화면



관련 TAG로 검색해보세요. : flex, papervision 3d

¬ COMMENT [2]

  1. Posted by 감사2010/02/13 17:13

    너무나 소중한 정보 감사합니다!!
    명정 잘 보내시구요 새해 복 많~이 받으시길 바랍니다^^

     수정/삭제  댓글쓰기

    • Favicon of http://blog.ehxm.net BlogIcon EHXM2010/02/14 15:59

      반가운 댓글이네요~ ㅎ
      네 새해 복 많이 받으세요.

       수정/삭제

여러분의 커뮤니케이션을 기다리고 있습니다.

  1. : 이름
  2. : 홈페이지

  1. : 비밀번호

Papervision 3D Tutorial 4 : Interaction - Keyboard

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2009/06/07 15:19


Papervision 3D Tutorial 4 : Interaction - Keyboard

키보드 입력의 반응에 대해 알아보겠습니다.

키보드 이벤트를 등록하고 반응을 구현하는것은 마우스 인터렉션과 동일합니다.
우선 키보드 이벤트를 구현하고 flex에서 이벤트를 받아오려면 포커스를 얻어야하는데,
그렇게 하기위해서 클래스와 papervision3d_tutorial.mxml을 약간 수정하겠습니다.
PV3D base클래스를 sprite가 아닌 UICOMPONENT를 상속받고, papervision3d_tutorial.mxml에서는
tutorial 클래스를 콤포넌트로 바로등록하거나, 캔버스에 tutorial 객체를 바로 child로 추가하도록 수정하겠습니다.

pv3dBase.as파일을 다음과 같이 수정합니다.

// ActionScript file

package ehxm{
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	import mx.core.UIComponent;
	
	import org.papervision3d.cameras.*;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
	
	
	public class pv3dBase extends UIComponent {
		
		//pv3d를 위한 viewport, renderer, scene, camera를 정의한다.		
		public var viewport:Viewport3D;
		public var renderer:BasicRenderEngine;
		public var scene:Scene3D; 
		public var camera:Camera3D;
		
		public function init(vpWidth:Number = 800, vpHeight:Number = 600):void {
			initPV3D(vpWidth, vpHeight); 
			init3d();
			init2d();
			initEvents();
		}
		
		protected function initPV3D(vpWidth:Number, vpHeight:Number):void {
			// viewport, renderer, scene, camera를 초기화 한다.
			
			if (vpWidth == 0) {
				viewport = new Viewport3D(stage.width, stage.height, true, true);
			}else{
				viewport = new Viewport3D(vpWidth, vpHeight, false, true);
			}
			addChild(viewport);
			
			renderer = new BasicRenderEngine();
			
			
			scene = new Scene3D();
			camera = new Camera3D();
			camera.zoom = 4;			
		}
		
		protected function init3d():void {
			// models, materials, cameras 등을 초기화 한다.
		}
		
		protected function init2d():void {
		}
		
		//ENTER_FRAME 이벤트로, 프레임마다 처리해주는 함수
		protected function initEvents():void {
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		protected function processFrame():void {
			// Process any movement or animation here.
		}
		protected function onEnterFrame( ThisEvent:Event ):void {
			processFrame();
			renderer.renderScene(scene, camera, viewport);
		}
		
	}
	
}

papervision3d_tutorial.mxml를 다음과 같이 수정합니다.
캔버스에 tutorial을 추가하고, setFocus로 포커스를 얻은다음 키보드 입력을 받을 수 있도록 합니다.
 복사시 이 줄을 생략 해 주세요


tutorial.as파일을 다음과 같이 수정합니다.
키보드 입력 값을 가지는 변수를 tutorial클래스에 추가합니다.
	public class tutorial extends pv3dBase{		
		public var cone:Cone;
		public var mat1:BitmapFileMaterial;
		public var mat2:BitmapFileMaterial;
		// 추가된 변수
		public var keyInput:String;

파일의 initEvents()함수에 키보드 이벤트를 등록합니다.
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
			addEventListener(MouseEvent.MOUSE_UP, mouseUp);
			
			//키보드 이벤트 추가
			addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
			addEventListener(KeyboardEvent.KEY_UP, keyUp);
				
		}

호출될 함수를 다음과같이 코딩합니다. 매개변수의 keycode값으로 눌려진 키를 판단하고, 변수에 해당값을 입력합니다.
		//방향키(keyCode 값) 상(38),하(40),좌(37),우(39)
		private function keyDown(e:KeyboardEvent):void{
			if(e.keyCode == 37){
				keyInput = "left";
			}
			else if(e.keyCode == 38){
				keyInput = "up";
			}
			else if(e.keyCode == 39){
				keyInput = "right";
			}
			else if(e.keyCode == 40){
				keyInput = "down";
			}
			else{
				keyInput = "";
			}
		}
		private function keyUp(e:KeyboardEvent):void{
			keyInput = "";
		}

processFrame()함수에서, 해당값에따라 물체를 이동시킵니다.
		override protected function processFrame():void{
			cone.rotationY = (stage.width/2 - mouseX)*2;
			cone.rotationX = (stage.height/2 - mouseY)*2;
			//물체 위치 변경
			if(keyInput == "left"){
				cone.x-=10;
			}
			else if(keyInput == "right"){
				cone.x+=10;
			}
			else if(keyInput == "up"){
				cone.y+=10;
			}
			else if(keyInput == "down"){
				cone.y-=10;
			}
			
		}


전체 tutorial.as파일 소스입니다.
// ActionScript file
package ehxm{
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	
	import mx.controls.Alert;
	
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.objects.primitives.Cone;
	
	
	
	public class tutorial extends pv3dBase{
		
		
		
		public var cone:Cone;
		public var mat1:BitmapFileMaterial;
		public var mat2:BitmapFileMaterial;
		public var m_x:Number;
		public var m_y:Number;
		public var keyInput:String;
		
		

		public var cnt:Number;
		//출력될 canvas를 매개변수로 받아서 canvas의 width, height로  viewport의 width, height설정
		public function tutorial(_width:Number, _height:Number){
			init(_width, _height);
			cnt = 0;
			keyInput="";
					
		}
		override protected function initEvents():void{
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
			addEventListener(MouseEvent.MOUSE_UP, mouseUp);
			
			//this.parentApplication.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
			addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
			addEventListener(KeyboardEvent.KEY_UP, keyUp);
				
		}
		private function mouseDown(e:MouseEvent):void{
			cone.scale = 2;
		}
		private function mouseUp(e:MouseEvent):void{
			cone.scale = 1;
		}
		private function keyDown(e:KeyboardEvent):void{
			if(e.keyCode == 37){
				keyInput = "left";
			}
			else if(e.keyCode == 38){
				keyInput = "up";
			}
			else if(e.keyCode == 39){
				keyInput = "right";
			}
			else if(e.keyCode == 40){
				keyInput = "down";
			}
			else{
				keyInput = "";
			}
		}
		private function keyUp(e:KeyboardEvent):void{
			keyInput = "";
		}
		override protected function init3d():void{
			mat1 = new BitmapFileMaterial("images/ehxm.jpg");
						
			//다각뿔 생성, scene에 추가
			cone = new Cone(mat1);
			cone.scale = 1;
			camera.zoom=100;
			cone.pitch(-10);
			scene.addChild(cone);
		}
		override protected function processFrame():void{
			cone.rotationY = (stage.width/2 - mouseX)*2;
			cone.rotationX = (stage.height/2 - mouseY)*2;
			if(keyInput == "left"){
				cone.x-=10;
			}
			else if(keyInput == "right"){
				cone.x+=10;
			}
			else if(keyInput == "up"){
				cone.y+=10;
			}
			else if(keyInput == "down"){
				cone.y-=10;
			}
			
		}
	}
}


결과화면 (클릭후 방향키 입력)

관련 TAG로 검색해보세요. : flex, papervision 3d

¬ COMMENT [0]

여러분의 커뮤니케이션을 기다리고 있습니다.

  1. : 이름
  2. : 홈페이지

  1. : 비밀번호

[안드로이드] 영어 어학기 어플

영어 듣기 공부 많이들 하시나요? 따로 어학기를 장만하시기는 비용이 들죠? 스마트폰에서 MP3 파일을 터치를 이용해서 자유롭게 듣을 수 있는 영어 어학기 어플입니다. 동아리.....

2010년 대한민국 매쉬업 경진대회 후기, 아이디어 전쟁을 다녀와서..

아이디어의 전쟁의 현장이었던 2010년 대한민국 매쉬업 경진대회에 다녀왔습니다. 이번 대회는 지난 2월 6일(토요일), 삼성동 코엑스 컨퍼런스룸 401에서 열렸습니다. 이번.....

2010년 100가지가 넘는 안드로이드폰이 몰려온다!

2010년에 100가지가 넘는 안드로이드 폰 출시가 될 예정입니다. Mobile World Congress keynote에서 Google CEO Eric Schmidt의 연설.....

[안드로이드] 모토로이 체험할 수 있는 곳 (전국)

서울, 안양, 부산, 대구, 광주, 대전에 안드로이드 폰 체험 할 수 있는 곳이 있네요. 저는 코엑스 메가박스 입구에 있는 모토로라 체험 부스에서 우연히 모토로이를 만져보게 되.....

위 3D 갤러리는 http://www.fotoviewr.com/ 사이트의 Fotoviewr 입니다. Flex와 Papervision3D를 이용하여 위와같은 3D 갤러리를 구현해.....

무료 MP3 포멧 변경 툴 - Free MP3 WMA Converter
무료 MP3 포멧 변경 툴 - Free MP3 WMA Converter
무료 MP3 포멧 변경 툴 - Free MP3 WMA Converter
무료 MP3 포멧 변경 툴 - Free MP3 WMA Converter
언톡 2010년 신입생 모집 포스터
Android, LEGO NXT를 이용한 Sudoku Solving Robot 제작
Android, LEGO NXT를 이용한 Sudoku Solving Robot 제작
Android, LEGO NXT를 이용한 Sudoku Solving Robot 제작
Android, LEGO NXT를 이용한 Sudoku Solving Robot 제작

Category

전체보기 (108)
Anycall Dreamers (1)
안드로이드 (39)
Adobe Flash Platform (20)
Algorithm (0)
개발노트 (6)
경험 (33)

글 보관함

2011/02 (3)

2011/01 (1)

2010/09 (1)

2010/08 (1)

2010/07 (2)

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

믹시


Total : 115,871 Today : 227 Yesterday : 155