LDraw + الوحدة. كيف ولدت ليغو

كل ذلك مع المجيء! اسمي Grisha وأنا مؤسس CGDevs. العطلات قاب قوسين أو أدنى ، شخص ما قد لبس بالفعل شجرة عيد الميلاد ، وأكل اليوسفي ، وهو مشحون بالكامل بمزاج السنة الجديدة. لكن اليوم لا يتعلق الأمر بذلك. اليوم سنتحدث عن تنسيق رائع يسمى LDraw وعن المكون الإضافي لـ Unity ، والذي قمت بتنفيذه وتحميله إلى OpenSource. رابط المشروع ورمز المصدر لهذه المقالة ، كما هو الحال دائمًا ، مرفق. إذا كنت تحب Lego مثلما أحب - مرحبًا بك في Cat.



تنسيق LDraw

لنبدأ مع ما هو LDraw؟ يعد LDraw معيارًا مفتوحًا لبرامج LEGO CAD التي تتيح للمستخدمين إنشاء نماذج ومشاهد LEGO. بشكل عام ، هناك العديد من البرامج والمكونات الإضافية التي يمكنك من خلالها تصور LDraw (على سبيل المثال ، هناك مكون إضافي لبرنامج Blender).

التنسيق نفسه موثق جيدًا ، وسنتحدث عن أحدث إصدار له ، أو بالأحرى عن 1.0.2.

LDraw هو تنسيق نصي يجب إنشاء ملفاته بترميز UTF-8. يجب أن تحتوي الملفات التي يدعمها التنسيق على الامتداد ldr أو dat أو mdp. كل سطر من الملف هو أمر منفصل مسؤول عن وظيفة محددة.

أحد التفاصيل المهمة للتنسيق هو نظام الإحداثيات الأيمن (يتم توجيه Y) - سنناقش بمزيد من التفاصيل لاحقًا في سياق الوحدة ، بالإضافة إلى حقيقة أن التنسيق متكرر (تحتوي معظم الملفات على إشارة إلى ملفات أخرى).



أوامر LDraw

بشكل عام ، يمكن العثور على هذه المعلومات في الوثائق الرسمية ، ولكن دعونا ننظر قليلاً في سياق الوحدة. في المجموع ، يدعم تنسيق LDraw 6 أنواع من الأوامر.

0. تعليق أو أمر meta عبارة عن أوامر خاصة لن نلمسها بالكاد في البرنامج المساعد. مثال: 0 !META command additional parameters

1. رابط إلى الملف . في الواقع ، فإن الفريق الأكثر صعوبة لدمج ومثيرة للاهتمام. يبدو - 1 colour xyzabcdefghi file ، حيث المعلمات هي مصفوفة TRS (يمكن العثور على المزيد حول TRS في هذه المقالة ). في سياق الوحدة في النموذج

 / adg 0 \ | beh 0 | | cfi 0 | \ xyz 1 / 

2. الخط - لا يستخدم في حالة الوحدة ، من الضروري التأكيد على الحواف بلون معين في أنظمة CAD.

3.4. مثلث ومربع . الأوامر بسيطة جدًا ، لكن هناك فارقًا بسيطًا واحدًا مهمًا ، نظرًا لأن تنسيق LDraw غير مصمم للنمذجة ثلاثية الأبعاد ، ولا يتم تخطي تجاوز المثلثات والمربعات فيه. هذا أمر مهم ، لأن الوحدة ، وفقًا لجولة المثلث ، تحدد اتجاه الحساب الطبيعي المحسوب ، وأي جانب من المثلث هو الجزء الخلفي والذي هو الجهة الأمامية (وهو أمر مهم أيضًا للرسم والإعدام)

مثال الأوامر:
مثلث - 3 colour x1 y1 z1 x2 y2 z2 x3 y3 z3
مربع - 4 colour x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4

5. خط اختياري - أيضا لا تستخدم.



الألوان في LDraw

كما ترون في معظم الفرق المسؤولة عن التقديم ، يأتي اللون مباشرة بعد نوع الأمر. تم توثيق الألوان جيدًا في هاتين المادتين www.ldraw.org/article/299.html و www.ldraw.org/article/547.html ، ولكن دعنا نتحدث عن الميزات التي واجهتها أثناء التنفيذ. هنا يستحق الحديث أكثر قليلاً عن التنسيقات وتنسيق "النطاق" المزعوم. هناك 3 أنواع من الملفات بالتنسيق.

