WPF 3D- 카메라의 시야에 Modelvisual3D를 맞추십니까?
-
22-08-2019 - |
문제
XML에서 크기가 수입되는 입방체가 있으므로 모델의 크기에 관계없이 카메라가 항상 모든 것을 볼 수 있는지 확인해야합니다. 이것은 미리보기 목적입니다. 명확성을 위해 스케일을 보여주는 상단에 캡션을 렌더링 할 것입니다.
Modelvisual3D가 FieldOfView
카메라 또는 viewport3d 자체의.
지금까지 나는 정적 콜백이 있습니다 (치수 속성은 DependencyProperty
s) 치수 속성이 변경되는 경우 아래와 같이 정의됩니다. 지금은 꽤 조잡하지만 내가보고있는 아이디어를 얻습니다. 주석은 섹션은 내가 찾고있는 논리의 종류를 보여줍니다.
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);
}
}
}
}
제휴하지 않습니다 StackOverflow