WPF 3D – определите, обрезается ли ModelVisual3D внутри его Viewport3D
-
22-08-2019 - |
Вопрос
У меня есть рендеринг куба внутри Viewport3D
и мне нужно знать способ узнать, виден ли ВЕСЬ куб пользователю.
Редактировать: Чтобы внести ясность... Я не говорю об отсечении из-за расстояния между ближней и дальней плоскостями.Я имею в виду, что куб слишком высокий или широкий, чтобы поместиться в поле зрения камеры.
Любая помощь будет оценена по достоинству!
Заранее спасибо.
Решение
Я не могу предложить решение, но, возможно, смогу указать вам правильное направление.
Что вам нужно, так это размер 2D-проекции куба на плоскость просмотра.Затем вы можете выполнить простую проверку минимального и максимального значений X и Y, чтобы увидеть, виден ли весь куб.
Добавление коэффициента допуска позволит устранить любые ошибки округления.
РЕДАКТИРОВАТЬ:Я только что выполнил поиск в Google по запросу «2D-проекция WPF», и это связь подошел.Похоже, это соответствует тому, что вы хотите.
ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ:Я скопировал соответствующий раздел кода из приведенной выше ссылки здесь.
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);
}
}
}
}
return r;
}
Другие советы
Я помню урок по отсеиванию усеченной пирамиды на флипкоде.
Flipcode — отсечение усеченной пирамиды
Я надеюсь, что это помогает.
Я могу подумать о том, чтобы сделать что-то подобное:
Проверьте ближайшую точку куба, связанную с камерой, и проверьте, не отсекается ли она от ближней плоскости отсечения.Ближайшая точка от камеры, о которой я могу думать, — это одна из точек, составляющих куб.Итак, вам придется проверить каждую из 6 точек куба и проверить, не обрезаются ли они.Если никто из них не является, то ваш куб, если полностью видимый OH, и, очевидно, вам также нужно проверить на плоскости от дальней отсечки.
Код прост:
for each point of cube do
if !(point is in farClippingPlane and nearClippingPlane)
return false;
end if
end for
return true