WPF 3D- Modelvisual3D가 viewport3d 내부에 클리핑되는지 여부
-
22-08-2019 - |
문제
큐브 렌더링이 있습니다 Viewport3D
그리고 모든 큐브가 사용자에게 보이는지 알아내는 방법을 알아야합니다.
편집 : 명확하게 .. 나는 여기에서 가까운/먼 비행기 거리 때문에 클리핑에 대해 이야기하고 있지 않습니다. 큐브가 카메라 필드에 맞게 키가 크거나 넓다는 것을 의미합니다.
모든 도움이 대단히 감사하겠습니다!
미리 감사드립니다.
해결책
나는 해결책을 제공 할 수 없지만 아마도 당신을 올바른 방향으로 가리킬 수 있습니다.
당신이 잡아야 할 것은 뷰 평면에서 큐브의 2D 투영 정도입니다. 그런 다음 Min 및 Max X & Y 값에 대해 간단한 점검을 수행하여 큐브 전체가 보이는지 확인할 수 있습니다.
범위까지 공차 계수를 추가하면 반올림 오류가 필요합니다.
편집 : 방금 "2D Projection 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;
}
다른 팁
나는 이것과 비슷한 일을한다고 생각할 수 있습니다.
카메라와 관련된 큐브의 가장 가까운 지점을 확인하고 가까운 클리핑 평면에서 클립되어 있는지 확인하십시오. 내가 생각할 수있는 카메라에서 가장 가까운 지점은 큐브를 구성하는이 지점 중 하나입니다. 따라서 큐브의 6 지점 각각을 확인하고 클리핑 중인지 확인해야합니다. 그들 중 어느 것도 없다면, 당신의 큐브는 완전히 보이면 큐브를, 그리고 분명히 멀리 클리핑 평면에 대해서도 확인해야합니다.
코드는 간단합니다.
for each point of cube do
if !(point is in farClippingPlane and nearClippingPlane)
return false;
end if
end for
return true