פונקציות מטריצות של RenderScript

סקירה כללית

הפונקציות האלה מאפשרות לבצע פעולות במטריצות ריבועיות בדרגות 2x2,‏ 3x3 ו-4x4. הם שימושיים במיוחד לטרנספורמציות גרפיות ותואמים ל-OpenGL.

אנחנו משתמשים באינדקס שמתחיל בספרה אפס לשורות ולעמודות. לדוגמה, הרכיב האחרון של rs_matrix4x4 נמצא ב-(3, 3).

ב-RenderScript נעשה שימוש במטריצות עם עמודות ראשיות ובווקטורים שמבוססים על עמודות. כדי לבצע טרנספורמציה של וקטור, מכפילים את הווקטור בחזרה, למשל (matrix * vector), באמצעות הפונקציה rsMatrixMultiply().

כדי ליצור מטריצה של טרנספורמציה שמבצעת שתי טרנספורמציות בו-זמנית, מכפילים את שתי מטריצות המקור, כאשר הטרנספורמציה הראשונה היא הארגומנט הימני. לדוגמה, כדי ליצור מטריצת טרנספורמציה שמחילה את הטרנספורמציה s1 ואחריה את הטרנספורמציה s2, צריך להפעיל את הפונקציה rsMatrixLoadMultiply(&combined, &s2, &s1). הערך הזה נגזר מ-s2 * (s1 * v), שהוא (s2 * s1) * v.

יש לנו שני סגנונות של פונקציות ליצירת מטריצות טרנספורמציה: Transformation של rsMatrixLoad ו-Transformation של rsMatrix. בסגנון הקודם, מטריית הטרנספורמציה מאוחסנת בארגומנט הראשון. באפשרות השנייה, מטריצה קיימת של טרנספורמציה משתנה כך שהטרנספורמציה החדשה תתבצע קודם. לדוגמה, אם קוראים ל-rsMatrixTranslate() במטריצה שכבר מבצעת שינוי קנה מידה, המטריצה שמתקבלת כשמחילים אותה על וקטור תבצע קודם את התרגום ואז את שינוי קנה המידה.

סיכום

פונקציות
rsExtractFrustumPlanes חישוב של מישורי גוף קטום
rsIsSphereInFrustum בדיקה אם כדור נמצא בתוך המישורים של גוף דמוי חרוט
rsMatrixGet אחזור רכיב אחד
rsMatrixInverse הפיכת מטריצה במקום
rsMatrixInverseTranspose הפיכה והמרת מטריצה במקום
rsMatrixLoad טעינת מטריצה או העתקה שלה
rsMatrixLoadFrustum טעינת מטריצה של הקרנה דרך חרוט
rsMatrixLoadIdentity טעינת מטריצה של זהויות
rsMatrixLoadMultiply הכפלת שתי מטריצות
rsMatrixLoadOrtho טעינת מטריצה של הקרנה אורתוגרפית
rsMatrixLoadPerspective טעינת מטריצת הקרנה פרופרקטיבית
rsMatrixLoadRotate טעינת מטריצה של סיבוב
rsMatrixLoadScale טעינת מטריצה של שינוי קנה מידה
rsMatrixLoadTranslate טעינת מטריצה של תרגום
rsMatrixMultiply הכפלה של מטריצה בוקטור או במטריצה אחרת
rsMatrixRotate החלת סיבוב על מטריצה של טרנספורמציה
rsMatrixScale החלת שינוי קנה מידה על מטריצה של טרנספורמציה
rsMatrixSet הגדרת רכיב אחד
rsMatrixTranslate החלת תרגום על מטריצה של טרנספורמציה
rsMatrixTranspose החלפת מיקום של מטריצה

פונקציות

rsExtractFrustumPlanes : חישוב של מישורי חתך חרוט

void rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* righ, float4* top, float4* bottom, float4* near, float4* far); נוספה ב-רמת API 24
void rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* right, float4* top, float4* bottom, float4* near, float4* far); הוסרה מ-רמת API 24 ואילך
פרמטרים
viewProjהמטריצה שממנה רוצים לחלץ את המישורים.
נשארוהמטוס השמאלי.
ימניהמטוס הנכון.
עליוןהמטוס העליון.
תחתוןהמטוס התחתון.
לידליד המטוס.
רחוקהמטוס הרחוק.
righ

