문제

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 투영 정도입니다. 그런 다음 Min 및 Max 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