2009-03-09 5 views
2

플렉스를위한 플래시 10의 matrix3D 기능을 사용하여 컨테이너 (또는 그와 관련된 모든 것)를 회전시키는 가장 좋은 방법을 찾으려고합니다.3D 플렉스, 컨테이너의 무작위 지점을 중심으로 회전 (부분 솔루션 포함)

등록 포인트가 아닌 포인트를 중심으로 회전하는 컨테이너를 얻을 수 있었지만 컨테이너에서 클리핑을 해제 한 다음 (0,0,0). 이것은 효과가 있지만 매우 직관적이지 않고 여러 항목을 배치하려고 할 때 또는 회전 지점을 이동해야하는 경우에도 빠릅니다.

matrix3D 클래스를 사용하는 것은 길로 보일 수 있지만 정확하게는 모르겠습니다.

건배

추가 정보 - 내 컨테이너는 무대에서 (0, 0, 0)에 내가 그때에 container.width/2에 의해 번역 용기의 중간 X의 COORD 중심으로 회전하려면 X는 다시 회전하고 다시 번역합니다. 이것은 잘 작동합니다. 하지만 내 컨테이너가 (10, 0, 0)이라고 말하면 위와 같은 것을 변환하고 추가 10을 더하면 작동하지 않습니다. (완전 쓰레기입니다 - 당신이 할 수있는 경우를 설명하십시오)

Soloution 그런 다음, 회전, 번역 -traslate을 필요로 제시 한 바와 같이 . 나는 이것을 알고 있었지만 결코 효과가 없었다.
아래의 soloution을 참조하십시오, 나는 그것을 얻지 못합니다. (패널은 내가 회전하는 객체이고, 함수를 둘 다 호출합니다.)

private function rotateOnly() : void { 
     panel.transform.matrix3D.appendRotation(36, Vector3D.Y_AXIS); 
} 

private var valueToMove : Number = 300; 
private var translateUpOrDown : Boolean = false; 
private function translateOnly() : void { 
    if(translateUpOrDown){ 
      panel.transform.matrix3D.appendTranslation(valueToMove, 0, 0); 
    translateUpOrDown = false; 
} else { 
    panel.transform.matrix3D.appendTranslation(-valueToMove, -0,0); 
    translateUpOrDown = true; 
} 
} 

//I do not run both chunks of code here at once, this is only to show what I've tried 
private function both() : void { 
    //IF I call this function and call this chunk then the rotation works 
     translateOnly(); 
     rotateOnly(); 
     translateOnly(); 


    //If I call this chunk which does the exact same as the above it does NOT work!! 
     panel.transform.matrix3D.appendTranslation(valueToMove, 0,0); 
panel.transform.matrix3D.appendRotation(36, Vector3D.Y_AXIS); 
panel.transform.matrix3D.appendTranslation(-valueToMove, 0,0); 
} 
+0

코드 두 번째 덩어리가 잘못 번역되어 있습니다. - 첫 번째 번역은 음수이어야하고, 회전하고, 내 대답에 따라 긍정적 인 번역이 이루어져야합니다. – Alnitak

+0

훔쳐 보면 어떻게 될지 오랫동안 쟁점으로! 처음에는 컨테이너 폭, 높이, x와 y를 사용하여 번역을 혼란스럽게 만들었습니다. 그렇게하면 전체 모양이 엉망이됩니다. 건배. – kenneth

답변

1

OK, 해결책은 될 것이다. 이것들은 여분의 행렬 연산을 절약하기 위해 선행을 위해 사용될 것이다. E.G는 Box 클래스를 확장하고 그 var를 새로운 클래스에 추가합니다.

2 - 다음과 같이 앱에 구성 요소를 추가하십시오. 합니다 (오리지널 값 등 실제 X, Y, Z는 회전 중에 변화하므로하지만 올바른 회전을 계산 값을 오리지널 필요

<local:RotationContainer 
     id="movingBox" 
     width="50" 
     origWidth="50" 
     height="60" 
     origHeight="60" 
     x="80" 
     origX="80" 
     y="70" 
     origY="70" 
     z="0" 
     origZ="0" 
     enterFrame="rotateObject(event)" 
     /> 

3 -.에서 호출 회전 다음 코드를 사용 enterFrame 이벤트

private var translateUpOrDown : Boolean = false; 
     private function translateOnly(obj : Object, valueToMoveX : Number, valueToMoveY : Number) : void { 

      if(translateUpOrDown){ 
       obj.transform.matrix3D.appendTranslation(valueToMoveX, valueToMoveY, 0); 
       translateUpOrDown = false; 
      } else { 
       obj.transform.matrix3D.appendTranslation(-valueToMoveX, -valueToMoveY, 0); 
       translateUpOrDown = true; 
      } 
     } 

     private function rotateOnly(obj : Object) : void { 
      obj.transform.matrix3D.appendRotation(rotationAmount, Vector3D.Y_AXIS); 
     } 

     private function rotateObject(event : Event) : void { 

      var offsetX : Number = (event.currentTarget.origWidth/2) + event.currentTarget.origX; 
      var offsetY : Number = (event.currentTarget.origHeight/2) + event.currentTarget.origY; 

      translateOnly(event.currentTarget, offsetX, offsetY); 
      rotateOnly(event.currentTarget); 
      translateOnly(event.currentTarget, offsetX, offsetY); 
     } 

4 위 -.. 됐죠 이것은 Y 축 상에 중심점을 중심으로 회전한다 회전 다른 점 오프셋 값을 변경한다.

업데이트 지적한대로 호출을 별도의 함수로 옮길 필요는 없지만 원래 너비, 높이, x & y (하드 코딩을 제공하지 않음)에서 얻을 수 있도록 위의 코드를 사용해야합니다. 모든 값)

2

회전 행렬은 항상 원점을 중심으로 회전합니다. 임의의 점 P 주위 물체의

회전은 일반적으로 필요 P 의한 물체의 필요한

  • 번역 같은 물체의 -P
  • 회전에 의해 물체의

    1. 번역
  • +1

    옙 나는 그것을 시도했다. 컨테이너의 matrix3D를 가져 와서 appendTranslation (-x, -y, -z)을 수행 한 다음 appendRotation을 수행 한 다음 다른 appendTranslation (x, y, z)을 수행했습니다. matrix3D 클래스를 사용하여 다른 변형을 시도했지만 올바르게 구현할 수는 없습니다. – kenneth

    +0

    Alnitak의 솔루션은 물체가 원점이라고 가정합니다. –

    0

    피벗 벡터를 단순히 움직이는 것으로 생각하십니까?

    1 - - 원래 X, Y, Z와 너비와 높이에 대한 바르하여 자신의 구성 요소를 만들

    var matrix:Matrix3d = new Matrix3d(); 
    matrix.appendRotation(degrees, axis, new Vector3d(container.width/2,container.height/2,0)); 
    
    +0

    나는 그것을 실제로 시험해 보았고 예상치 못한 결과가 나타났습니다 (어쨌든 나는 결과가 아닙니다). livedocs는 matrix3D 클래스의 소스 코드에서 얻을 수없는 것처럼 3D 작업을 표시하는 데 더 많은 정보 나 예제가 필요합니다. (내가 틀렸 으면 좋겠지 만 그렇게 할 수는 없습니다.) – kenneth

    관련 문제