سؤال

ولدي متوازي المستطيلات الذي قد يتم استيراد الأبعاد من XML لذلك أنا بحاجة للتأكد من أن بغض النظر عن حجم النموذج، والكاميرا يمكن أن يرى دائما كل ذلك. هذا هو لأغراض المعاينة. سوف المرجح أن يجعل توضيحية على الجزء العلوي يظهر مقياس الوضوح.

وأعتقد أنني بحاجة إلى بعض الوظائف التي سوف تقول لي ما إذا كان ModelVisual3D تناسبها داخل حدود FieldOfView من الكاميرا أو ربما ViewPort3D نفسها.

وحتى الآن لدي رد ثابت (خصائص البعد هي DependencyPropertys) عندما تتغير أبعاد خصائص تحدد على النحو التالي. انها جميلة الخام في الوقت الحالي ولكن يمكنك الحصول على فكرة أنا أبحث في. يظهر مقطع علق بها ما يقرب من أي نوع من المنطق أنا أبحث عن

    private static void OnCubeDimensionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (!valueSemaphore)
        {
            //while(mainModel.WillClip(mainCamera))
            //{
            //     mainCamera.FieldOfView--;
            //}

            valueSemaphore = true;
            double propertyValue = 0.0;
            Product3D p = d as Product3D;

            switch (e.Property.Name)
            {
                case "CubeHeight":
                    propertyValue = (double.Parse(e.NewValue.ToString()) / 100) * 8;
                    p.CubeHeight = propertyValue;
                    break;
                case "CubeWidth":
                    propertyValue = (double.Parse(e.NewValue.ToString()) / 100) * 5.3;
                    p.CubeWidth = propertyValue;
                    break;
                case "CubeDepth":
                    propertyValue = (double.Parse(e.NewValue.ToString()) / 100) * 2.6;
                    p.CubeDepth = propertyValue;
                    break;
            }
            valueSemaphore = false;
        }
    }

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

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

المحلول

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

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

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

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);
                }
            }
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top