문제

좋아, 이것은 간단한 매트릭스 질문이어야하는 것이지만 매트릭스에 대한 나의 이해는 다소 제한적이다. 시나리오는 다음과 같습니다. 1px x 1px 스프라이트가있어 양의 x와 y (각 측면에서 다른 양)로 스케일링하고 스프라이트를 약간의 각도로 회전시키고 싶습니다. 모든 것을 정확하게 배치하십시오 (왼쪽 상단이나 중앙에서 나에게 차이가 없습니다).

지금까지 내 코드는 모호하게 가깝지만 통과하는 각도에 따라 임의의 양으로 꺼지는 경향이 있습니다.

나는 이것이 그렇게 할 것이라고 생각할 것이다 :

        Point center = new Point( 50, 50 );
        float width = 60;
        float height = 100;
        float angle = 0.5;
        Vector3 axis = new Vector3( center.X, center.Y, 0 );
        axis.Normalize();
        Matrix m = Matrix.Scaling( width, height, 0 ) *
            Matrix.RotationAxis( axis, angle ) *
            Matrix.Translation( center.X, center.Y, 0 );

그러나 그것은 회전 선의 규모를 줄이는 경향이 있습니다.

나는 또한 이것을 시도했다 :

  Matrix m = Matrix.Transformation2D( new Vector2( center.X, center.Y ), 0f,
      new Vector2( width, height ), new Vector2( center.X, center.Y ),
      angle, Vector2.Zero );

정확한 크기와 모양으로 선이 정확하게 보이지만 전혀 올바르게 배치 할 수 없습니다. 위의 통화 끝에 번역 벡터를 사용하거나 Sprite.Draw를 사용하여 위치를 설정하면 올바르게 작동하지 않습니다.

이것은 모두 SLIMDX에 있습니다. 내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

방금 학습 매트릭스 변환의 고통을 겪었지만 XNA를 사용했습니다.

나는 찾았다 이것들 조항 에게 ~이다 매우 무슨 일이 일어나는지 이해하는 데 도움이됩니다. 이 방법 호출은 XNA에서 매우 유사하며 그 뒤에있는 이론은 SLIMDX를 사용하더라도 모두에게 적용되어야합니다.

코드를 글라이싱하는 것부터, 나는 당신이 처음, 원점으로 번역 한 다음, 끝에서 다시 번역해야한다고 생각합니다.

내가 할 순서는 다음과 같습니다.

  • 원산지로 번역하십시오
  • 규모
  • 회전
  • 원하는 위치로 번역하십시오

먼저 원점으로 번역하는 이유는 회전은 원점을 기준으로합니다. 따라서 특정 지점에 대해 무언가를 회전 시키려면 회전하기 전에 원점을 가리키십시오.

다른 팁

좋아, 지금은 작동하고있다. 다른 사람이 필요로하는 경우에 대한 내 작업 코드는 다음과 같습니다.

    Point sourceLoc = new Point ( 50, 50 );
    float length = 60;
    float thickness = 2;
    float angle = 0.5;
    Matrix m = Matrix.Scaling( length, thickness, 0 ) *
            Matrix.RotationZ( angle ) *
            Matrix.Translation( sourceLoc.X, sourceLoc.Y, 0 );
    sprite.Transform = m;

    sprite.Draw( this.tx, Vector3.Zero, Vector3.Zero, Color.Red );

선택한 길이의 각진 선을 그리며, 선택한 두께와 동일한 두께가 있습니다 (질감은 1x1 픽셀 흰색 이미지라고 가정). 소스 위치는 라인이 방출되는 곳이며 (라디안에서) 지정한 각도와 함께. 따라서 0에서 시작하여 2PI를 누르기 전까지는 0.1과 같은 것을 증가시킨 다음 0으로 재설정하면 시계 핸드 나 레이더 스윕처럼 중심 주위에 회전하는 선이 있습니다. 이것이 제가 찾고 있던 것입니다. 기여한 모든 분들께 감사드립니다!

올바른 축을 중심으로 회전하고 있습니까? 나는 매트릭스 물건의 초보자이지만 스프라이트가 X, Y 공간에 존재하기 때문에 회전 축은 z 축이어야합니다 (0,0,1).

당신이해야 할 일은 한 번에 한 단계 씩 각각의 변환을 수행하는 것입니다. 스케일링을 먼저 그립니다. 당신이 그것을 기대하는 곳입니까? 그런 다음 회전을 던지고 번역하십시오. 이것은 잘못된 가정을 발견하는 데 도움이됩니다.

또한 좌표가 어디에 있는지 파악하기 위해 임시 라인을 그릴 수도 있습니다. 예를 들어 스트레칭과 회전을하고 엔드 포인트가 0,0이 될 것으로 예상하는 경우. 하나의 엔드 포인트가 0,0 인 다른 라인을 그리는 것은 실제로 케이스인지 확인하는 이중 점검 역할을합니다.

특정 문제의 경우 문제는 회전에 문제가 될 수 있습니다. 스케일링하고 회전 한 후에 라인이 중앙에서 벗어나 번역 할 때 문제가 발생합니다.

일반적인 해결책은 라인을 원점으로 다시 이동하는 것입니다. 나중에 알려진 좋은 위치에 있기 때문에 최종 목적지로 번역 할 수 있습니다.

의견에 대한 응답

번역이 문제이고 좌표계를 변환하는 경우 이전 시스템과 새로 변환하기 위해 변환 기능을 작성해야합니다.

예를 들어 45도 회전하는 경우. 회전하기 전에 0,1로 번역하여 1 인치 위로 이동할 수 있습니다. 회전 후 원래 좌표계에 비해 1 인치 상승하려면 대략 -.70707, .070707로 번역해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top