Matrix3D 구조체

정의

3차원 공간의 변환에 사용되는 4개의 × 4 행렬을 나타냅니다. Matrix3DProjection.ProjectionMatrix의 값으로 사용됩니다.

public value class Matrix3D
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
struct Matrix3D
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
public struct Matrix3D
Public Structure Matrix3D
<Matrix3DProjection ProjectionMatrix="m11, m12, m13, m14, 
  m21, m22, m23, m24, m31, m32, m33, m34, offsetX, offsetY, offsetZ, m44" />
- or -
<!--xmlns:m3d="using:Windows.UI.Xaml.Media.Media3D"-->
<m3d:Matrix3D>
m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, offsetX, offsetY, offsetZ, m44
</m3d:Matrix3D>
상속
Matrix3D
특성

Windows 요구 사항

디바이스 패밀리
Windows 10 (10.0.10240.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)

예제

이 예제에서는 간단한 Matrix3D 행렬을 사용하여 이미지를 클릭할 때 X 및 Y 방향으로 이미지를 변환합니다.

<!-- When you click on the image, the projection is applied. -->
<Image PointerPressed="ApplyProjection" x:Name="BeachImage" Source="guy_by_the_beach.jpg"
       Width="200"/>
private void ApplyProjection(Object sender, PointerRoutedEventArgs e)
{
    Matrix3D m = new Matrix3D();

    // This matrix simply translates the image 100 pixels
    // down and 100 pixels right.
    m.M11 = 1.0; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = 1.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = 100; m.OffsetY = 100; m.OffsetZ = 0; m.M44 = 1.0;

    Matrix3DProjection m3dProjection = new Matrix3DProjection();
    m3dProjection.ProjectionMatrix = m;

    BeachImage.Projection = m3dProjection;

}
<Image Source="guy_by_the_beach.jpg">
    <Image.Projection>
        <Matrix3DProjection  ProjectionMatrix="2, 0, 0, 0,
                                              0, 2, 0, 0,
                                              0, 0, 1, 0,
                                              100, 100, 0, 1"/>
    </Image.Projection>
</Image>
<!-- When you click on the image, the projection is applied. -->
<Image PointerPressed="ApplyProjection" x:Name="BeachImage" Source="guy_by_the_beach.jpg" 
       Width="200"/>
private void ApplyProjection(Object sender, PointerRoutedEventArgs e)
{
    // Translate the image along the negative Z-axis such that it occupies 50% of the
    // vertical field of view.
    double fovY = Math.PI / 2.0;
    double translationZ = -BeachImage.ActualHeight / Math.Tan(fovY / 2.0);
    double theta = 20.0 * Math.PI / 180.0;

    // You can create a 3D effect by creating a number of simple 
    // tranformation Matrix3D matrices and then multiply them together.
    Matrix3D centerImageAtOrigin = TranslationTransform(
             -BeachImage.ActualWidth / 2.0,
             -BeachImage.ActualHeight / 2.0, 0);
    Matrix3D invertYAxis = CreateScaleTransform(1.0, -1.0, 1.0);
    Matrix3D rotateAboutY = RotateYTransform(theta);
    Matrix3D translateAwayFromCamera = TranslationTransform(0, 0, translationZ);
    Matrix3D perspective = PerspectiveTransformFovRH(fovY,
            LayoutRoot.ActualWidth / LayoutRoot.ActualHeight,   // aspect ratio
            1.0,                                                // near plane
            1000.0);                                            // far plane
    Matrix3D viewport = ViewportTransform(LayoutRoot.ActualWidth, LayoutRoot.ActualHeight);

    Matrix3D m = Matrix3DHelper.Multiply(centerImageAtOrigin,invertYAxis);
    m = Matrix3D.Multiply(m ,rotateAboutY);
    m = Matrix3D.Multiply(m,translateAwayFromCamera);
    m = Matrix3D.Multiply(m,perspective);
    m = Matrix3D.Multiply(m,viewport);

    Matrix3DProjection m3dProjection = new Matrix3DProjection();
    m3dProjection.ProjectionMatrix = m;

    BeachImage.Projection = m3dProjection;
}

private Matrix3D TranslationTransform(double tx, double ty, double tz)
{
    Matrix3D m = new Matrix3D();

    m.M11 = 1.0; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = 1.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = tx; m.OffsetY = ty; m.OffsetZ = tz; m.M44 = 1.0;

    return m;
}

