יום שישי, 12 ביולי 2013

המצב הצבוע הזה...

"המצב הצבוע הזה" - קבוצת קודקודים

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

ובכן, נניח שאני רוצה לגרום למודל שבניתי להתנועע בצורה יותר מורכבת ולכן אני בונה שלד של עצמות (ריג) שישלוט על המודל שבניתי. בד"כ לאחר שבניתי את השלד אני מחבר אותו עם Ctrl+P למודל (בוחר את המודל ואח"כ את השלד) ובוחר ב-With Automatic Weights.
חיבור עצם למודל
למה?
שאלה טובה, ככה ראיתי במדריכים ועשיתי כמו קוף...
זה עבד, עובד וכנראה יעבוד בלי לשאול הרבה שאלות, ברקע התרחשו כמה דברים שלא ממש עניינו אותי ובזה זה נגמר...
אז זהו, שלא.


מה בעצם קורה שם?

כאשר אני מעוניין שתכונה מסוימת תשלוט על כל המודל אני יכול להגדיר יחסי אב-בן, להפעיל מודיפייר וכו' על כל המודל "כנהוג".
בזרוע רובוטית למשל, אני יכול לבנות את הזרוע כחלקים שונים - מודלים נפרדים, להגדיר יחסי אב-בן בין החלקים (כדי שיזוזו בהתאם) ולעשות אנימציה בצורה די פשוטה.
אבל מה קורה כאשר אני מעוניין לשלוט בחלק מהמודל מבלי לפרק אותו לחלקים?
מה קורה כאשר אני מעוניין לבנות מודל של אדם ולא לפרק אותו לידיים, רגליים וכו'?

כאן נכנס לקטע המושג של "קבוצת קודקודים" ובאנגלית: "Vertex Group".
הכלי הזה מאפשר לי להגדיר חלקים מסוימים במודל כקבוצה. לתת בעצם שם לקבוצה של קודקודים כך שאח"כ אוכל להתייחס לקבוצה בצורה ספציפית ולהגדיר שליטה על הקבוצה בלבד (היכן שזה נתמך).

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

הגדרת קבוצת קודקודים

כדי להגדיר קודקודים מסוימים כקבוצה עלינו לבחור את המודל, להיכנס למצב עריכה, לבחור את הקודקודים הרצויים ואז ללחוץ על Ctrl+G.
נקבל את האפשרויות הבאות:

מבלבל?
נכון.

למעשה אתוודה ואומר שאף פעם לא עשיתי שימוש בזה (רק עכשיו גילית את הקיצור הזה...)
את הקבוצות אני מגדיר בעצם בטאב של ה-Object Data.
במאמר מוסגר רק אומר שהמודל מחולק בעצם לשניים: Object ו-Object Data. האובייקט הוא בעצם מה שרואים במצב רגיל (מצב אובייקט - Object Mode) והמצב השני מכיל בעצם את המבנה הפנימי של האובייקט.
אפשר למשל ליצור קובייה וכדור ולהחליף את הנתונים ביניהם כך שהכדור יכיל את הנתונים של הקובייה (יהיה לו שם של כדור אבל הוא יראה כקובייה) והקובייה תכיל את הנתונים של הכדור.

