본문 바로가기

ActionScript/AS3.0

표시객체의 3d속성 활용 후 뭉개지는 현상






표시객체들의 속성중 3D에 관련된
z , rotationX ,rotationY, rotatoinZ   등을 이용하면 간편하게 3D효과를 낼 수 있다.

하지만 대상이 비트맵이라면 이럴 경우 애들 상태가
블러로 마구 문지른거같이 뭉개지게 된다.
게다가 왠지 모르게 크기자체도 1px정도 늘어난 것 같다.(실제 width,height는 늘어나지 않는다. 그래서 더 골때림)
그래서 아마 이미지가 뭉개져 보이는 것같다.

아래의 샘플은 버튼을 누르면 대상의 z값을 0으로 설정한다.



 애초에 모든 표시객체 z값의 기본값이 0 임에도 불구하고 동적으로 설정하는 순간 맛이 가기 시작하는데...


아래의 링크에서 보면 해결방법을 제시한다.
http://www.flashandmath.com/flashcs4/blursol/index.html 

허탈할정도로 간단한 방법이다. 온갖 삽질을 한 내가 부끄럽다.

width/height 가 강제적으로 1픽셀씩 늘어나는게 문제라면

원본크기와 3d효과를 먹고 뭉개진 상태가 된 크기의 비율차를 구하여 
다시 보정한다.

방법은 아래와 같다. 

var bm:Bitmap = new Bitmap(소스);

var photoXFactor:Number= _bm.width/(_bm.width+1);

var photoYFactor:Number=_bm.height/(_bm.height+1);

_bm.z = 0; 

_bm.scaleX=photoXFactor;

_bm.scaleY=photoYFactor;


하지만 이럴경우 scale값이 자체가 변하게 된다. 일종의 꼼수보정이다.
scale을 다시 1로 돌려버리면 또다시 이미지가 뭉개지기 때문에
원하지 않을 경우
이대로 둔다면 이후에 생각치못한 오류를 만나게 될수 있다. 

z , rotationX ,rotationY, rotatoinZ
  속성들을 지정하여서 한번이라도 3d객체로 인식되었다면
이속성들을 아무리 기본값인 0 0 0 0 준다한들  제상태로 돌아오지 않는다. 

다시 뭉개지기전 상태로 돌릴려면 Matrix 를 이용해야 한다.
 

var mtrx:Matrix = new Matrix(1,0,0,1,tg.x,tg.y);
tg.transform.matrix = mtrx;

보통 이런 이슈를 일으키는 가장 빈번한 경우가 rotationY등을 이용하여 대상을 회전시킬때다.
이럴 경우 첫번째 방법으로 사용하여 모션을 실행한뒤 모션이 끝나면 두번째 방법으로 다시 초기화시키는게 좋을것 같다.




참고로 회전 중심을 잡기 위해 비트맵이미지를 Sprite와같은 컨테이너에 x,y좌표를 설정하여 addChild 했을 경우

컨테이너에 보정을 거는게 아니라 비트맵객체에 보정을 걸고
컨테이너의 rotationY를 변경하여 모션을 진행해야 한다.
안그러면 애가 또 뭉개짐 ㅋ