lixiaojun
2024-09-24 5610ef481946ff15d856f65e08b3f25aeaf3e269
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
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();
        }
    }
}