محرك ثلاثي الأبعاد - كيفية تقسيم الرأس بشكل صحيح

StackOverflow https://stackoverflow.com/questions/4234063

  •  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 حلقة الوصل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top