الشبكة العربية لمطوري الألعاب

موهوب  16mofed84 مشاركة 1

السلام عليكم

احاول ان ارسل animation من 3Ds max  الى XNA بأستخدام maxscript
و نجحت في ذلك .. لكن القصة في تغيير احداثيات

تغيير احداثيات النقط لا مشكلة فيه XYZ > XZY
ولكن ماذا عن المصفوفة
[]
حاولت ان اضربها ب:


[1,0,0,0]
[0,0,1,0]
[0,1,0,0]
[0,0,0,1]
 و لم ينجح ما المشكلة بالتحديد ؟!

خبير مدير همام البهنسي مشاركة 2

كشخص لديه تجربة مع هذه الأمور، بشكل عام لا أنصحك بالتعامل مع الماكس لأن طريقة توصيفه الرياضية شاذة عن ما هو متعارف عليه في الـ OpenGL والـ DirectX.حاول أن تجد حل للمسألة من الماكس. يفترض أن يكون هناك خيار لتغيير ترتيب المحاور ضمن البرنامج. وإلا ستواجه المزيد من المشاكل مع الشجريات الأعقد.

بالنسبة للمصفوفة الدوران، لا أعلم تماماً ماهي المصفوفة التي تقوم بالتحويل مباشرة من مصفوفة XYZ الى مصفوفة XZY. ولكن كحل سريع، يمكنك حساب قيم أويلر من مصفوفة الدوران الناتجة من الماكس ثم قم بتشكيل مصفوفة جديدة انطلاقاً من زاويا أويلر بالترتيب الصحيح الذي تريده.

http://www.twitter.com/homambahnassi
IN|Framez Tech. Corp. - Montreal

موهوب  16mofed84 مشاركة 3

بنسبه لترتيب العظام..(الشجيرات البرمجيه)
واجهت مشكه بسيطه ولكني قمت بحلها وهذا هو حلها :(للاستفادة فقط)
                for i=1 to bcount do
                (
                    format ((skinOps.GetBoneName skn i 0) +"\n")to:str;
                    _bbb = getNodeByName((skinOps.GetBoneName skn i 0));
                    format ("Children[" + (_bbb.Children.Count as string)+"]{")to:str;
                    for ii in _bbb.Children do
                    (
                        format (ii.Name + ",")to:str;
                    )
                    format ("}\n")to:str;
                )

ثم اعادة الشجيره داخل C#
 بنسبه زاويه اولير انا لم اتعلم هذا النوع من الرياضيات اعتقد ان الكود المطلوب هو:


eu = (quatToEuler Rotation order:1);
q = (eulerToQuat eu order:2);
-- order: 
--1 : XYZ
--2 : XZY

مشكور جدا على ردك السريع نجحت التجربه

مبتدئ  حسام زكريا مشاركة 4

السلام عليكم ورحمة الله، طريقتك جميلة جداً في حل هذه المشكلة وإجراء التحويل اللازم، أنا لدي طريقة أخرى لحل هذه المشكلة وإجراء التحويل اللازم

for obj in selection do
(
    local q = obj.rotation
    // read the old axis and angle
    local axis = q.axis
    local angle = q.angle
    // convert the axis as a normal vector conversion
    // or as a normal Point3 conversion 
    // this conversion depend on your engine coordinate system 
    // (right hand or left hand)
    local newAxis = [axis.x, axis.z, -axis.y] 
    // calculate the new rotation from the new axis and the old angle
    local newRotation = quat angle newAxis
   // now you can save the new rotation here ...
)

Husam Zakaria
Game Programmer