חישוב 6 מישורי חתך של חרוט משולש מהמטריצה של הקרנה של התצוגה

rsIsSphereInFrustum : בדיקה אם כדור נמצא בתוך המישורים של חרוט החזה

bool rsIsSphereInFrustum(float4* sphere, float4* left, float4* right, float4* top, float4* bottom, float4* near, float4* far);
פרמטרים
כדורfloat4 שמייצג את הכדור.
נשארוהמטוס השמאלי.
ימניהמטוס הנכון.
עליוןהמטוס העליון.
תחתוןהמטוס התחתון.
לידליד המטוס.
רחוקהמטוס הרחוק.

הפונקציה מחזירה את הערך true אם הכדור נמצא בתוך 6 המישורים של גוף דמוי חרוט.

rsMatrixGet : אחזור של אלמנט אחד

float rsMatrixGet(const rs_matrix2x2* m, uint32_t col, uint32_t row);
float rsMatrixGet(const rs_matrix3x3* m, uint32_t col, uint32_t row);
float rsMatrixGet(const rs_matrix4x4* m, uint32_t col, uint32_t row);
פרמטרים
mהמטריצה שממנה יש לחלץ את הרכיב.
עמודההעמודה של הרכיב שרוצים לחלץ, שמתחילה בספרה אפס.
שורההשורה של הרכיב שרוצים לחלץ, שמתחילה בספרה אפס.

הפונקציה מחזירה רכיב אחד של מטריצה.

אזהרה: סדר הפרמטרים של העמודות והשורות עשוי להיות לא צפוי.

rsMatrixInverse : הופכת מטריצה במקום

bool rsMatrixInverse(rs_matrix4x4* m);
פרמטרים
mהמטריצה שרוצים להפוך.

הפונקציה מחזירה את הערך true אם ההיפוך של המטריצה בוצע בהצלחה.

rsMatrixInverseTranspose : הופכת ומחליפה את המטריצה במקום

bool rsMatrixInverseTranspose(rs_matrix4x4* m);
פרמטרים
mהמטריצה שרוצים לשנות.

קודם מבטלים את המטריצה ואז מבצעים לה טרנספוזיציה. הפונקציה מחזירה את הערך true אם המטריצה הופעלה בהצלחה.

rsMatrixLoad : טעינת מטריצה או העתקה שלה

void rsMatrixLoad(rs_matrix2x2* destination, const float* array);
void rsMatrixLoad(rs_matrix2x2* destination, const rs_matrix2x2* source);
void rsMatrixLoad(rs_matrix3x3* destination, const float* array);
void rsMatrixLoad(rs_matrix3x3* destination, const rs_matrix3x3* source);
void rsMatrixLoad(rs_matrix4x4* destination, const float* array);
void rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix2x2* source);
void rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix3x3* source);
void rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix4x4* source);
פרמטרים
יעדהמטריצה להגדרה.
מערךמערך ערכים להגדרת המטריצה. אורך המערכים האלה צריך להיות 4, 9 או 16 מספרים מסוג float, בהתאם לגודל המטריצה.
מקורמטריצת המקור.

הגדרת הרכיבים של מטריצה ממערך של מספרים מסוג float או ממטריצה אחרת.

אם אתם מעמיסים ממערך, הערכים של המשתנים מסוג float צריכים להיות בסדר של שורות ראשיות, כלומר, המשתנה arow 0, column 0 צריך להיות הראשון, ואחריו המשתנה atrow 0, column 1 וכו'.

אם הטעינה מתבצעת ממטריצה והמקור קטן מהיעד, שאר היעדים יתמלאו ברכיבים של מטריצת הזהות. לדוגמה, טעינת rs_matrix2x2 ל-rs_matrix4x4 תיתן את התוצאה הבאה:

m00 m01 0.0 0.0
m10 m11 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0

rsMatrixLoadFrustum : טעינת מטריצת הקרנה של תרבוע קטום

