

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2010/01/13 13:08
// 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);
}
}
}
// 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);
}
}
}여러분의 커뮤니케이션을 기다리고 있습니다.

Posted by EHXM. Posted in " Adobe Flash Platform/Tutorial "2009/06/10 23:09
Posted by pixgram2010/03/03 17:11
쭉 훑어보니까 플랜을 만들고 거기다가 맵을 씌우는데요.. 플랜말고 flash에서 만든 movieclip을 scene에 추가하는 방법은 없나요?
EHXM2010/03/04 01:19
튜토리얼에서는 BitmapFileMaterial을 사용했는데요, MovieMaterial이라는 것도 있습니다.
아래는 MovieMaterial에 대한 문서이구요..
http://www.papervision3d.org/docs/as3/org/papervision3d/materials/MovieMaterial.html
무비클립의 인스턴스나, flex에서는 컴포넌트도 적용이 가능합니다.
여러분의 커뮤니케이션을 기다리고 있습니다.

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 메소드를 호출
복사시 이줄을 삭제해주세요
여러분의 커뮤니케이션을 기다리고 있습니다.

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;
}
}
}
결과화면
여러분의 커뮤니케이션을 기다리고 있습니다.

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;
}
}
}
}
결과화면 (클릭후 방향키 입력)
여러분의 커뮤니케이션을 기다리고 있습니다.

아이디어의 전쟁의 현장이었던 2010년 대한민국 매쉬업 경진대회에 다녀왔습니다. 이번 대회는 지난 2월 6일(토요일), 삼성동 코엑스 컨퍼런스룸 401에서 열렸습니다. 이번.....
2010년에 100가지가 넘는 안드로이드 폰 출시가 될 예정입니다. Mobile World Congress keynote에서 Google CEO Eric Schmidt의 연설.....
서울, 안양, 부산, 대구, 광주, 대전에 안드로이드 폰 체험 할 수 있는 곳이 있네요. 저는 코엑스 메가박스 입구에 있는 모토로라 체험 부스에서 우연히 모토로이를 만져보게 되.....
위 3D 갤러리는 http://www.fotoviewr.com/ 사이트의 Fotoviewr 입니다. Flex와 Papervision3D를 이용하여 위와같은 3D 갤러리를 구현해.....
Total : 115,871 Today : 227 Yesterday : 155