DAT - في الواقع ، هذه هي العناصر الأساسية التي تم تجميع الأجزاء منها بالفعل ، أو بعض الأجزاء الأساسية. إذا لم تقدم تفاصيل فردية ، فلن يكون اللون المشار إليها فيه مهمًا. في معظم الأحيان هناك ألوان قياسية من المعيار الرسمي.

LDR هو الشيء الأكثر إثارة للاهتمام من حيث الألوان ، وحيث يلعب Scope دورًا. القاعدة بسيطة للغاية ، على الرغم من أن الموقع وصف اللغات المعقدة. إذا كنت تشير إلى آخر من مستوى واحد ، فتجاهل اللون المحدد في الجذر.

على سبيل المثال ، جزء من الملف 30051-1 - X-wing Fighter - Mini.mpd (X-wing في الصورة أعلاه):

مثال
 1 71 -10 0 50 0 0 1 0 1 0 -1 0 0 60470a.dat 1 71 10 0 50 0 0 -1 0 1 0 1 0 0 60470a.dat 0 STEP 1 19 0 8 50 0 0 -1 0 1 0 1 0 0 4032b.dat 0 STEP 0 ROTSTEP 35 55 0 ABS 1 19 0 -16 0 0 0 -1 0 1 0 1 0 0 3623.dat 1 72 0 -16 50 0 0 -1 0 1 0 1 0 0 3022.dat 0 STEP 1 72 0 -8 -70 1 0 0 0 1 0 0 0 1 30051 - Nose.ldr 


في جميع ملفات dat ، نأخذ بعين الاعتبار اللون المحدد ، وفي الأمر 1 72 0 -8 -70 1 0 0 0 1 0 0 1 1 30051 - Nose.ldr - تجاهل 72 ، واستخدام القيم من الملف 30051 - Nose.ldr .

MDP هو ملف نموذجي ، وغالبًا ما يحتوي على وصف للعديد من ملفات ldr. من حيث اللون ، كما أنها ليست مهمة للغاية. الشيء الوحيد الذي نأخذه في الاعتبار عند إجراء التحليل هو الأمر FILE meta-command.



النماذج في LDraw

أفضل جزء في تنسيق LDraw هو أنه لديه الكثير من المعجبين بين عشاق ليغو. يمكن العثور على العديد من المجموعات المثيرة للاهتمام على الموقع الرسمي omr.ldraw.org ، ولكن بالإضافة إلى ذلك ، يمكن العثور على العديد منها في منتديات منفصلة.

تحدثنا عن التنسيق ، والآن حان الوقت للحديث قليلاً عن البرنامج المساعد لـ Unity.



البرنامج المساعد للوحدة

يوفر البرنامج المساعد القدرة على إنشاء نماذج ثلاثية الأبعاد تستند إلى ملفات LDraw. يمكنك رؤية النتائج في الصور من المقال. هام: إذا كان لديك جهاز ضعيف ، فمن الأفضل فتح مشاهد مصغرة فقط في مجلد العرض التوضيحي. لم يتم تحسين النماذج ودائمًا إنشاء خلفية.

الآن دعنا نتحدث قليلا عن التنفيذ. في الوقت الحالي ، يتم دعم معظم ما سبق.

واحدة من أهم الميزات ربما هي أنظمة الإحداثيات المختلفة. المشكلة هي أن التنسيق هو نظام إحداثي يميني ، في حين أن الوحدة هي نظام إحداثيات يسار. ما يعنيه هذا ، في جوهره ، أن جميع المنعطفات ومصفوفة TRS لن تعمل بشكل صحيح. من السهل التغلب على Y السلبي - نعكس جميع الإحداثيات المتعلقة بـ Vector3.up ونحصل على الإحداثيات الضرورية (اضرب -1). ولكن في حالة مصفوفة TRS ، كل شيء أكثر تعقيدًا. نظرًا لأن التنسيق متكرر ، فمن المستحيل ببساطة عكس المصفوفة ، حيث إن Matrix.Identity ستتحول إلى مصفوفة انعكاس في كل مكان وستعكس كل تداخل نموذجنا على طول المحور Y ، مما سيؤدي إلى عرض غير صحيح (إذا حافظت على مقياس إيجابي). حتى الآن ، توصلت إلى قرار غير صحيح في شكل السماح بمقياس سلبي ، والذي سيتعين إعادة بنائه في الإصدارات المستقبلية.

الميزة الثانية هي اتجاه المثلثات. بالنسبة إلى الكواد ، يتم إدراك أن المثلثات تبدو في اتجاه واحد:

