Мне нужно Viewport3D
с единственной целью выполнения геометрических расчетов с использованием Petzold.Media3D.ViewportInfo
. Я бы предпочел не помещать его в Window
или иным образом отображать его.
Я пытаюсь сделать это, создав экземпляр Viewport3D
и установив несколько свойств, используя следующий метод C #:
private Viewport3D CreateViewport(MainSettings settings)
{
var cameraPosition = new Point3D(0, 0, settings.CameraHeight);
var cameraLookDirection = new Vector3D(0, 0, -1);
var cameraUpDirection = new Vector3D(0, 1, 0);
var camera = new PerspectiveCamera
{
Position = cameraPosition,
LookDirection = cameraLookDirection,
UpDirection = cameraUpDirection
};
var viewport = new Viewport3D
{
Camera = camera,
Width = settings.ViewportWidth,
Height = settings.ViewportHeight
};
return viewport;
}
Позже я пытаюсь использовать этот видовой экран для преобразования местоположения мыши в трехмерное местоположение, используя этот метод:
public Point3D? Point2dToPoint3d(Point point)
{
var range = new LineRange();
var isValid = ViewportInfo.Point2DtoPoint3D(_viewport, point, out range);
if (isValid)
return range.PointFromZ(0);
else
return null;
}
К сожалению, это не работает. Я думаю, причина в том, что ActualWidth
и ActualHeight
области просмотра оба равны нулю (и это свойства только для чтения, поэтому я не могу установить их вручную). (Примечание: я тестировал точно такой же метод с фактическим отрисованным Viewport3D
, и он работал нормально, поэтому я знаю, что проблема не в моем методе конвертации.)
Есть идеи, как заставить WPF назначить ActualWidth
и ActualHeight
элемента управления на основе настроек Width
и Height
?
Я попытался установить HorizontalAlignment
и VerticalAlignment
на Left
и Top
, соответственно, и я также перепутал с MinWidth
и MinHeight
, но ни одно из этих свойств не влияло на ActualWidth
или ActualHeight
.