using DevExpress.Mvvm.Native;
|
using DevExpress.XtraCharts.GLGraphics;
|
using SharpGL;
|
|
namespace Yw.WinFrmUI.HydroL3d
|
{
|
public partial class NetworkPanelDebug : DevExpress.XtraEditors.XtraUserControl
|
{
|
public NetworkPanelDebug()
|
{
|
InitializeComponent();
|
}
|
|
|
private Network _network = null;//管网
|
private NetworkParas _paras = null;//参数
|
|
/// <summary>
|
/// 是否初始化
|
/// </summary>
|
public bool Initialized => _network != null;
|
|
|
/// <summary>
|
/// 初始化
|
/// </summary>
|
public virtual void Initial(Network network)
|
{
|
_network = network;
|
_paras = new NetworkParas();
|
_paras.BoundingBox = _network.GetBoundingBox();
|
_paras.Ceneter = _paras.BoundingBox.GetCenter();
|
_paras.Rotation = new Point3d();
|
_paras.Translation = new Point3d();
|
_paras.Perspective = new Perspective3d()
|
{
|
Fovy = 60f,
|
Aspect = this.openGLControl1.Width / (float)this.openGLControl1.Height,
|
Near = 5,
|
Far = 100
|
};
|
_paras.LookAt = new LookAt3d()
|
{
|
Eye = new Point3d(),
|
Center = new Point3d(),
|
Up = new Point3d()
|
};
|
this.propertyGridControl1.SelectedObject = _paras;
|
}
|
|
private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
OpenGL gl = openGLControl1.OpenGL;
|
gl.Enable(OpenGL.GL_DEPTH_TEST);
|
|
//清除深度缓存
|
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
|
|
// 设置当前矩阵模式,对投影矩阵应用随后的矩阵操作
|
gl.MatrixMode(OpenGL.GL_PROJECTION);
|
|
// 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
|
gl.LoadIdentity();
|
|
// 创建透视投影变换
|
gl.Perspective(45f, openGLControl1.Width / openGLControl1.Height, 15696f, 38395f);
|
|
|
// 设置当前矩阵为模型视图矩阵
|
gl.MatrixMode(OpenGL.GL_MODELVIEW);
|
|
//重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
|
gl.LoadIdentity();
|
|
// gl.Translate(-_paras.Ceneter.X, -_paras.Ceneter.Y, -_paras.Ceneter.Z);
|
//gl.Translate(0, 0, -5f);
|
|
//gl.Rotate(_paras.Rotation.X, 1, 0, 0);
|
// gl.Rotate(_paras.Rotation.Y, 0, 1, 0);
|
//gl.Rotate(_paras.Rotation.Z, 0, 0, 1);
|
|
gl.Color(1.0f, 1.0f, 1.0f);
|
foreach (var pipe in _network.Pipes)
|
{
|
var startPosition = pipe.StartPosition;
|
var endPosition = pipe.EndPosition;
|
gl.Begin(OpenGL.GL_LINES);
|
|
gl.Vertex(startPosition.X, startPosition.Y, startPosition.Z);//左顶点
|
gl.Vertex(endPosition.X, endPosition.Y, endPosition.Z);//右顶点
|
gl.End();
|
}
|
|
gl.Color(1.0f, 1.0f, 1.0f);
|
gl.Begin(OpenGL.GL_LINES);
|
|
gl.Vertex(_paras.BoundingBox.Min.X, _paras.BoundingBox.Min.Y, _paras.BoundingBox.Min.Z);//左顶点
|
gl.Vertex(_paras.BoundingBox.Max.X, _paras.BoundingBox.Max.Y, _paras.BoundingBox.Max.Z);//右顶点
|
gl.End();
|
|
#region 点到线
|
gl.Begin(OpenGL.GL_LINES);
|
gl.Color(1.0f, 1.0f, 1.0f);
|
gl.Vertex(-2.0f, 0.0f, 0.0f);//左顶点
|
gl.Vertex(2.0f, 2.0f, 0.0f);//右顶点
|
gl.End();
|
#endregion
|
|
var minX = _paras.BoundingBox.Min.X;
|
var maxX = _paras.BoundingBox.Max.X;
|
var minY = _paras.BoundingBox.Min.Y;
|
var maxY = _paras.BoundingBox.Max.Y;
|
var minZ = _paras.BoundingBox.Min.Z;
|
var maxZ = _paras.BoundingBox.Max.Z;
|
|
float distance = Math.Max(maxX - minX, Math.Max(maxY - minY, maxZ - minZ)) * 1.5f;
|
|
var centerX = (minX + maxX) / 2f;
|
var centerY = (minY + maxY) / 2f;
|
var centerZ = (minZ + maxZ) / 2f;
|
|
var cameraX = centerX + distance;
|
var cameraY = centerY + distance;
|
var cameraZ = centerZ + distance;
|
|
//gl.LookAt(cameraX, cameraY, cameraZ, centerX, centerY, centerZ, 0, 1, 0);
|
gl.LookAt(-27484f, -12576f, 8833f, 23675f, 23079f, -7200f, 0f, 0f, 1f);
|
gl.Flush(); //强制刷新
|
|
}
|
|
private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
|
{
|
OpenGL gl = openGLControl1.OpenGL;
|
gl.ClearColor(0, 0, 0, 0);
|
}
|
|
|
private void openGLControl1_Resized(object sender, EventArgs e)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
// _paras.Perspective.Aspect = this.openGLControl1.Width / (float)this.openGLControl1.Height;
|
//Reset();
|
}
|
|
//重置
|
private void Reset()
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
OpenGL gl = openGLControl1.OpenGL;
|
|
// 设置当前矩阵模式,对投影矩阵应用随后的矩阵操作
|
gl.MatrixMode(OpenGL.GL_PROJECTION);
|
|
// 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
|
gl.LoadIdentity();
|
|
// 创建透视投影变换
|
gl.Perspective(_paras.Perspective.Fovy, _paras.Perspective.Aspect, _paras.Perspective.Near, _paras.Perspective.Far);
|
|
// 视点变换
|
// gl.LookAt(_paras.LookAt.Eye.X, _paras.LookAt.Eye.Y, _paras.LookAt.Eye.Z, _paras.LookAt.Center.X, _paras.LookAt.Center.Y, _paras.LookAt.Center.Z, _paras.LookAt.Up.X, _paras.LookAt.Up.Y, _paras.LookAt.Up.Z);
|
|
// 设置当前矩阵为模型视图矩阵
|
gl.MatrixMode(OpenGL.GL_MODELVIEW);
|
}
|
|
private void propertyGridControl1_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
//Reset();
|
}
|
}
|
}
|