private Matrix3D CreateScaleTransform(double sx, double sy, double sz)
{
    Matrix3D m = new Matrix3D();

    m.M11 = sx; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = sy; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = sz; m.M34 = 0.0;
    m.OffsetX = 0.0; m.OffsetY = 0.0; m.OffsetZ = 0.0; m.M44 = 1.0;

    return m;
}

private Matrix3D RotateYTransform(double theta)
{
    double sin = Math.Sin(theta);
    double cos = Math.Cos(theta);

    Matrix3D m = new Matrix3D();

    m.M11 = cos; m.M12 = 0.0; m.M13 = -sin; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = 1.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = sin; m.M32 = 0.0; m.M33 = cos; m.M34 = 0.0;
    m.OffsetX = 0.0; m.OffsetY = 0.0; m.OffsetZ = 0.0; m.M44 = 1.0;

    return m;
}

private Matrix3D RotateZTransform(double theta)
{
    double cos = Math.Cos(theta);
    double sin = Math.Sin(theta);

    Matrix3D m = new Matrix3D();
    m.M11 = cos; m.M12 = sin; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = -sin; m.M22 = cos; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = 0.0; m.OffsetY = 0.0; m.OffsetZ = 0.0; m.M44 = 1.0;
    return m;
}

private Matrix3D PerspectiveTransformFovRH(double fieldOfViewY, double aspectRatio, double zNearPlane, double zFarPlane)
{
    double height = 1.0 / Math.Tan(fieldOfViewY / 2.0);
    double width = height / aspectRatio;
    double d = zNearPlane - zFarPlane;

    Matrix3D m = new Matrix3D();
    m.M11 = width; m.M12 = 0; m.M13 = 0; m.M14 = 0;
    m.M21 = 0; m.M22 = height; m.M23 = 0; m.M24 = 0;
    m.M31 = 0; m.M32 = 0; m.M33 = zFarPlane / d; m.M34 = -1;
    m.OffsetX = 0; m.OffsetY = 0; m.OffsetZ = zNearPlane * zFarPlane / d; m.M44 = 0;

    return m;
}

private Matrix3D ViewportTransform(double width, double height)
{
    Matrix3D m = new Matrix3D();

    m.M11 = width / 2.0; m.M12 = 0.0; m.M13 = 0.0; m.M14 = 0.0;
    m.M21 = 0.0; m.M22 = -height / 2.0; m.M23 = 0.0; m.M24 = 0.0;
    m.M31 = 0.0; m.M32 = 0.0; m.M33 = 1.0; m.M34 = 0.0;
    m.OffsetX = width / 2.0; m.OffsetY = height / 2.0; m.OffsetZ = 0.0; m.M44 = 1.0;

    return m;
}

설명

PlaneProjection 형식보다 더 복잡한 3D 시나리오에 Matrix3DProjection 및 Matrix3D 형식을 사용할 수 있습니다. Matrix3DProjection 은 모든 UIElement 에 적용할 완전한 3D 변환 매트릭스를 제공합니다( UIElement.Projection 속성의 값으로 사용). 행렬을 사용하면 임의의 모델 변환 행렬 및 원근 행렬을 시각적 요소에 적용할 수 있습니다.

Matrix3D에는 다음 행 벡터 구문이 있습니다.

M11M12M13M14
M21M22M23M24
M31M32M33M34
OffsetxOffsetYOffsetZM44

네 번째 열에 액세스할 수 있으므로 Matrix3D는 아핀 및 비아핀 변환을 모두 나타낼 수 있습니다.

Matrix3D용 XAML 구문

