2010-03-17 3 views
0

이것은 불행히도 설명하기에 상당히 복잡한 문제이므로, 텍스트의 벽에 실망하지 마십시오. 이유가 있습니다. ;)Actionscript 3에서 회전 된 객체의 크기를 올바르게 조정하는 방법은 무엇입니까?

나는 Actionscript 3로 작성된 플래시 용 변환 관리자에서 작업 중이다. 사용자는 사각형과 같이 화면에 객체를 배치 할 수있다.

이 직사각형은 이동, 크기 조정 또는 회전 할 수 있습니다.

기본적으로 플래시는 객체의 왼쪽 상단 주위를 회전하기 때문에 중심 주위로 회전하기를 원하기 때문에 각 표시 객체 (예 : 사각형)에 대해 래퍼 설정을 만들었습니다.

이는 래퍼가 설치됩니다 방법입니다

//the position wrapper makes sure that we do get the top left position when we access x and y 
var positionWrapper:Sprite = new Sprite(); 
positionWrapper.x = renderObject.x; 
positionWrapper.y = renderObject.y; 

//set the render objects location to center at the rotation wrappers top left 
renderObject.x = 0 - renderObject.width/2; 
renderObject.y = 0 - renderObject.height/2; 

//now create a rotation wrapper, at the center of the display object 
var rotationWrapper:Sprite = new Sprite(); 
rotationWrapper.x = renderObject.width/2; 
rotationWrapper.y = renderObject.height/2; 

//put the rotation wrapper inside the position wrapper and the render object inside the rotation wrapper 
positionWrapper.addChild(rotationWrapper); 
rotationWrapper.addChild(renderObject); 

이제 객체의 x와 y에 액세스 할 수 있으며, 직접 설정 : mainWrapper.x 또는 mainWrapper.y을. 회전은 메인 랩퍼의 자식 인 mainWrapper.getChildAt (0) .rotation에서 설정하고 액세스 할 수 있습니다. 마지막으로, 표시 객체의 너비와 높이는 순환 래퍼의 자식을 가져 와서 표시 객체에 직접 액세스하여 수집하고 설정할 수 있습니다.

내가 그들을 액세스하는 방법에 대한 예 : 크기 조절 및 회전 이동 :

//get wrappers and render object 
var positionWrapper:Sprite = currentSelection["render"]; 
var rotationWrapper:Sprite = positionWrapper.getChildAt(0) as Sprite; 
var renderObject:DisplayObject = rotationWrapper.getChildAt(0); 

이 모든 초기 변환을 위해 완벽하게 작동합니다.

그러나 개체를 처음으로 회전 (예 : 45도) 한 다음 크기를 조절하면 문제가 발생합니다. 크기가 조정 된 객체의 모양이 변형되고 크기가 조정되지 않습니다.

예를 들어 왼쪽으로 확장하면이 문제가 발생합니다. 스케일링 왼쪽은 기본적으로 개체 폭 N을 첨가 한 후 역시 n으로 위치 랩퍼의 x COORD를 감소되어

renderObject.width -= diffX; 
positionWrapper.x += diffX; 

물체가 회전하지 않을 때이 작동한다. 그러나 위치 래퍼는 회전 래퍼의 부모이므로 회전되지 않습니다. 이렇게하면 오브젝트의 너비가 대각선으로 증가하는 동안 위치 래퍼가 수평으로 왼쪽으로 이동합니다.

나는 이것이 의미가 있기를 바란다. 그렇지 않다면 말해라. 나는 더 자세히 설명하려고 노력할 것이다.

이제 질문 : 다른 종류의 설정, 시스템 또는 구조를 사용해야합니까? 그렇다면 행렬을 사용해야할까요? 그렇다면 회전 후에 정적 너비/높이를 어떻게 유지 하시겠습니까? 또는 회전 후 현재 래퍼 시스템의 크기를 조정하려면 어떻게해야합니까? 어떤 도움을 주셔서 감사합니다. 이것에 대해

+2

당신 값을 2로 나눌 때 얻을 수있는 값을 반올림하고 싶을 수도 있습니다. 홀수 인 경우 1/2 픽셀 위치에있는 객체로 끝납니다 (재밌는 앤티 앨리어싱이 발생할 수 있습니다). 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. – Cameron

+0

스케일링이란 일반적으로 비 균일 스케일링을 의미합니까? 예 : 정사각형의 캠이 사각형이 되나요? – AVB

+0

카메론, 고마워. AB, 예, 맞습니다. – Tom

답변

1

무엇 : 또한

positionWrapper.width -= diffX; 
positionWrapper.x += diffX; 

, 당신은 rotationWrapper을 쫓아 직접 positionWrapper에 회전을 수행 할 수 있습니다.

그렇다면 senocular's tranformtoolsephiroth's modifications을 살펴 보시기 바랍니다.

편집 : 기본적으로 찾고자하는 것은 임의의 중심을 가진 임의의 벡터에 의한 스케일 변환입니다. 나머지는 사소한 것입니다. 첫 번째 문제 : 중심을 0으로 이동시키는 행렬 M을 만듭니다.0으로 설정하고 벡터를 x 축으로 회전시킵니다. 벡터의 길이와 M의 역행렬에 의해 x 스케일로 concat M을 만들고 결과 행렬은 여러분이 필요로하는 것을 수행해야합니다. 물론 직접 펜과 종이와 결과 행렬을 계산할 수있다, 그러나 이것은 당신이이
이 위대한 게시물 봐 가지고 변환 매트릭스를 사용한다처럼이 보이는

+0

renderObject가 중심을 중심으로 회전해야하는 경우 어떻게 rotationWrapper를 제거 할 수 있습니까? 이것이 회전 래퍼의 용도이며, 위치 래퍼는 위치가 여전히 왼쪽 상단이면서 중심이 아닌지 확인합니다. – Tom

+0

@ 톰 : 내 편이 약간 실수. 그러나 그렇습니다, 당신은 그것을 쫓아 낼 수 있습니다. 당신은 renderObject를 positionWrapper의 중심에 놓고 positionWrapper 자체를 회전시킬 수 있습니다. 게시물에서 업데이트했습니다. – back2dos

+0

positionWrapper에 너비를 설정하려고했는데 positionWrapper가 회전하지 않았기 때문에 작동하지 않습니다. 따라서 객체가 예를 들어 45도 회전하더라도 수평 방향으로 너비가 변경됩니다. – Tom

관련 문제