2009-11-05 3 views
1

rotationX 값을 변경 한 후 표시 객체의 가시 높이를 알아야합니다.3D, AS3, Flex - 회전 각도를 가시 높이로 변환

사용자가 3D 공간에서 바닥을 배치 할 수있는 응용 프로그램이 있습니다. 3D 회전 후 바닥의 크기가 자동으로 늘어나서 항상 특정 영역을 덮고 싶습니다.

누구나이 문제 해결을위한 공식을 알고 있습니까?

편집 : 내가 실제로하려고하는 것은도를 픽셀로 변환하는 것입니다.

2D 평면에서 100 x 100 픽셀이라고 할 때, rotationX에서 -10 도의 변화는 비행기가 더 이상 보이지 않는 맨 위에 간격이 있음을 의미합니다. 이 간격이 얼마나 될지 알고 비행기를 늘릴 수 있습니다.

Flex에서 표시 객체 height 속성의 값은 회전을 적용하기 전과 적용한 후에 동일하게 유지되며 사실 버그 일 수 있습니다.

EDIT 2 : 플래시/플렉스와 관련된 것이 아니라 일반적인 수학 계산식이 있어야합니다. 3D 공간에서 객체를 볼 때 객체가 뒤쪽으로 회전하면 (객체의 맨 위가 뷰어에서 멀리 떨어지면), 새 가시 높이는 회전 각도를 기준으로 무엇이됩니까? 픽셀, 미터, 큐빗 등이 될 수 있습니다.

+0

회전 된 개별 이미지를 바둑판 식으로 배열하는 대신, 이미지를 평면에 바둑판 식으로 배열 한 다음 전체 평면을 회전시키는 것이 어떨까요? – greggreg

+0

내가 불분명하면 죄송합니다. 그게 바로 내가 계획하고있는 일입니다. 회전 후 전체 평면의 가시 높이를 측정해야합니다. – Daniel

답변

0

나는 테스트 케이스를 가지고 있지 않지만, 내 머리 위로 떨어져 내가 좋아하는 뭔가를 추측에는 요 :

var d:DisplayObject; 
var rotationRadians:Number = d.rotationX * Math.PI/180; 
var visibleHeight:Number = d.height * Math.cos(rotationRadians); 

이 있지만, 계정에 다른 변환을하지 않습니다.

+0

완벽한. 그게 바로 내가 한 일이야. Flash가 백그라운드에서이 작업을 수행하고 자동으로 값을 노출해야한다는 것을 알고 있습니다. PPV 나 Away3D 등과는 달리 내부 3D 패키지를 사용하면 많은 단점이있는 것 같습니다. 앞으로의 업데이트가 더 직관적 일 것입니다. 개체의 새로운 너비를 얻는 방법에 대한 아이디어가 있습니다 (+ xRotation 또는 -xRotation에 따라 상단 또는 하단이 작아짐)? – Daniel

+1

기꺼이 도와 드리겠습니다. 여기에 내장 된 방법이 없다고 가정하면 (Flash 3D로 아직 해본 적이 없습니다.) 한 번 회전보다 복잡한 작업을 수행하려면 다음을 수행해야합니다. 1. 회전 행렬을 구성합니다. 2. 표시 객체 경계 상자의 각 모서리의 좌표에 행렬을 곱하여 새로운 "회전 된"좌표를 얻습니다. 3. x 및 y를 적절한 값으로 변환하기 위해 각 좌표의 z 값을 origin 4.이 변환 된 좌표의 경계 상자를 만들고 너비와 높이를 사용합니다. –

0

개체의 경계 사각형을 사용해 보았습니까?

var dO:DisplayObject = new DisplayObject(); 
dO.rotation = 10; 
var rect:Rectangle = dO.getRect(); 

// rect.topLeft.y is now the new top point. 
// rect.width is the new width. 
// rect.height is the new height. 

층에 대해서는 더 많은 정보가 필요하지만 floor.percentWidth = 100으로 설정을 시도 했습니까? 그럴 수도 있습니다.

+0

행운이 없습니다. 시각적 높이와 y가 다르더라도 표시 객체 높이 및 y (이 경우 비트 맵을 포함하는 캔버스)는 3D 로테이션을 조정할 때 변경되지 않는 것으로 보입니다. 경계 사각형은 똑같은 것처럼 보입니다. 바닥은 여러 개의 정사각형 타일로 이루어져 있습니다. 바닥 회전이 목표 y 위치에 도달 할 때까지 3D 회전 후 개별 타일의 행 또는 열을 바닥에 추가 할 계획입니다. 바닥 꼭대기에는 벽과 가구가 달린 PNG가 추가됩니다. PNG의 바닥 영역은 투명한 이미지로 바닥 이미지가 표시됩니다. – Daniel

0

DisplayObject.transform.pixelBounds를 확인 했습니까? 나는 그것을 시도하지 않았지만 회전을 고려하는 것이 더 쉽습니다.

0

회전은 실제로 DisplayObject의 축 (즉, x 축과 y 축이 회전 됨)을 변경합니다. 그것이 당신이 신장의 차이를 보지 못하는 이유입니다. 따라서 시각적 높이와 y를 얻으려면이 방법을 시도해보십시오.

var dO:DisplayObject = new DisplayObject(); 
addChild(); 
var rect1:Rectangle = dO.getRect(dO.parent); 
dO.rotation = 10; 
var rect2:Rectangle = dO.getRect(dO.parent); 
이 경우 rect1과 rect2가 달라야합니다. dO의 시각적 좌표를 확인하려면 dO.parent를 root로 변경하십시오.

+0

나는 필요한 결과를 얻지 못하고있다. 이것이 3D 회전 (rotationX, ... Y, ... Z)에도 적용되어야합니까? – Daniel

+0

코드를 제공 할 수 있습니까? – bhups