void rsMatrixLoadFrustum(rs_matrix4x4* m, float left, float right, float bottom, float top, float near, float far);
פרמטרים
mהמטריצה להגדרה.
נשארו
ימני
תחתון
עליון
ליד
רחוק

יצירת מטריצת הקרנה של תרבוע משולש, טרנספורמציה של התיבה ששש מישורי החיתוך left, right, bottom, top, near, far מזהים.

כדי להחיל את ההקרנה הזו על וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixLoadIdentity : מטריצת זהות של עומס

void rsMatrixLoadIdentity(rs_matrix2x2* m);
void rsMatrixLoadIdentity(rs_matrix3x3* m);
void rsMatrixLoadIdentity(rs_matrix4x4* m);
פרמטרים
mהמטריצה להגדרה.

הגדרת הרכיבים של מטריצה למטריצת זהות.

rsMatrixLoadMultiply : כפל של שתי מטריצות

void rsMatrixLoadMultiply(rs_matrix2x2* m, const rs_matrix2x2* lhs, const rs_matrix2x2* rhs);
void rsMatrixLoadMultiply(rs_matrix3x3* m, const rs_matrix3x3* lhs, const rs_matrix3x3* rhs);
void rsMatrixLoadMultiply(rs_matrix4x4* m, const rs_matrix4x4* lhs, const rs_matrix4x4* rhs);
פרמטרים
mהמטריצה להגדרה.
lhsהמטריצה השמאלית של המוצר.
rhsהמטריצה הימנית של המוצר.

הפונקציה מגדירה את m כמכפלת המטריצות של lhs * rhs.

כדי לשלב שתי מטריצות טרנספורמציה בגודל 4x4, מכפילים את מטריצת הטרנספורמציה השנייה במטריצת הטרנספורמציה הראשונה. לדוגמה, כדי ליצור מטריצה של טרנספורמציה שמחילה את הטרנספורמציה s1 ואחריה את הטרנספורמציה s2, צריך לבצע קריאה ל-rsMatrixLoadMultiply(&combined, &s2, &s1).

אזהרה: לפני גרסה 21, לא ניתן לשמור את התוצאה בחזרה במטריצה הימנית, והפעולה הזו תוביל להתנהגות לא מוגדרת. במקום זאת, צריך להשתמש ב-rsMatrixMulitply. לדוגמה, במקום להשתמש ב-rsMatrixLoadMultiply (&m2r, &m2r, &m2l), צריך להשתמש ב-rsMatrixMultiply (&m2r, &m2l).‏ rsMatrixLoadMultiply (&m2l, &m2r, &m2l) פועל כמצופה.

rsMatrixLoadOrtho : טעינת מטריצת הקרנה אורתוגרפית

void rsMatrixLoadOrtho(rs_matrix4x4* m, float left, float right, float bottom, float top, float near, float far);
פרמטרים
mהמטריצה להגדרה.
נשארו
ימני
תחתון
עליון
ליד
רחוק

יצירת מטריצה של הקרנה אורתוגרפית, שממירה את התיבה ששש מישורי החיתוך left, right, bottom, top, near, far מזהים לקוביית יחידה עם פינה ב-(-1, -1, -1) והפינה הנגדית ב-(1, 1, 1).

כדי להחיל את ההקרנה הזו על וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

מידע נוסף זמין בכתובת https://en.wikipedia.org/wiki/Orthographic_projection .

rsMatrixLoadPerspective : טעינת מטריצת הקרנה פרופרקטיבית

void rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
פרמטרים
mהמטריצה להגדרה.
fovyשדה הראייה, במעלות לאורך ציר Y.
אספקטהיחס x / y.
לידליד מישור החיתוך.
רחוקמישור חיתוך רחוק.

יצירת מטריצה של הקרנה בפרספקטיבה, בהנחה ששדה הראייה סימטרי.

כדי להחיל את ההקרנה הזו על וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixLoadRotate : טעינת מטריצת רוטציה

