2009-08-11 21 views

Odpowiedz

43

To struktura wygląda następująco:

struct CATransform3D 
{ 
    CGFloat m11, m12, m13, m14; 
    CGFloat m21, m22, m23, m24; 
    CGFloat m31, m32, m33, m34; 
    CGFloat m41, m42, m43, m44; 
}; 
typedef struct CATransform3D CATransform3D; 

Jest to po prostu 4x4 macierzą transformacji używany do przekształcenia 4-wektory. Może być używany do reprezentowania dowolnej liczby transformacji liniowych. Zobacz artykuł wikipedii o tym typie macierzy. Większość tych elementów nie może być interpretowana niezależnie, ale niektóre mogą. Na przykład m41, m42 i m43 reprezentują tłumaczenie w 3-przestrzeni. Tak na przykład, jeśli pomnożyć przez punkt tej macierzy:

[ 1 0 0 0 ] 
[ 0 1 0 0 ] 
[ 0 0 1 0 ] 
[ 1 2 3 1 ] 

Wtedy będzie tłumaczyć, że punkt o 1 w kierunku + x, 2 jednostki w kierunku + Y i 3 w kierunku + Z.

    [ 1 0 0 0 ] 
[ x y z 1 ] x [ 0 1 0 0 ] = [ x+1 y+2 z+3 1 ] 
        [ 0 0 1 0 ] 
        [ 1 2 3 1 ] 

Należy zauważyć, że punkt musi być reprezentowana jako wektor z 4 4. Element wynosi 1. Należy również zwrócić uwagę, że wektor ten jest w rzeczywistości sama matryca, a format tej matrycy różni się od opisanego w artykule wikipedia na macierzach transformacji. Dzieje się tak, ponieważ punkt jest zwykle reprezentowany przez pojedynczą kolumnę, macierz z 4 wierszami, jednak Apple reprezentuje je jako 4 macierze jednorzędowe. Oznacza to, że każda macierz transformacji widoczna w artykule wikipedia musi zostać przetransponowana przed użyciem jej na telefonie iPhone, aby działała poprawnie.

Innym przykładem jest skalowanie transform:

[ 2 0 0 0 ] 
[ 0 2 0 0 ] 
[ 0 0 2 0 ] 
[ 0 0 0 1 ] 

Będzie podwójna wszystkich współrzędnych punktu, więc (1, 2, 3) będzie (2, 4, 6). Inne przekształcenia, takie jak rotacje i projekcje perspektywiczne, są trudniejsze do rozpoznania na widoku.

Oto więcej informacji na temat transforms od Apple. Paczka transformacji narzędziowych jest dostarczana przez firmę Apple do generowania tych macierzy, patrz this link. W rzeczywistości nie omawiają matematyki za CATransform3DMakeRotation, ale robi to this link.

+1

To jest świetne wyjaśnienie, ale myślę, że masz transponowane osie. Wartości translacji X, Y i Z są reprezentowane przez m41, m42 i m43, a nie m14, m24 i m34. –

+0

@NickLockwood dobry połów, zaktualizowałem wyjaśnienie odpowiednio. – Gabe

Powiązane problemy