كود التحضير للساحات
 public override void PrepareMeshData(List<int> triangles, List<Vector3> verts) { var v = _Verts; var nA = Vector3.Cross(v[1] - v[0], v[2] - v[0]); var nB = Vector3.Cross(v[1] - v[0], v[2] - v[0]); var vertLen = verts.Count; triangles.AddRange(new[] { vertLen + 1, vertLen + 2, vertLen, vertLen + 1, vertLen + 3, vertLen + 2 }); var indexes = Vector3.Dot(nA, nB) > 0 ? new int[] {0, 1, 3, 2} : new int[] {0, 1, 2, 3}; for (int i = 0; i < indexes.Length; i++) { verts.Add(v[indexes[i]]); } } 


لكن من غير الواضح هنا ، بناءً على التنسيق ، في أي اتجاه يجب أن توجه المثلثات من حيث المبدأ - مهمة غير تافهة. لهذا السبب ، يتم دائمًا إنشاء كلا الجانبين الآن.

بالإضافة إلى ذلك ، نظرًا لحقيقة أن التنسيق تكراري ، فإن النظام الهرمي للوحدة أصبح مفيدًا كما لم يحدث من قبل.

باستخدام التكرار بطريقتين ، نقوم بإنشاء الشبكات التي نحتاج إليها وتطبيق TRS (يمكن العثور على التنفيذ في المقالة السابقة ) ، وبالتالي نحصل على جميع الإزاحات اللازمة بتنسيق مناسب:

طرق لتوليد نموذج على خشبة المسرح
 public class LDrawModel { public GameObject CreateMeshGameObject(Matrix4x4 trs, Material mat = null, Transform parent = null) { if (_Commands.Count == 0) return null; GameObject go = new GameObject(_Name); var triangles = new List<int>(); var verts = new List<Vector3>(); for (int i = 0; i < _Commands.Count; i++) { var sfCommand = _Commands[i] as LDrawSubFile; if (sfCommand == null) { _Commands[i].PrepareMeshData(triangles, verts); } else { sfCommand.GetModelGameObject(go.transform); } } if (mat != null) { var childMrs = go.transform.GetComponentsInChildren<MeshRenderer>(); foreach (var meshRenderer in childMrs) { meshRenderer.material = mat; } } if (verts.Count > 0) { var visualGO = new GameObject("mesh"); visualGO.transform.SetParent(go.transform); var mf = visualGO.AddComponent<MeshFilter>(); mf.sharedMesh = PrepareMesh(verts, triangles); var mr = visualGO.AddComponent<MeshRenderer>(); if (mat != null) { mr.sharedMaterial = mat; } } go.transform.ApplyLocalTRS(trs); go.transform.SetParent(parent); return go; } } public class LDrawSubFile : LDrawCommand { public void GetModelGameObject(Transform parent) { _Model.CreateMeshGameObject(_Matrix, GetMaterial(), parent); } } 


ونتيجة لذلك ، حصلنا على هذه التصورات الجميلة:





انظر مستودع على جيثب لمزيد من التفاصيل.

بشكل عام ، هناك الكثير من الأفكار حول تطوير المكوّن الإضافي ، أريد تقديم وظائف مثل:

  1. تجانس بعض الأشكال
  2. جيل الوجه الأمامي فقط
  3. المنشئ وتحميل النماذج مرة أخرى إلى تنسيق LDraw
  4. التظليل الأبرد للبلاستيك مع التشتت تحت السطحي (ومجموعة المواد المناسبة بشكل عام)
  5. لف الأشعة فوق البنفسجية ل Lightmaps
  6. تحسين النماذج (يتكون معظمها الآن من 500 كيلو + ، وعلى سبيل المثال طراز برج إيفل هو 2.8 مليون مضلع)

ولكن في الوقت الحالي ، يسمح لك البرنامج المساعد باستخدام طرازات من Lego في Unity3d ، وهو أمر رائع جدًا. (تم إنشاء جميع صور المقالة باستخدام المكون الإضافي) يتم نشر رمز المشروع بالكامل تحت رخصة MIT ، لكنني أنصحك بالاطلاع على الترخيص لنماذج محددة على موارد LDraw.

شكرًا لك على اهتمامك ، أتمنى أن تكون قد تعلمت شيئًا جديدًا لنفسك ، وتهتم بالتنسيق والمكون الإضافي! إذا كان هناك وقت ، فسأواصل تطويره وسأكون سعيدًا للمساعدة في هذا الأمر الصعب.

Source: https://habr.com/ru/post/ar433364/


All Articles