void rsMatrixLoadRotate(rs_matrix4x4* m, float rot, float x, float y, float z);
פרמטרים
mהמטריצה להגדרה.
ריקבוןמידת הסיבוב, במעלות.
xרכיב ה-X של הווקטור שהוא ציר הסיבוב.
yרכיב ה-Y של הווקטור שהוא ציר הסיבוב.
zרכיב ה-Z של הווקטור שהוא ציר הסיבוב.

הפונקציה הזו יוצרת מטריצת רוטציה. ציר הסיבוב הוא הווקטור (x, y, z).

כדי לסובב וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

אפשר לעיין בכתובת https://en.wikipedia.org/wiki/Rotation_matrix .

rsMatrixLoadScale : טעינת מטריצת שינוי קנה מידה

void rsMatrixLoadScale(rs_matrix4x4* m, float x, float y, float z);
פרמטרים
mהמטריצה להגדרה.
xמכפיל להגדלת הרכיבים של x.
yמכפיל להגדלת הרכיבים של ציר y.
zמכפיל להגדלת הרכיבים של z.

הפונקציה הזו יוצרת מטריצה של שינוי קנה מידה, שבה כל רכיב של וקטור מוכפל במספר. המספר הזה יכול להיות שלילי.

כדי לשנות את קנה המידה של וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixLoadTranslate : טעינת מטריצה של תרגום

void rsMatrixLoadTranslate(rs_matrix4x4* m, float x, float y, float z);
פרמטרים
mהמטריצה להגדרה.
xהמספר שיתווסף לכל רכיב x.
yהמספר שצריך להוסיף לכל רכיב y.
zמספר להוספה לכל רכיב z.

הפונקציה הזו יוצרת מטריצה של תרגום, שבה מתווסף מספר לכל רכיב של וקטור.

כדי לתרגם וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixMultiply : הכפלת מטריצה בוקטור או במטריצה אחרת

float2 rsMatrixMultiply(const rs_matrix2x2* m, float2 in); נוספה ב-רמת API 14
float2 rsMatrixMultiply(rs_matrix2x2* m, float2 in); הוסרו מ-רמת API 14 ואילך
float3 rsMatrixMultiply(const rs_matrix3x3* m, float2 in); נוספה ב-רמת API 14
float3 rsMatrixMultiply(const rs_matrix3x3* m, float3 in); נוספה ב-רמת API 14
float3 rsMatrixMultiply(rs_matrix3x3* m, float2 in); הוסרו מ-רמת API 14 ואילך
float3 rsMatrixMultiply(rs_matrix3x3* m, float3 in); הוסרו מ-רמת API 14 ואילך
float4 rsMatrixMultiply(const rs_matrix4x4* m, float2 in); נוספה ב-רמת API 14
float4 rsMatrixMultiply(const rs_matrix4x4* m, float3 in); נוספה ב-רמת API 14
float4 rsMatrixMultiply(const rs_matrix4x4* m, float4 in); נוספה ב-רמת API 14
float4 rsMatrixMultiply(rs_matrix4x4* m, float2 in); הוסרו מ-רמת API 14 ואילך
float4 rsMatrixMultiply(rs_matrix4x4* m, float3 in); הוסרו מ-רמת API 14 ואילך
float4 rsMatrixMultiply(rs_matrix4x4* m, float4 in); הוסרו מ-רמת API 14 ואילך
void rsMatrixMultiply(rs_matrix2x2* m, const rs_matrix2x2* rhs);
void rsMatrixMultiply(rs_matrix3x3* m, const rs_matrix3x3* rhs);
void rsMatrixMultiply(rs_matrix4x4* m, const rs_matrix4x4* rhs);
פרמטרים
mהמטריצה השמאלית של המכפלה והמטריצה שתוגדר.
rhsהמטריצה הימנית של המוצר.
בתוך

בגרסת המטריצה על המטריצה, המערכת מגדירה את m כמכפלת המטריצות m * rhs.

כשמשלבים שתי מטריצות טרנספורמציה בגודל 4x4 באמצעות הפונקציה הזו, המטריצה שמתקבלת תואמת לביצוע הטרנספורמציה של ה-rhs ואז הטרנספורמציה המקורית של m.