נחזור לעניינינו, כיוון שאנחנו רוצים להתעסק בעצם בנתונים של האובייקט (סדר הקודקודים הפנימי) ההגדרה לזה תהיה בטאב של "נתוני האובייקט".
טאב נתוני האובייקט - הגדרת קבוצות קודקודים
כאן נוכל להוסיף קבוצות (לחיצה על כפתור ה-"+") ולהסיר קבוצות (כפתור ה-"-"), לעשות פעולות מיוחדות על הקבוצות (הכפתור הכהה שמתחלת לכפתורים הנ"ל) וכמובן לשנות את סדר הופעת הקבוצות ברשימה עם כפתורי החיצים מעלה/מטה.
הוספת הקודקודים הנבחרים לקבוצה מתבצעת ע"י הבחירה שלהם (איך לא...), סימון הקבוצה הרצויה ולחיצה על Assign (= שייך).
הכפתור הזה בעצם משייך את הקודקודים לקבוצה.
כפתור Remove (= הסרה) מסיר כמובן את הקודקודים מהקבוצה.
כדי לראות מה הקבוצה מכילה עלינו לסמן אותה וללחוץ על כפתור Select (= בחירה/סימון). בלנדר תסמן את כל הקודקודים ששייכים לקבוצה. Deselect (הסרת בחירה/סימון) תסיר את הבחירה של הקודקודים ששייכים לקבוצה.

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

אבל מה הקשר ל-צבע ?

לא הכל שחור לבן

שכחתי להסביר דבר קטנצ'יק כמו שבטח שמתם לב.
בתמונה למעלה, מתחת לכפתורים של Assign, Remove וכו' יש עוד שורה שכתוב בה: Weight.
Weight באנגלית פירושו "משקל". השורה הזו מאפשרת לי בעצם להגדיר עד כמה הקודקודים שבחרתי יהיו שייכים לקבוצה.
זאת אומרת שניתן להגדיר שקודקוד מסוים יהיה שייך רק ב-70% לקבוצה. מה זה אומר בעצם? שכאשר אני מגדיר מודיפייר (עוד פעם הדוגמה הזו? תחליף משהו...) שישפיע על קבוצת קודקודים, אני יכול בעצם להגדיר כמה השפעה תהיה על כל קודקוד וקודקוד.
בדוגמה לעיל כל קודקוד משויך לקבוצה ב-100%. כדי לשייך אותם ב-60% אני מעביר את הסליידר ל-0.6 ולוחץ שוב על Assign.
זה מה שאקבל:
בקרת מידת ההשפעה/שייכות
בעצם, אני יכול לבחור קודקוד קודקוד ולשנות לו את מידת השייכות לקבוצה ובכך להגדיר את מידת ההשפעה עליו.
כל עוד יש לי כמות קודקודים קטנה אפשר לזרום עם השיטה הזו.
מה קורה כאשר יש לי כמות גדולה של קודקודים / אני עצלן ומחפש קיצורי דרך?
ובכן, "למרבה הפלא" ניתן לצבוע את המשקל ולא רק לכתוב אותו.

הצבע נכנס לתמונה

כדי לשנות בצורה קלה יותר את מידת ההשפעה של כל קודקוד בקבוצה ישנו מצב עריכה מיוחד שנקרא: Weight Paint שאיתו ניתן לצבוע את המשקל.
המצב הזה נגיש באותו תפריט שבו ניתן לעבור למצב עריכה.
ככה זה נראה:
Weight Paint - צביעת משקל
שימו לב שבצד ימין נעלם הסליידר של המשקל וכל נושא השיוך.
כמו שאתם רואים בתמונה מה שלא שייך לקבוצה נראה צבוע בצבע כחול (קר) ומה ששייך מתחיל להיצבע לכיוון הצבע האדום (חם). כרגע הקודקודים עדיין ב-60% ולכן הם צבועים בירוק.

אחרי קצת משחקים ככה זה נראה:
מצב צביעה בפעולה!!

קצת הסברים:

מאפייני המברשת (שאיתה צובעים) הינם:
Weight - כמה משקל המברשת אמורה להחיל בסופו של דבר.
Radius - רדיוס המברשת (גודלה בעצם...)
Strenght - חוזק המברשת, כלומר כמה מהר המברשת תגיע למשקל הרצוי בלחיצה הראשונה, חוזק של 1 אומר שבלחיצה הראשונה המברשת תחיל 100% מהמשקל, אם המשקל הוא 1 נקבל ישר צבע אדום באותו מקום בו צבענו. אם החוזק יהיה 50% (0.5) אז לא נגיע ישר לצבע האדום אלא לירוק (שמציין בערך 50% משקל).

קיצורים מועילים:

מקש F - מאפשר לקבוע את גודל המברשת (רדיוס)
Shift+F - מגדיר את החוזק של המברשת.
לחיצה על Ctrl מאפשרת לנו לדגום את החוזק באותה נקודה וכך לשנות את המשקל שאיתו נצבע בהמשך (כמו הטפטפת בפוטושופ)
לחיצה על Alt מאפשרת לנו למתוח קו וליצור מעבר צבעים (Gradient) וכך לצבוע יותר בקלות אזורים שלמים בצורה יותר מדויקת (כאשר רוצים מעבר ממשקל גבוה לנמוך למשל)

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

קוף אדם

נחזור למקרה שהבאתי בהתחלה:
כאשר משייכים מודל לשלד (קבוצת עצמות) ובוחרים באפשרות With Automatic Weights מהתפריט, מה שבלנדר עושה בעצם הוא להגדיר קבוצות קודקודים בצורה אוטומטית לפי מיקום העצם בשלד ולשייך את כל הקודקודים לעצם לפי מידת הקירבה שלהם לעצם.
בדוגמה הבאה בניתי שלד משני עצמות והגדרתי "השפעת משקל אוטומטית" וקיבלתי שתי קבוצות, כל קבוצה קבלה את השם של העצם אליה היא שייכת (כן, זה רעיון טוב לתת שמות לעצמות לפני שמשייכים את המודל לשלד...)

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

העוצמה האמתית (?)

עד עכשיו למדנו מה זה קבוצות קודקודים פחות או יותר ולא נגענו כמעט בדוגמאות לעוצמה של הכלי.
נניח ואנחנו רוצים ליצור דשא ע"י שימוש במערכת החלקיקים.
נוסיף משטח (Plane) ונגדיר לו מערכת חלקיקים שתצמיח ממנו "דשא". אנחנו נקבל דשא שמפוזר באופן שווה על המשטח (בהגדרות ברירת מחדל)
הגדרות "שיער" פשוטות

עכשיו שלמדנו על קבוצת קודקודים נוכל להיכנס למצב עריכה, לבחור את המשטח, לחלק אותו (תפריט W ובחירה ב-Subdivide, הגדרה של 20 חלוקות) כך שנקבל משטח שמורכב מכמות גדולה של קודקודים, ניצור קבוצה חדשה ונגדיר בטאב של החלקיקים שהקבוצה החדשה תשלוט על אורך הדשא/שיער:
חלוקה והגדרת הקבוצה במערת החלקיקים
עכשיו נעבור למצב צביעת משקל ונצבע איפה שאנחנו רוצים שיגדל דשא ואיפה שלא ונקבל את התמונה הבאה:
צביעת שיער...
נחמד לא?

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

תהנו!