WPF 3D - تحديد ما إذا كان يتم قص ModelVisual3D داخل Viewport3D الخاص به

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

سؤال

لدي عرض مكعب داخل ملف Viewport3D وأريد أن أعرف طريقة لمعرفة ما إذا كان كل المكعب مرئيًا للمستخدم.

تحرير: فقط للتوضيح،.. أنا لا أتحدث عن القطع بسبب مسافة الطائرة القريبة/البعيدة هنا.أعني أن المكعب طويل أو عريض ليناسب مجال رؤية الكاميرات.

سيكون موضع تقدير أي مساعدة على نطاق واسع!

شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

لا أستطيع أن أقدم حلاً ولكن ربما أستطيع توجيهك في الاتجاه الصحيح.

ما تحتاج إلى معرفته هو مدى الإسقاط ثنائي الأبعاد للمكعب على مستوى العرض.يمكنك بعد ذلك إجراء فحص بسيط على الحد الأدنى والحد الأقصى لقيم X & Y لمعرفة ما إذا كان المكعب بأكمله مرئيًا أم لا.

ستؤدي إضافة عامل التسامح إلى الحد إلى معالجة أي أخطاء في التقريب.

يحرر:لقد قمت للتو بالبحث في Google عن "عرض ثنائي الأبعاد WPF" وهذا وصلة خطرت.يبدو أنه يتناول ما تريد.

مزيد من التعديل:لقد قمت بنسخ القسم ذي الصلة من الكود من الرابط أعلاه هنا.

public static Rect Get2DBoundingBox(ModelVisual3D mv3d)
{
    bool bOK;

    Matrix3D m = MathUtils.TryWorldToViewportTransform(vpv, out bOK);

    bool bFirst = true;    
    Rect r = new Rect();

    if (mv3d.Content is GeometryModel3D)
    {
        GeometryModel3D gm3d = (GeometryModel3D) mv3d.Content;

        if (gm3d.Geometry is MeshGeometry3D)
        {
            MeshGeometry3D mg3d = (MeshGeometry3D)gm3d.Geometry;

            foreach (Point3D p3d in mg3d.Positions)
            {
                Point3D pb = m.Transform(p3d);
                Point p2d = new Point(pb.X, pb.Y);
                if (bFirst)
                {
                    r = new Rect(p2d, new Size(1, 1));
                    bFirst = false;
                }
                else
                {
                    r.Union(p2d);
                }
            }
        }
    }

    return r;
}

نصائح أخرى

أتذكر برنامجًا تعليميًا حول إعدام الإحباط على رمز الوجه.

Flipcode - إعدام فروستوم

اتمني ان يكون مفيدا.

يمكنني التفكير في القيام بشيء مشابه لهذا:

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

الكود بسيط:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top