בגרסת המטריצה על ידי וקטור, הפונקציה מחזירה את המטריצה שמתקבלת לאחר הכפלת הווקטור במטריצה, כלומר m * in.

כשמעכפלים float3 ב-rs_matrix4x4, הוקטור מורחב ב-(1).

כשמעכפלים float2 ב-rs_matrix4x4, הוקטור מתרחב עם (0, 1).

כשמעכפלים float2 ב-rs_matrix3x3, הוקטור מורחב ב-(0).

החל מגרסה 14 של ה-API, הפונקציה הזו מקבלת מטריצה קבועה כארגומנט הראשון.

rsMatrixRotate : החלת רוטציה על מטריצת טרנספורמציה

void rsMatrixRotate(rs_matrix4x4* m, float rot, float x, float y, float z);
פרמטרים
mהמטריצה שרוצים לשנות.
ריקבוןמידת הסיבוב, במעלות.
xרכיב ה-X של הווקטור שהוא ציר הסיבוב.
yרכיב ה-Y של הווקטור שהוא ציר הסיבוב.
zרכיב ה-Z של הווקטור שהוא ציר הסיבוב.

מכפילים את המטריצה m במטריצה של סיבוב.

הפונקציה הזו משנה מטריצה של טרנספורמציה כדי לבצע קודם רוטציה. ציר הסיבוב הוא הווקטור (x, y, z).

כדי להחיל את השינוי המשולב הזה על וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixScale : החלת שינוי קנה מידה על מטריצת טרנספורמציה

void rsMatrixScale(rs_matrix4x4* m, float x, float y, float z);
פרמטרים
mהמטריצה שרוצים לשנות.
xמכפיל להגדלת הרכיבים של x.
yמכפיל להגדלת הרכיבים של ציר y.
zמכפיל להגדלת הרכיבים של z.

מכפילים את המטריצה m במטריצה של שינוי קנה מידה.

הפונקציה הזו משנה את מטריית הטרנספורמציה כדי לבצע קודם שינוי קנה מידה. כשמשנים את קנה המידה, כל רכיב של וקטור מוכפל במספר. המספר הזה יכול להיות שלילי.

כדי להחיל את השינוי המשולב הזה על וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixSet : הגדרת רכיב אחד

void rsMatrixSet(rs_matrix2x2* m, uint32_t col, uint32_t row, float v);
void rsMatrixSet(rs_matrix3x3* m, uint32_t col, uint32_t row, float v);
void rsMatrixSet(rs_matrix4x4* m, uint32_t col, uint32_t row, float v);
פרמטרים
mהמטריצה שתשתנה.
עמודההעמודה שמתחילה בספרה אפס של הרכיב שרוצים להגדיר.
שורההשורה של הרכיב שרוצים להגדיר, שמתחילה בספרה אפס.
vהערך להגדרה.

הגדרת אלמנט במטריצה.

אזהרה: סדר הפרמטרים של העמודות והשורות עשוי להיות לא צפוי.

rsMatrixTranslate : החלת תרגום על מטריית טרנספורמציה

void rsMatrixTranslate(rs_matrix4x4* m, float x, float y, float z);
פרמטרים
mהמטריצה שרוצים לשנות.
xהמספר שיתווסף לכל רכיב x.
yהמספר שצריך להוסיף לכל רכיב y.
zמספר להוספה לכל רכיב z.

מכפילים את המטריצה m במטריצה של תרגום.

הפונקציה הזו משנה מטריצה של טרנספורמציה כדי לבצע קודם תרגום. בתרגום, מספר מתווסף לכל רכיב של וקטור.

כדי להחיל את השינוי המשולב הזה על וקטור, מכפילים את הווקטור במטריצה שנוצרה באמצעות rsMatrixMultiply().

rsMatrixTranspose : החלפת מיקום של מטריצה

void rsMatrixTranspose(rs_matrix2x2* m);
void rsMatrixTranspose(rs_matrix3x3* m);
void rsMatrixTranspose(rs_matrix4x4* m);
פרמטרים
mהמטריצה שרוצים לבצע לה טרנספוזיציה.

מחליפים את המטריצה m במקום.