WPF 3D - 适合ModelVisual3D进入视摄像头的视野?
-
22-08-2019 - |
题
我谁的尺寸是从XML进口的,所以我需要确保,无论什么型号的大小,相机总能看到这一切长方体。这是预览的目的。我很可能会呈现字幕以上示出,为了清楚起见规模顶部。
我想我需要一些功能,它会告诉我的ModelVisual3D是否符合相机或也许是的Viewport3D本身的FieldOfView
的范围内。
到目前为止我有静态回调(尺寸属性是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投影的程度保持。然后,您可以做的最小和最大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