Matrix3D 값은 XAML에서 선언할 수 있지만 구문은 제한되며 다른 Windows 런타임 구조(예: Thickness)가 XAML UI에 대한 값을 지원하는 방법에 따라 예상할 수 있는 것과 다릅니다.+ Matrix3D 형식 속성의 가장 일반적인 사용법은 Matrix3D 형식에 기본 제공되는 초기화 문자열 동작을 사용하고 Matrix3D 값을 특성으로 사용하는 값을 설정하는 것입니다. Matrix3D 값을 생성하기 위한 "초기화 텍스트" 형식의 문자열을 지정합니다. 각각 쉼표 또는 공백으로 구분된 16개의 개별 Double 값입니다. 아래의 "예제"에서 XAML에서 사용되는 이 형식을 볼 수 있습니다.

  • Matrix3D 값을 사용하는 기존 속성은 Matrix3DProjection.ProjectionMatrix뿐입니다. 여기에서 기본 XAML 구문으로 표시됩니다.
  • 표시된 보조 XAML 구문에는 실제 Matrix3D 개체 요소가 있습니다. 그러나 XAML 네임스페이스 접두사는 있습니다. Windows.UI.Xaml.Media.Media3D 네임스페이스는 Windows 런타임 XAML 파서가 기본 XAML 네임스페이스에 사용하는 코드 네임스페이스 집합에 포함되지 않았습니다. Matrix3D를 XAML의 요소로 사용하려면 xAML에 **using:** 문으로 Windows.UI.Xaml.Media.Media3D를 참조하는 xmlns 선언을 포함해야 합니다. 그런 다음, Windows.UI.Xaml.Media.Media3D의 형식에 대해 매핑한 xmlns 접두사로 Matrix3D를 한정합니다.
  • 이 매핑을 수행하더라도 Matrix3D 개체 요소에는 16개의 속성을 설정하기 위한 특성 값이 있을 수 없으며 XAML 파서에서 사용하도록 설정되지 않습니다(다른 XAML 구조에는 특성으로 속성 구문에 대한 특수 대/소문자 처리가 있음). Matrix3D에는 이 가 없습니다). 여전히 16개 값을 문자열의 연속 원자로 설정하는 초기화 텍스트를 사용해야 합니다. 이 경우 문자열은 Matrix3D 개체 요소의 "내부 텍스트" /콘텐츠로 포함됩니다.
  • 볼 수 있듯이 개체 요소 구문은 Matrix3DProjection.ProjectionMatrix의 인라인 특성 구문보다 읽거나 사용하기 쉽지 않으므로 자세한 Matrix3D 개체 요소 구문은 일반적이지 않습니다.

Matrix3D의 프로젝션 및 멤버

Microsoft .NET 언어(C# 또는 Microsoft Visual Basic) 또는 Visual C++ 구성 요소 확장(C++/CX)을 사용하는 경우 Matrix3D에는 비데이터 멤버를 사용할 수 있으며 해당 데이터 멤버는 필드가 아닌 읽기-쓰기 속성으로 노출됩니다.

WINDOWS 런타임 WRL(템플릿 라이브러리)을 사용하여 C++로 프로그래밍하는 경우 데이터 멤버 필드만 Matrix3D의 멤버로 존재하며 멤버 테이블에 나열된 유틸리티 메서드 또는 속성을 사용할 수 없습니다. WRL 코드는 Matrix3DHelper 클래스에 있는 유사한 유틸리티 메서드에 액세스할 수 있습니다.

개별 XAML 특성을 사용하여 XAML에서 Matrix3D의 속성을 설정할 수 없습니다. 16개 값을 모두 지정하는 초기화 문자열을 사용하여 Matrix3D 개체 요소를 초기화하거나 동일한 문자열 형식을 사용하는 Matrix3DProjection.ProjectionMatrix 에 특성 구문을 사용해야 합니다.

필드

M11

이 Matrix3D의 첫 번째 행 및 첫 번째 열 값입니다.

M12

이 Matrix3D의 첫 번째 행 및 두 번째 열 값입니다.

M13

이 Matrix3D의 첫 번째 행 및 세 번째 열 값입니다.

M14

이 Matrix3D의 첫 번째 행 및 네 번째 열 값입니다.

M21

이 Matrix3D의 두 번째 행 및 첫 번째 열 값입니다.

M22

이 Matrix3D의 두 번째 행 및 두 번째 열 값입니다.

M23

이 Matrix3D의 두 번째 행 및 세 번째 열 값입니다.

M24

이 Matrix3D의 두 번째 행 및 네 번째 열 값입니다.

M31

이 Matrix3D의 세 번째 행 및 첫 번째 열 값입니다.

M32

이 Matrix3D의 세 번째 행 및 두 번째 열 값입니다.

M33

이 Matrix3D의 세 번째 행 및 세 번째 열 값입니다.

M34

이 Matrix3D의 세 번째 행 및 네 번째 열 값입니다.

M44

이 Matrix3D의 네 번째 행 및 네 번째 열 값입니다.

OffsetX

이 Matrix3D의 네 번째 행과 첫 번째 열의 값입니다.

OffsetY

이 Matrix3D의 네 번째 행 및 두 번째 열 값입니다.

OffsetZ

이 Matrix3D의 네 번째 행 및 세 번째 열 값입니다.

적용 대상

추가 정보