אור וצל

SHMENDOZA

New member
אור וצל

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

ZDanielZ

New member
אם תראה קצת קוד...

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

SHMENDOZA

New member
אז הנה כמה פונקציות

Public Function Light(G As GufType, Face%, lA!, lB!, lC!, Color) As Long Dim Tmp!, A!, B!, C! Normal G.V(G.P(Face, 2), 1), G.V(G.P(Face, 2), 2), G.V(G.P(Face, 2), 3) _ , G.V(G.P(Face, 3), 1), G.V(G.P(Face, 3), 2), G.V(G.P(Face, 3), 3) _ , G.V(G.P(Face, 4), 1), G.V(G.P(Face, 4), 2), G.V(G.P(Face, 4), 3) _ , A, B, C Tmp = (Abs(Scalar_Product(A, B, C, lA, lB, lC)) / (Length(A, B, C) * Length(lA, lB, lC))) Light = RGB(Tmp * (Color And 255), Tmp * ((Color \ 256) And 255), Tmp * ((Color \ 65536) And 255)) End Function Public Sub LVec(lX!, lY!, lZ!, G As GufType, A!, B!, C!) Dim cX!, cY!, cZ! Center_of_3dBody cX, cY, cZ, G A = lX - cX B = lY - cY C = lZ - cZ End Sub Public Function Normal(X1 As Single, Y1 As Single, Z1 As Single, _ X2 As Single, Y2 As Single, Z2 As Single, _ X3 As Single, Y3 As Single, Z3 As Single, _ A!, B!, C!) A = Y1 - Y2 * Z2 - Z3 - Z2 - Z3 * Y2 - Y3 B = Z1 - Z2 * X2 - X3 - X1 - X2 * Z2 - Z3 C = X1 - X2 * Y2 - Y3 - Y1 - Y2 * X2 - X3 End Function Public Function Length(A!, B!, C!) As Single Length = Sqr(A ^ 2 + B ^ 2 + C ^ 2) End Function Public Function Scalar_Product(A1!, B1!, C1!, A2!, B2!, C2!) As Single Scalar_Product = A1 * A2 + B1 * B2 + C1 * C2 End Function​
הראשונה מקבלת קיר ווקטור לנק' תאורה ומחזירה את הגוון שבו צריך לצבוע השניה מקבלת מרכז תאורה וגוף ויוצרת ממרכזו וקטור לנק' תאורה השלישית מחשבת ומחזירה ניצב לקיר שקיבלה הרביעית מחשבת אורך של וקטור החמישית מבצעת מכפלה בקלארית בין 2 וקטורים. תודה מראש!
 

SHMENDOZA

New member
אוקיי, גיליתי באג

שאני מחשב את הוקטור ממרכז הגוף ולא ממרכז הפאה אז תיקנתי וזה עדיים עובד חרא. הנה הפונק' המתוקנות
Public Function Light(G As GufType, Face%, lX!, lY!, lZ!, Color) As Long Dim Tmp!, A!, B!, C!, lA!, lB!, lC! LVec2 lX, lY, lZ, G, Face, lA, lB, lC Normal G.V(G.P(Face, 2), 1), G.V(G.P(Face, 2), 2), G.V(G.P(Face, 2), 3) _ , G.V(G.P(Face, 3), 1), G.V(G.P(Face, 3), 2), G.V(G.P(Face, 3), 3) _ , G.V(G.P(Face, 4), 1), G.V(G.P(Face, 4), 2), G.V(G.P(Face, 4), 3) _ , A, B, C Tmp = (Abs(Scalar_Product(A, B, C, lA, lB, lC)) / (Length(A, B, C) * Length(lA, lB, lC))) Light = RGB(Tmp * (Color And 255), Tmp * ((Color \ 256) And 255), Tmp * ((Color \ 65536) And 255)) End Function Public Sub LVec(lX!, lY!, lZ!, G As GufType, A!, B!, C!) Dim cX!, cY!, cZ! Center_of_3dBody cX, cY, cZ, G A = lX - cX B = lY - cY C = lZ - cZ End Sub Public Sub LVec2(lX!, lY!, lZ!, G As GufType, ndX%, A!, B!, C!) Dim AvgX!, AvgY!, AvgZ! Dim I% For I = 2 To G.P(ndX, 1) AvgX = AvgX + G.V(G.P(ndX, I), 1) AvgY = AvgX + G.V(G.P(ndX, I), 2) AvgZ = AvgX + G.V(G.P(ndX, I), 3) Next I AvgX = AvgX / G.P(ndX, 1) AvgY = AvgY / G.P(ndX, 2) AvgZ = AvgZ / G.P(ndX, 3) A = lX - AvgX B = lY - AvgY C = lZ - AvgZ End Sub​
אני מוסיף גם קובץ שהוא המשחק, תהפוך ל.ZIP אתה זז עם המקשים למעלה, למטה, לצדדים, Q,E, אסקייפ ליציאה , SPACE, CTRL
 

voguemaster

New member
אוקיי

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

SHMENDOZA

New member
תגובה

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

voguemaster

New member
לאיזה ווקטור שני אתה מתכוון ?

"לוקטור השני שאיתו אני מחשב את זווית קרני האור" - זה בדיוק הנורמל, לא ? עכשיו בגדול: 1. אינטואיטיבית כשהנורמל מקביל ובאותו כיוון של ווקטור האור אתה מקבל מה ? שה-FACE לא מצויר. 2. אינטואיטיבית שוב, כשהנורמל מקביל לווקטור האור אך בכיוון מנוגד לו, אז זה אומר שה-FACE פונה אל מקור האור והוא מצויר. כלומר - קוסינוס הזווית קטן מ-0.
 

SHMENDOZA

New member
הסץדרתי כבר

הטעות העיקרית היית בחישוב הנורמל, חסרים שם סוגריים... חוץ מזה, בדרך גיליתי עוד כל מיני באגים תודה על העזרה
 

voguemaster

New member
מה דעתך

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

SHMENDOZA

New member
לא הבנתי את הרעיון?

מה הכוונה זווית אלכסונית? ואיך זה בדיוק עוזר לי?
 

voguemaster

New member
תראה *לנו* את הכל בזוית אלכסונית

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

איפה ומה אתה לומד ההודעות שלך נורא מרתקות אותי, אתה לומד באונ' מסויימת ? אם אפשר לשאול איזה שנה ? איזה מקצוע זה ?
 
למעלה