עבור לתוכן

C# - קוביה הונגרית

Featured Replies

פורסם

אני עושה 10 יחידות מדעי המחשב ול5 היחידות השניות אנחנו בונים משחק/תוכנה תלת מימדי/ת בC#, אני בונה קוביה הונגרית ויש לי בעיה אם אני מסובב פאה רוחבית ואחר כך פאה אנכית אז הקוביה המשותפת לשני הפאות מסתובבת בנוסף לשני הצירים האלו גם בציר Z.

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

קישור להורדה:http://www.filefront.com/17428606/Pr...hDirection.rar

תודה מראש לעונים :) .

פורסם

נסה לשים את הקוד הרלוונטי ישר בפורום וכך יהיה יותר סיכוי שתקבל תשובה.

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

ראה: http://en.wikipedia.org/wiki/Rubik%27s_Cube#Move_notation

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

פורסם
  • מחבר

זו הבעיה שלי פחות או יותר:

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

קוד רלוונטי:


{
for (int i = 0; i < turns.GetLength(1); i++)
{
if (turns[0, i] != 0)
{
TVertex newPos;
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
{
int index = (i + k * 3) * 3 + j;
newPos = Cubes[index].GetPos();
Cubes[index].SetOrientationY(Cubes[index].GetOrientationY() + turns[0, i]);
Cubes[index].SetPosAndAngle(newPos.X, newPos.Y, newPos.Z, Math3D.Deg2Rad(Cubes[index].GetOrientationX()), Math3D.Deg2Rad(Cubes[index].GetOrientationY()), 0);
//Cubes[index].SetPosAndAngle(newPos.X, newPos.Y, newPos.Z, Math3D.Deg2Rad(Cubes[index].GetOrientationX()), Math3D.Deg2Rad(Cubes[index].GetOrientationY()), Math3D.Deg2Rad(Cubes[index].GetOrientationZ()));
}
if (++count == 30)
{
turns[0, i] = 0;
count = 0;
}
}
else if (turns[1, i] != 0)
{
TVertex newPos;
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
{
int index = (j + k * 3) * 3 + i;
newPos = Cubes[index].GetPos();
Cubes[index].SetOrientationX(Cubes[index].GetOrientationX() + turns[1, i]);
//Cubes[index].SetOrientationZ(Cubes[index].GetOrientationY() + 270);
Cubes[index].SetPosAndAngle(newPos.X, newPos.Y, newPos.Z, Math3D.Deg2Rad(Cubes[index].GetOrientationX()), Math3D.Deg2Rad(Cubes[index].GetOrientationY()), Math3D.Deg2Rad(Cubes[index].GetOrientationZ()));
}
if (++count == 30)
{
turns[1, i] = 0;
count = 0;
}
}
}
}
    private void rotateRC()

פורסם

אני לא 100% בטוח אבל לפי התיאור שלך נשמע שאתה חווה gimbal lock.

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

http://en.wikipedia.org/wiki/Gimbal_lock

הפתרון המקובל הוא לעבוד ב-quaternions או לפרט סיבובים ע"י ציר + זווית.

יתכן שעבור קוביה הונגרית יש פתרונות קלים יותר.

עריכה: כן, הנה מישהו שנתקל בבעיה הזו ופתר אותה עם quaternions

http://www.perkstoveland.com/archives/92

פורסם
  • מחבר

אני לא 100% בטוח אבל לפי התיאור שלך נשמע שאתה חווה gimbal lock.

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

http://en.wikipedia.org/wiki/Gimbal_lock

הפתרון המקובל הוא לעבוד ב-quaternions או לפרט סיבובים ע"י ציר + זווית.

יתכן שעבור קוביה הונגרית יש פתרונות קלים יותר.

עריכה: כן, הנה מישהו שנתקל בבעיה הזו ופתר אותה עם quaternions

http://www.perkstoveland.com/archives/92

קודם כל תודה :),

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

ניסיתי כל מיני נוסחאות שמצאתי בויקיפדיה אבל הן לא מתאימות(כנראה) למצב הספציפי שלי.

פורסם

אתה צריך להפסיק לעבוד עם זוויות אויילר - שזה סט של 3 זוויות סיבוב - סביב ציר X, סביב ציר Y, סביב ציר Z.

ממה שאני רואה מהקוד זה מה שאתה עושה (SetOrientationX, SetOrientationY וכו').

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

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

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

disclaimer: עבר המון זמן מאז שהתעסקתי עם זה, אז אני מקווה שאני לא מטעה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים