我有一个长方体,其尺寸是从 XML 导入的,因此我需要确保无论模型大小如何,相机始终可以看到所有模型。这是出于预览目的。为了清晰起见,我可能会在顶部渲染一个标题,显示比例。
我想我需要一些函数来告诉我 ModelVisual3D 是否适合相机的 FieldOfView
边界,或者可能是 ViewPort3D 本身。
到目前为止,当维度属性更改时,我有静态回调(维度属性是 DependencyProperty),定义如下。目前还很粗糙,但你明白我正在考虑的想法。注释掉的部分大致显示了我正在寻找什么样的逻辑
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;
}
}
如果有人知道注释掉的部分应该放在哪里,我将永远感激不已。
提前致谢。
最佳答案
您需要掌握立方体在 View 平面上的二维投影的范围。然后,您可以对最小和最大 X 和 Y 值进行简单检查,以查看整个立方体是否可见。
在范围内添加容差因子将解决任何舍入误差。
我已经从here复制了看起来是相关的代码部分。 。然后您可以相应地设置视口(viewport)的大小。
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);
}
}
}
}
关于WPF 3D - 将 ModelVisual3D 放入相机的视野中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/709039/