namespace Yw.WpfUI.Hydro
{
///
/// 绘制相机辅助类
///
internal class DrawCameraHelper : IDisposable
{
///
///
///
public DrawCameraHelper
(
HelixViewport3D viewport,
DrawInitialHelper initialHelper
)
{
_viewport = viewport;
_initialHelper = initialHelper;
Attach();
}
private readonly HelixViewport3D _viewport = null;//三维组件
private readonly DrawInitialHelper _initialHelper = null;//初始化辅助类
///
/// 是否启用
///
public bool Enabled
{
get { return _enabled; }
set { _enabled = value; }
}
private bool _enabled = true;
///
/// 是否初始化
///
public bool Initialized
{
get { return _initialized; }
private set { _initialized = value; }
}
private bool _initialized = false;
//初始化
private void Initialize()
{
if (!_initialHelper.Initialized)
{
return;
}
_initialized = true;
}
//处理初始化完成
private void OnInitialCompleted()
{
Initialize();
}
#region 视图操作
///
/// 获取视图
///
public CameraSettingL3d GetView()
{
if (!Initialized)
{
return default;
}
var cameraSetting = new CameraSetting(_viewport.Camera);
return cameraSetting.ToCameraSettingL3d();
}
///
/// 设置视图
///
public void SetView(CameraSettingL3d cameraSetting)
{
if (!Initialized)
{
return;
}
if (cameraSetting == null)
{
return;
}
var camera = _viewport.Camera;
camera.NearPlaneDistance = cameraSetting.NearPlaneDistance;
camera.FarPlaneDistance = cameraSetting.FarPlaneDistance;
camera.Position = cameraSetting.Position.ToPoint3D();
camera.LookDirection = cameraSetting.LookDirection.ToVector3D();
camera.UpDirection = cameraSetting.UpDirection.ToVector3D();
if (camera is PerspectiveCamera perspectiveCamera)
{
perspectiveCamera.FieldOfView = cameraSetting.FieldOfView;
}
else if (camera is OrthographicCamera orghographicCamera)
{
orghographicCamera.Width = cameraSetting.Width;
}
}
#endregion
#region 六视图
///
/// 设置上视图
///
public void SetTopView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, 0, -1); // 向下看
var upDirection = new Vector3D(0, 1, 0);// Y轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置下视图
///
public void SetBottomView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, 0, 1); // 向上看
var upDirection = new Vector3D(0, 1, 0);// Y轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置左视图
///
public void SetLeftView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(1, 0, 0); // 向右看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置右视图
///
public void SetRightView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(-1, 0, 0); // 向左看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置前视图
///
public void SetFrontView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, 1, 0); // 向后看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置后视图
///
public void SetBackView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, -1, 0); // 向前看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
#endregion
#region 等轴视图
///
/// 西南视角
/// 从物体的左前下方观察
///
public void SetSouthWestView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(1, 1, -1);
var upDirection = new Vector3D(0, 0, 1);
_viewport.FitView(lookDirection, upDirection);
}
///
/// 东南视角
/// 从物体的右前下方观察
///
public void SetSouthEastView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(-1, 1, -1);
var upDirection = new Vector3D(0, 0, 1);
_viewport.FitView(lookDirection, upDirection);
}
///
/// 东北视角
/// 从物体的右后上方观察
///
public void SetNorthEastView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(-1, -1, -1);
var upDirection = new Vector3D(0, 0, 1);
_viewport.FitView(lookDirection, upDirection);
}
///
/// 西北视角
/// 从物体的左后上方观察
///
public void SetNorthWestView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(1, -1, -1);
var upDirection = new Vector3D(0, 0, 1);
_viewport.FitView(lookDirection, upDirection);
}
#endregion
#region 默认视图
///
/// 显示默认视图
///
public bool ShowDefaultView()
{
if (!Initialized)
{
return false;
}
var cameraSetting = _initialHelper.GetDefaultCameraSetting();
if (cameraSetting == null)
{
return false;
}
SetView(cameraSetting);
return true;
}
#endregion
//处理鼠标双击事件
private void OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton != MouseButton.Left)
{
return;
}
if (!Enabled)
{
return;
}
var bol = ShowDefaultView();
if (bol)
{
return;
}
SetSouthWestView();
}
//附加
private void Attach()
{
_viewport.MouseDoubleClick += OnMouseDoubleClick;
_initialHelper.InitialCompletedEvent += OnInitialCompleted;
}
//分离
private void Detach()
{
_viewport.MouseDoubleClick -= OnMouseDoubleClick;
_initialHelper.InitialCompletedEvent -= OnInitialCompleted;
}
///
/// 释放
///
public void Dispose()
{
Detach();
}
}
}