محرك ثلاثي الأبعاد - كيفية تقسيم الرأس بشكل صحيح
-
26-09-2019 - |
سؤال
أنا أكتب محرك ثلاثي الأبعاد لـ AS3.0 ... واجهت مشكلة مزعجة. AS3.0 يدعم حاليًا فقط تحويلات صورة نقطية (من الصعب للغاية إدارتها ثلاثية الأبعاد ، وهذا هو السبب في أنني أكتب المحرك) - مما يعني أنه لا يمكنني تحقيق منظور حقيقي حول القمم الكبيرة.
يمكنني القيام بحلقة وتقديم كل بكسل من صورة نقطية استنادًا إلى موضع Z الخاص بها ... لكن هذا شيء أكثر من 1000 مرة مما يمكن أن تفعله معظم أجهزة الكمبيوتر ، لأن المنظور غير خطير ...
لذلك - سيكون الحل - لتقسيم القمة تلقائيًا (وبالتالي لا يتعين على المبرمج / المصمم القيام بذلك) إلى مثلثات أصغر.
للأسف هذا ... متقلبة ...؟ لن تكون التحويلات Affine دقيقة بما فيه الكفاية ، أو ستكون ، لكنها لن تتناسب مع المثلثات الأخرى ... صورة لإظهار:
(صورة ميتة)
كما ترون على الأجزاء الحمراء ، فهي متقلبة للغاية ، وأكثرها ملحوظا في العمود الأوسط الأمامي.
إذا ما الخطأ الذي أفعله؟ كيف يتم ذلك في Sandy ، Aways Aways ، Alternativa على سبيل المثال لا الحصر مع بعض المنظور؟
تعديل 1: الرمز الذي أستخدمه لتحويله إلى مثلثات يشبه هذا:
public static function transformTriangle(bd:BitmapData, pts:Vector.<Point>, gfx:Graphics):void {
var matrix:Matrix = new Matrix();
matrix.tx = pts[0].x;
matrix.ty = pts[0].y;
matrix.a = (pts[1].x - pts[0].x) / bd.width;
matrix.b = (pts[1].y - pts[0].y) / bd.height;
matrix.c = (pts[2].x - pts[0].x) / bd.width;
matrix.d = (pts[2].y - pts[0].y) / bd.height;
gfx.beginBitmapFill(bd, matrix, false, true);
gfx.moveTo(pts[0].x, pts[0].y);
gfx.lineTo(pts[0].x, pts[0].y);
gfx.lineTo(pts[1].x, pts[1].y);
gfx.lineTo(pts[2].x, pts[2].y);
gfx.lineTo(pts[0].x, pts[0].y);
gfx.endFill();
}
تعديل 2: هنا عرض صغير للمحول:
انقر هنا (رابط ميت)
(الأسهم للتحكم في النقاط الزرقاء ، 1-3 لتغيير المقبض المحدد - جرب كل من مفاتيح Numpad و Top Numeric)
المحلول
أعتقد أنه إذا حاولت استخدام DrawTriangles بدلاً من ذلك ، فسيصلح مشكلتك. فيما يلي بعض المنشورات المتعلقة بـ DrawTriangles و Z-sorting حلقة الوصل