386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
1

Работа с TaoFramework

13.11.2015, 09:00. Показов 12383. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Многие думают, что программирование графики на Vb.net ограничено только применением MS XNA, но это заблуждение. В этой теме я расскажу, как установить и подключить TaoFramework, а так же приведу несколько примеров работы с ним. Примеры были взяты с одного сайта, и переведены мною с C# на Vb.net. Итак, начнем.

Tao Framework – это свободно-распространяемая библиотека с открытым исходным кодом, предназначенная для быстрой и удобной разработки кросс-платформенного мультимедийного программного обеспечения в среде .NET Framewrok и Mono. На сегодняшний день Tao Framework - это лучший путь для использования библиотеки OpenGL при разработке в среде .NET на языке Vb.net.

Установка Tao Framework
Требуется NET Framework не ниже 3.5 SP1. Процесс установки сводится в основном к нажатию кнопки далее, единственный важный момент, должны быть установлены галочки на пунктах Register assemblies in Global Assembly Cache(GAC) и install Windows dll dependencies. После этого шага начнется исталляция файлов, по завершению которой Tao Framework готов к работе. Также скопируйте файлы из директории
C:\Programm Files\TaoFramework\lib в папку C:\Windows\System32
Если нужно перенести проект на компьютер без установленного Tao Framework:
Из папки C:\\Program Files\TaoFramework\bin\ в папку с проектом необходимо переместить следующие файлы:
• Tao.OpenGl.dll
• Tao.Platform.Windows.dll
• Tao.FreeGlut.dll
а также следующие файлы из папки C:\\Program Files\TaoFramework\lib\:
• freeglut.dll
А затем попробовать запустить проект на компьютере без Tao.
При использовании дополнительных библиотек (например, DevIL и др.) количество dll, которые надо переносить, соответственно увеличивается.

Создание проекта и подключение библиотеки Tao OpenGL
Сначала создайте новый проект, в качестве шаблона установив приложение Windows Forms. Добавьте ссылки на OpenGL.dll, Tao.FreeGlut.dll, Tao.Platform.Windows.dll. Эти файлы располагаются в C:\Programm Files\TaoFramework\bin.

VB.NET
1
2
3
4
5
6
// для работы с библиотекой OpenGL 
imports Tao.OpenGl; 
// для работы с библиотекой FreeGLUT 
imports Tao.FreeGlut; 
// для работы с элементом управления SimpleOpenGLControl 
imports Tao.Platform.Windows;
Теперь вернитесь к конструктору диалогового окна и перейдите к окну Toolbox (Панель элементов). Щелкните правой кнопкой на вкладке «Общие», и в раскрывшемся контекстном меню выберите пункт «Выбрать элементы». В открывшемся окне найдите элемент SimpleOpenGLControl и установите возле него галочку. Затем нажмите ОК. Теперь данный элемент станет доступным для размещения на форме приложения.

Инициализация OpenGL в VB .NET
VB.NET
1
2
3
4
public Form1() 
  InitializeComponent(); 
  SimpleOpenGLControl1.InitializeContexts();
}
Если у вас SimpleOpenGLControl отсутствует в списке.
Для того чтобы добавить в Панель Элементов (Toolbox) элемент SimpleOpenGLControl, необходимо следующее:

1. Нажимаем правой кнопкой по вкладке «Общие» в Панели Элементов и выбираем «Выбор Элементов»
2. В открывшемся окне обнаруживаем отсутствие SimpleOpenGLControl.
3. Нажимаем кнопку «Обзор» и находим файл библиотеки C:\Program Files\TaoFramework\bin\Tao.Platform.Windows.dll.
4. Добавляем.
4
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2015, 09:00
Ответы с готовыми решениями:

TaoFramework вывод символов
Таким образом вывожу текст, но только без русских букв, а хотелось бы с ними. Помогите кто может...

Опять TaoFramework
Здравствуйте! Подскажите, как мне прилепить текстуру-изображение из файла на объект? Дело в том,...

Использование TaoFramework
Здравствуйте! Использую TaoFramework для работы с OpenGL. Уже почти дописал проект, но не могу...

TaoFramework и windows mobile
Подскажите, могу ли я, используя TaoFramework, написать приложение под WindowsMobile и как это...

8
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
13.11.2015, 09:02  [ТС] 2
Пример1. Визуализация 2D примитивов.
Кликните здесь для просмотра всего текста
VB.NET
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
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
' для работы с библиотекой OpenGL 
Imports Tao.OpenGl
' для работы с библиотекой FreeGLUT 
Imports Tao.FreeGlut
' для работы с элементом управления SimpleOpenGLControl 
Imports Tao.Platform.Windows
 
 
Public Partial Class Form1
    Inherits Form
    Public Sub New()
        InitializeComponent()
            'инициализация огл
        AnT.InitializeContexts()
    End Sub
 
 
    Private Sub Form1_Load(sender As Object, e As EventArgs)
        ' инициализация Glut 
        Glut.glutInit()
        Glut.glutInitDisplayMode(Glut.GLUT_RGB Or Glut.GLUT_DOUBLE Or Glut.GLUT_DEPTH)
 
        ' отчитка окна 
        Gl.glClearColor(255, 255, 255, 1)
 
        ' установка порта вывода в соответствии с размерами элемента anT 
        Gl.glViewport(0, 0, AnT.Width, AnT.Height)
 
 
        ' настройка проекции 
        Gl.glMatrixMode(Gl.GL_PROJECTION)
        Gl.glLoadIdentity()
        Glu.gluPerspective(45, CSng(AnT.Width) / CSng(AnT.Height), 0.1, 200)
        Gl.glMatrixMode(Gl.GL_MODELVIEW)
        Gl.glLoadIdentity()
 
        ' настройка параметров OpenGL для визуализации 
        Gl.glEnable(Gl.GL_DEPTH_TEST)
 
    End Sub
 
    Private Sub Button1Click(sender As Object, e As EventArgs)
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
 
        Gl.glLoadIdentity()
        Gl.glColor3f(1F, 0, 0)
 
        Gl.glPushMatrix()
        Gl.glTranslated(0, 0, -6)
        Gl.glRotated(45, 1, 1, 0)
 
        ' рисуем чайник с помощью библиотеки FreeGLUT 
        Glut.glutWireTeapot(3)
 
        Gl.glPopMatrix()
        Gl.glFlush()
        AnT.Invalidate()
    End Sub
 
End Class
Вложения
Тип файла: zip Пример1.zip (45.8 Кб, 62 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
13.11.2015, 09:03  [ТС] 3
Пример2. График функций.
Кликните здесь для просмотра всего текста
VB.NET
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
 
' для работы с библиотекой OpenGL 
Imports Tao.OpenGl
' для работы с библиотекой FreeGLUT 
Imports Tao.FreeGlut
' для работы с элементом управления SimpleOpenGLControl 
Imports Tao.Platform.Windows
 
Public Partial Class Form1
    Inherits Form
    ' размеры окна 
    Private ScreenW As Double, ScreenH As Double
 
    ' отношения сторон окна визуализации 
    ' для корректного перевода координат мыши в координаты, 
    ' принятые в программе 
    Private devX As Single
    Private devY As Single
 
    ' массив, который будет хранить значения x,y точек графика 
    Private GrapValuesArray As Single(,)
    ' количество элементов в массиве 
    Private elements_count As Integer = 0
 
    ' флаг, означающий, что массив с значениями координат графика пока еще не заполнен 
    Private not_calculate As Boolean = True
 
    ' номер ячейки массива, из которой будут взяты координаты для красной точки 
    ' для визуализации текущего кадра 
    Private pointPosition As Integer = 0
 
    ' вспомогательные переменные для построения линий от курсора мыши к координатным осям 
    Private lineX As Single, lineY As Single
 
    ' текущение координаты курсора мыши 
    Private Mcoord_X As Single = 0, Mcoord_Y As Single = 0
 
    Public Sub New()
        InitializeComponent()
        AnT.InitializeContexts()
    End Sub
 
    Private Sub PointInGrap_Tick(sender As Object, e As EventArgs)
        ' если мы дошли до последнего элемента массива 
        If pointPosition = elements_count - 1 Then
            pointPosition = 0
        End If
        ' переходим к начальному элементу 
        ' функция визуализации 
        Draw()
 
        ' переход к следующему элементу массива 
        pointPosition += 1
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs)
        ' инициализация библиотеки glut 
        Glut.glutInit()
 
        ' инициализация режима экрана 
        Glut.glutInitDisplayMode(Glut.GLUT_RGB Or Glut.GLUT_DOUBLE)
 
        ' установка цвета очистки экрана (RGBA) 
        Gl.glClearColor(255, 255, 255, 1)
 
        ' установка порта вывода 
        Gl.glViewport(0, 0, AnT.Width, AnT.Height)
 
        ' активация проекционной матрицы 
        Gl.glMatrixMode(Gl.GL_PROJECTION)
        ' очистка матрицы 
        Gl.glLoadIdentity()
 
        ' определение параметров настройки проекции в зависимости от размеров сторон элемента AnT. 
        If CSng(AnT.Width) <= CSng(AnT.Height) Then
            ScreenW = 30.0
            ScreenH = 30.0 * CSng(AnT.Height) / CSng(AnT.Width)
            Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH)
        Else
            ScreenW = 30.0 * CSng(AnT.Width) / CSng(AnT.Height)
            ScreenH = 30.0
            Glu.gluOrtho2D(0.0, 30.0 * CSng(AnT.Width) / CSng(AnT.Height), 0.0, 30.0)
        End If
 
        ' сохранение коэффициентов, которые нам необходимы для перевода координат указателя в оконной системе в координаты, 
        ' принятые в нашей OpenGL сцене 
        devX = CSng(ScreenW) / CSng(AnT.Width)
        devY = CSng(ScreenH) / CSng(AnT.Height)
 
        ' установка объектно-видовой матрицы 
        Gl.glMatrixMode(Gl.GL_MODELVIEW)
 
        ' старт счетчика, отвечающего за вызов функции визуализации сцены 
        PointInGrap.Start()
    End Sub
 
    Private Sub AnT_MouseMove(sender As Object, e As MouseEventArgs)
        ' сохраняем координаты мыши 
        Mcoord_X = e.X
        Mcoord_Y = e.Y
 
        ' вычисляем параметры для будущей дорисовки линий от указателя мыши к координатным осям. 
        lineX = devX * e.X
        lineY = CSng(ScreenH - devY * e.Y)
    End Sub
 
    ' функция визуализации текста 
    Private Sub PrintText2D(x As Single, y As Single, text As String)
 
        ' устанавливаем позицию вывода растровых символов 
        ' в переданных координатах x и y. 
        Gl.glRasterPos2f(x, y)
 
        ' в цикле foreach перебираем значения из массива text, 
        ' который содержит значение строки для визуализации 
        For Each char_for_draw As Char In text
            ' символ C визуализируем с помощью функции glutBitmapCharacter, используя шрифт GLUT_BITMAP_9_BY_15. 
            Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_9_BY_15, AscW(char_for_draw))
        Next
 
    End Sub
 
 
    ' функция, производящая вычисления координат графика 
    ' и заносящая их в массив GrapValuesArray 
    Private Sub functionCalculation()
 
        ' определение локальных переменных X и Y 
        Dim x As Single = 0, y As Single = 0
 
        ' инициализация массива, который будет хранить значение 300 точек, 
        ' из которых будет состоять график 
 
        GrapValuesArray = New Single(299, 1) {}
 
        ' счетчик элементов массива 
        elements_count = 0
 
        ' вычисления всех значений y для x, принадлежащего промежутку от -15 до 15 с шагом в 0.01f 
        x = -15
        While x < 15
            ' вычисление y для текущего x 
            ' по формуле y = (float)Math.Sin(x)*3 + 1; 
            ' эта строка задает формулу, описывающую график функции для нашего уравнения y = f(x). 
            y = CSng(Math.Sin(x)) * 3 + 1
 
            ' запись координаты x 
            GrapValuesArray(elements_count, 0) = x
            ' запись координаты y 
            GrapValuesArray(elements_count, 1) = y
            ' подсчет элементов 
 
            elements_count += 1
            x += 0.1F
        End While
 
        ' изменяем флаг, сигнализировавший о том, что координаты графика не вычислены 
        not_calculate = False
    End Sub
 
    ' визуализация графика 
    Private Sub DrawDiagram()
 
        ' проверка флага, сигнализирующего о том, что координаты графика вычислены 
        If not_calculate Then
            ' если нет, то вызываем функцию вычисления координат графика 
            functionCalculation()
        End If
 
        ' стартуем отрисовку в режиме визуализации точек 
        ' объединяемых в линии (GL_LINE_STRIP) 
        Gl.glBegin(Gl.GL_LINE_STRIP)
 
        ' рисуем начальную точку 
        Gl.glVertex2d(GrapValuesArray(0, 0), GrapValuesArray(0, 1))
 
        ' проходим по массиву с координатами вычисленных точек 
        For ax As Integer = 1 To elements_count - 1 Step 2
            ' передаем в OpenGL информацию о вершине, участвующей в построении линий 
            Gl.glVertex2d(GrapValuesArray(ax, 0), GrapValuesArray(ax, 1))
        Next
 
        ' завершаем режим рисования 
        Gl.glEnd()
 
        ' устанавливаем размер точек, равный 5 пикселям 
        Gl.glPointSize(5)
        ' устанавливаем текущим цветом - красный цвет 
        Gl.glColor3f(255, 0, 0)
        ' активируем режим вывода точек (GL_POINTS) 
        Gl.glBegin(Gl.GL_POINTS)
        ' выводим красную точку, используя ту ячейку массива, до которой мы дошли (вычисляется в функции обработчике событий таймера) 
        Gl.glVertex2d(GrapValuesArray(pointPosition, 0), GrapValuesArray(pointPosition, 1))
        ' завершаем режим рисования 
        Gl.glEnd()
        ' устанавливаем размер точек равный единице 
        Gl.glPointSize(1)
 
    End Sub
 
    ' функция, управляющая визуализацией сцены 
    Private Sub Draw()
 
        ' очистка буфера цвета и буфера глубины 
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
 
        ' очищение текущей матрицы 
        Gl.glLoadIdentity()
 
        ' установка черного цвета 
        Gl.glColor3f(0, 0, 0)
 
        ' помещаем состояние матрицы в стек матриц 
        Gl.glPushMatrix()
 
        ' выполняем перемещение в пространстве по осям X и Y 
        Gl.glTranslated(15, 15, 0)
 
        ' активируем режим рисования (Указанные далее точки будут выводиться как точки GL_POINTS) 
        Gl.glBegin(Gl.GL_POINTS)
 
        ' с помощью прохода вдумя циклами, создаем сетку из точек 
        For ax As Integer = -15 To 14
            For bx As Integer = -15 To 14
                ' вывод точки 
                Gl.glVertex2d(ax, bx)
            Next
        Next
 
        ' завершение режима рисования примитивов 
        Gl.glEnd()
 
        ' активируем режим рисования, каждые 2 последовательно вызванные команды glVertex 
        ' объединяются в линии 
        Gl.glBegin(Gl.GL_LINES)
 
        ' далее мы рисуем координатные оси и стрелки на их концах 
        Gl.glVertex2d(0, -15)
        Gl.glVertex2d(0, 15)
 
        Gl.glVertex2d(-15, 0)
        Gl.glVertex2d(15, 0)
 
        ' вертикальная стрелка 
        Gl.glVertex2d(0, 15)
        Gl.glVertex2d(0.1, 14.5)
        Gl.glVertex2d(0, 15)
        Gl.glVertex2d(-0.1, 14.5)
 
        ' горизонтальная трелка 
        Gl.glVertex2d(15, 0)
        Gl.glVertex2d(14.5, 0.1)
        Gl.glVertex2d(15, 0)
        Gl.glVertex2d(14.5, -0.1)
 
        ' завершаем режим рисования 
        Gl.glEnd()
 
        ' выводим подписи осей "x" и "y" 
        PrintText2D(15.5F, 0, "x")
        PrintText2D(0.5F, 14.5F, "y")
 
        ' вызываем функцию рисования графика 
        DrawDiagram()
 
        ' возвращаем матрицу из стека 
        Gl.glPopMatrix()
 
        ' выводим текст со значением координат возле курсора 
        PrintText2D(devX * Mcoord_X + 0.2F, CSng(ScreenH) - devY * Mcoord_Y + 0.4F, "[ x: " & (devX * Mcoord_X - 15).ToString() & " ; y: " & (CSng(ScreenH) - devY * Mcoord_Y - 15).ToString() & "]")
 
        ' устанавливаем красный цвет 
        Gl.glColor3f(255, 0, 0)
 
        ' включаем режим рисования линий, для того чтобы нарисовать 
        ' линии от курсора мыши к координатным осям 
        Gl.glBegin(Gl.GL_LINES)
 
        Gl.glVertex2d(lineX, 15)
        Gl.glVertex2d(lineX, lineY)
        Gl.glVertex2d(15, lineY)
        Gl.glVertex2d(lineX, lineY)
 
        Gl.glEnd()
 
        ' дожидаемся завершения визуализации кадра 
        Gl.glFlush()
 
        ' сигнал для обновление элемента реализующего визуализацию. 
        AnT.Invalidate()
    End Sub
 
End Class
Вложения
Тип файла: zip Пример2.zip (107.1 Кб, 31 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
13.11.2015, 09:04  [ТС] 4
Пример 3. Формирование тел вращения.
Кликните здесь для просмотра всего текста
VB.NET
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
 
 
Imports Tao.OpenGl
Imports Tao.FreeGlut
Imports Tao.Platform.Windows
 
 
 
Public Partial Class Form1
    Inherits Form
    Private lastX As Integer, lastY As Integer
 
    Private rot_1 As Single, rot_2 As Single
 
    Private GeometricArray As Double(,) = New Double(63, 2) {}
    Private ResaultGeometric As Double(,,) = New Double(63, 63, 2) {}
 
    Private init_mode As Integer = 0
 
    Private count_elements As Integer = 0
 
 
    Private Angle As Double = 2 * Math.PI / 64
    Private Iter As Integer = 64
 
    Public Sub New()
        InitializeComponent()
        AnT.InitializeContexts()
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs)
 
        ' инициализация Glut 
        Glut.glutInit()
        Glut.glutInitDisplayMode(Glut.GLUT_RGB Or Glut.GLUT_DOUBLE Or Glut.GLUT_DEPTH)
 
        ' очитка окна 
        Gl.glClearColor(255, 255, 255, 1)
 
        ' установка порта вывода в соотвествии с размерами элемента anT 
        Gl.glViewport(0, 0, AnT.Width, AnT.Height)
 
 
        ' настройка проекции 
        Gl.glMatrixMode(Gl.GL_PROJECTION)
        Gl.glLoadIdentity()
        Glu.gluPerspective(45, CSng(AnT.Width) / CSng(AnT.Height), 0.1, 200)
        Gl.glMatrixMode(Gl.GL_MODELVIEW)
        Gl.glLoadIdentity()
 
        ' настройка параметров OpenGL для визуализации 
        Gl.glEnable(Gl.GL_DEPTH_TEST)
        Gl.glEnable(Gl.GL_LIGHTING)
        Gl.glEnable(Gl.GL_LIGHT0)
 
 
        ' количество элементов последовательности геометрии, на основе которых будет строится тело вращения
        count_elements = 8
 
        ' непосредственное заполнение точек. 
        ' после изменения данной геометрии мы сразу получим новое тело вращения.
        GeometricArray(0, 0) = 0
        GeometricArray(0, 1) = 0
        GeometricArray(0, 2) = 0
 
        GeometricArray(1, 0) = 0.7
        GeometricArray(1, 1) = 0
        GeometricArray(1, 2) = 1
 
        GeometricArray(2, 0) = 1.3
        GeometricArray(2, 1) = 0
        GeometricArray(2, 2) = 2
 
        GeometricArray(3, 0) = 1.0
        GeometricArray(3, 1) = 0
        GeometricArray(3, 2) = 3
 
        GeometricArray(4, 0) = 0.5
        GeometricArray(4, 1) = 0
        GeometricArray(4, 2) = 4
 
        GeometricArray(5, 0) = 3
        GeometricArray(5, 1) = 0
        GeometricArray(5, 2) = 6
 
        GeometricArray(6, 0) = 1
        GeometricArray(6, 1) = 0
        GeometricArray(6, 2) = 7
 
        GeometricArray(7, 0) = 0
        GeometricArray(7, 1) = 0
        GeometricArray(7, 2) = 7.2F
 
        ' по умолчанию мы будем  отрисовывать фигуру в режиме GL_POINTS 
        comboBox1.SelectedIndex = 0
 
        ' построение геометрии тела вращения
        ' принцип сводится к 2м цилкам - на основе первого перебираются 
        ' вершины в геометрической последовательности
        ' второй использую параметр Iter производит поворот последней линии геометрии вокруг центра тела вращения
        ' при этом используется заранее определенный угол angle который определяется как 2*Pi / количество медиан объекта
        ' за счет выполнения этого алгоритма получается набор вершин описывающих оболочку тела врещения.
        ' остается только соединить эти точки в режиме рисования примитивов для получения 
        ' визуализированного объекта
 
        ' цикл по последовательности точек кривой, на основе которой будет построено тело вращения
        For ax As Integer = 0 To count_elements - 1
            ' цикла по медианам объекта, заранее определенным в программе
            For bx As Integer = 0 To Iter - 1
                ' для всех (bx > 0) элементов алгоритма используются предыдушая построенная последовательность
                ' для ее поворота на установленный угол
                If bx > 0 Then
                    Dim new_x As Double = ResaultGeometric(ax, bx - 1, 0) * Math.Cos(Angle) - ResaultGeometric(ax, bx - 1, 1) * Math.Sin(Angle)
                    Dim new_y As Double = ResaultGeometric(ax, bx - 1, 0) * Math.Sin(Angle) + ResaultGeometric(ax, bx - 1, 1) * Math.Cos(Angle)
                    ResaultGeometric(ax, bx, 0) = new_x
                    ResaultGeometric(ax, bx, 1) = new_y
                    ResaultGeometric(ax, bx, 2) = GeometricArray(ax, 2)
                Else
                    ' для построения первой мидианы мы используем начальную кривую, описывая ее нулевым значением угла поворота
                    Dim new_x As Double = GeometricArray(ax, 0) * Math.Cos(0) - GeometricArray(ax, 1) * Math.Sin(0)
                    Dim new_y As Double = GeometricArray(ax, 1) * Math.Sin(0) + GeometricArray(ax, 1) * Math.Cos(0)
                    ResaultGeometric(ax, bx, 0) = new_x
                    ResaultGeometric(ax, bx, 1) = new_y
                    ResaultGeometric(ax, bx, 2) = GeometricArray(ax, 2)
 
                End If
            Next
        Next
 
 
        ' активация таймера
        RenderTimer.Start()
    End Sub
 
    ' функция обработки сообщения таймера
    Private Sub RenderTimer_Tick(sender As Object, e As EventArgs)
        ' вызываем функцию, отвечающей за отрисовку сцены
        Draw()
    End Sub
 
    ' функция отрисовки сцены
    Private Sub Draw()
        ' два параметра, которые мы будем использовать для непрерывного вращения сцены вокруг 2 координатных осей
        rot_1 += 1
        rot_2 += 1
 
        ' очистка буфера цвета и буфера глубины 
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
        Gl.glClearColor(255, 255, 255, 1)
        ' очищение текущей матрицы 
        Gl.glLoadIdentity()
 
        ' установка положения камеры (наблюдателя). Как видно из кода
        ' дополнительно на полложение наблюдателя по оси Z влияет значение
        ' установленное в ползунке, доступном для пользователя.
 
        ' таким образом, при перемещении ползунка, наблюдатель будет  отдалятся или приближатся к объекту наблюдения
        Gl.glTranslated(0, 0, -7 - trackBar1.Value)
        ' 2 поворота (углы rot_1 и rot_2)
        Gl.glRotated(rot_1, 1, 0, 0)
        Gl.glRotated(rot_2, 0, 1, 0)
 
        ' устанавливаем размер точек равный 5
        Gl.glPointSize(5F)
 
        ' условие switch определяет установленный режим отображения, на основе выбранного пункта элемента
        ' comboBox, установленного в форме программы
        Select Case comboBox1.SelectedIndex
            Case 0
                ' отображение в виде точек
                If True Then
                    ' режим вывода геометрии - точки
                    Gl.glBegin(Gl.GL_POINTS)
 
                    ' выводим всю ранее просчитанную геометрию объекта
                    For ax As Integer = 0 To count_elements - 1
                        For bx As Integer = 0 To Iter - 1
                            ' отрисовка точки
                            Gl.glVertex3d(ResaultGeometric(ax, bx, 0), ResaultGeometric(ax, bx, 1), ResaultGeometric(ax, bx, 2))
                        Next
                    Next
                    ' завершаем режим рисования
                    Gl.glEnd()
 
                    Exit Select
 
                End If
            Case 1
                ' отображение объекта в сеточном режиме, используя режим GL_LINES_STRIP
                If True Then
                    ' устанавливаем режим отрисвки линиями (последовательность линий)
                    Gl.glBegin(Gl.GL_LINE_STRIP)
                    For ax As Integer = 0 To count_elements - 1
                        For bx As Integer = 0 To Iter - 1
 
                            Gl.glVertex3d(ResaultGeometric(ax, bx, 0), ResaultGeometric(ax, bx, 1), ResaultGeometric(ax, bx, 2))
 
                            Gl.glVertex3d(ResaultGeometric(ax + 1, bx, 0), ResaultGeometric(ax + 1, bx, 1), ResaultGeometric(ax + 1, bx, 2))
 
                            If bx + 1 < Iter - 1 Then
 
                                Gl.glVertex3d(ResaultGeometric(ax + 1, bx + 1, 0), ResaultGeometric(ax + 1, bx + 1, 1), ResaultGeometric(ax + 1, bx + 1, 2))
                            Else
                                Gl.glVertex3d(ResaultGeometric(ax + 1, 0, 0), ResaultGeometric(ax + 1, 0, 1), ResaultGeometric(ax + 1, 0, 2))
                            End If
                        Next
                    Next
                    Gl.glEnd()
                    Exit Select
                End If
            Case 2
                ' отрисовка оболочки с расчетом нормалей для корректного затенения граней объекта
                If True Then
                    Gl.glBegin(Gl.GL_QUADS)
                    ' режим отрисовки полигонов состоящих из 4 вершин
                    For ax As Integer = 0 To count_elements - 1
                        For bx As Integer = 0 To Iter - 1
                            ' вспомогательные переменные, для более наглядного использования кода при расчете нормалей
                            Dim x1 As Double = 0, x2 As Double = 0, x3 As Double = 0, x4 As Double = 0, y1 As Double = 0, y2 As Double = 0, _
                                y3 As Double = 0, y4 As Double = 0, z1 As Double = 0, z2 As Double = 0, z3 As Double = 0, z4 As Double = 0
 
                            ' первая вершина
                            x1 = ResaultGeometric(ax, bx, 0)
                            y1 = ResaultGeometric(ax, bx, 1)
                            z1 = ResaultGeometric(ax, bx, 2)
 
 
                            If ax + 1 < count_elements Then
                                ' если текущий ax не последний
                                ' берем следующую точку последовательности
                                x2 = ResaultGeometric(ax + 1, bx, 0)
                                y2 = ResaultGeometric(ax + 1, bx, 1)
                                z2 = ResaultGeometric(ax + 1, bx, 2)
 
                                If bx + 1 < Iter - 1 Then
                                    ' если текущий bx не последний
                                    ' берем следующую точку последовательности и следующий медивн
                                    x3 = ResaultGeometric(ax + 1, bx + 1, 0)
                                    y3 = ResaultGeometric(ax + 1, bx + 1, 1)
                                    z3 = ResaultGeometric(ax + 1, bx + 1, 2)
 
                                    ' точка соотвествующуя по номеру , только на соседнем медиане
                                    x4 = ResaultGeometric(ax, bx + 1, 0)
                                    y4 = ResaultGeometric(ax, bx + 1, 1)
                                    z4 = ResaultGeometric(ax, bx + 1, 2)
                                Else
                                    ' если это последний медиан - то в качесвте след. мы берем начальный (замыкаем геометрию фигуры)
                                    x3 = ResaultGeometric(ax + 1, 0, 0)
                                    y3 = ResaultGeometric(ax + 1, 0, 1)
                                    z3 = ResaultGeometric(ax + 1, 0, 2)
 
                                    x4 = ResaultGeometric(ax, 0, 0)
                                    y4 = ResaultGeometric(ax, 0, 1)
                                    z4 = ResaultGeometric(ax, 0, 2)
 
                                End If
                            Else
                                ' данный элемент ax последний, следовательно мы будем использовать начальный (нулевой) вместо данного ax
                                ' слудуещей точкой будет нулевая ax
                                x2 = ResaultGeometric(0, bx, 0)
                                y2 = ResaultGeometric(0, bx, 1)
                                z2 = ResaultGeometric(0, bx, 2)
 
 
                                If bx + 1 < Iter - 1 Then
                                    x3 = ResaultGeometric(0, bx + 1, 0)
                                    y3 = ResaultGeometric(0, bx + 1, 1)
                                    z3 = ResaultGeometric(0, bx + 1, 2)
 
                                    x4 = ResaultGeometric(ax, bx + 1, 0)
                                    y4 = ResaultGeometric(ax, bx + 1, 1)
                                    z4 = ResaultGeometric(ax, bx + 1, 2)
                                Else
                                    x3 = ResaultGeometric(0, 0, 0)
                                    y3 = ResaultGeometric(0, 0, 1)
                                    z3 = ResaultGeometric(0, 0, 2)
 
                                    x4 = ResaultGeometric(ax, 0, 0)
                                    y4 = ResaultGeometric(ax, 0, 1)
                                    z4 = ResaultGeometric(ax, 0, 2)
 
                                End If
                            End If
 
 
                            ' переменные для расчета нормал
                            Dim n1 As Double = 0, n2 As Double = 0, n3 As Double = 0
 
                            ' нормаль будем расчитывать как векторное произведение граней полигона
                            ' для нулевого элемента нормаль мы будем считать немного по другому.
 
                            ' на самом деле разница в расчете нормали актуальна только для 1 и последнего и первого полигона на медиане
 
                            If ax = 0 Then
                                ' при расчете нормали для ax мы будем использовать точки 1,2,3
                                n1 = (y2 - y1) * (z3 - z1) - (y3 - y1) * (z2 - z1)
                                n2 = (z2 - z1) * (x3 - x1) - (z3 - z1) * (x2 - x1)
                                n3 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)
                            Else
                                ' для остальных - 1,3,4
                                n1 = (y4 - y3) * (z1 - z3) - (y1 - y3) * (z4 - z3)
                                n2 = (z4 - z3) * (x1 - x3) - (z1 - z3) * (x4 - x3)
                                n3 = (x4 - x3) * (y1 - y3) - (x1 - x3) * (y4 - y3)
                            End If
 
 
                            ' если не включен режим GL_NORMILIZE то мы должны в обязательном порядке 
                            ' произвести нормализацию вектора нормали, перед тем как передать информацию о нормали  
                            Dim n5 As Double = CDbl(Math.Sqrt(n1 * n1 + n2 * n2 + n3 * n3))
                            n1 /= (n5 + 0.01)
                            n2 /= (n5 + 0.01)
                            n3 /= (n5 + 0.01)
 
                            ' передаем информацию о нормали
                            Gl.glNormal3d(-n1, -n2, -n3)
 
                            ' передаем 4 вершины для отрисовки полигона
                            Gl.glVertex3d(x1, y1, z1)
                            Gl.glVertex3d(x2, y2, z2)
                            Gl.glVertex3d(x3, y3, z3)
 
                            Gl.glVertex3d(x4, y4, z4)
                        Next
                    Next
 
                    ' завершаем выбранный режим рисования полигонов
                    Gl.glEnd()
                    Exit Select
                End If
        End Select
 
        ' возвращаем сохраненную матрицу
        Gl.glPopMatrix()
 
        ' завершаем рисование
        Gl.glFlush()
 
        ' обновляем элемент AnT
        AnT.Invalidate()
    End Sub
 
End Class
Вложения
Тип файла: zip Пример3.zip (53.8 Кб, 47 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
13.11.2015, 09:05  [ТС] 5
Пример 4. Текстурирование.
Кликните здесь для просмотра всего текста
VB.NET
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.IO
 
Imports Tao.OpenGl
Imports Tao.FreeGlut
Imports Tao.Platform.Windows
Imports Tao.DevIl
 
Public Partial Class Form1
    Inherits Form
    ' ряд вспомогательных переменных
    ' поворот
    Private rot As Integer = 0
    ' флаг - загружена ли текстура
    Private textureIsLoad As Boolean = False
 
    ' имя текстуры
    Public texture_name As String = ""
    ' индефекатор текстуры
    Public imageId As Integer = 0
 
    ' текстурный объект
    Public mGlTextureObject As UInteger = 0
 
 
    Public Sub New()
        InitializeComponent()
        AnT.InitializeContexts()
    End Sub
 
    ' событие загрузки формы
    Private Sub Form1_Load(sender As Object, e As EventArgs)
 
        ' инициализация бибилиотеки glut 
        Glut.glutInit()
        ' инициализация режима экрана 
        Glut.glutInitDisplayMode(Glut.GLUT_RGB Or Glut.GLUT_DOUBLE)
 
        ' инициализация библиотеки openIL
        Il.ilInit()
        Il.ilEnable(Il.IL_ORIGIN_SET)
 
        ' установка цвета очистки экрана (RGBA) 
        Gl.glClearColor(255, 255, 255, 1)
 
        ' установка порта вывода 
        Gl.glViewport(0, 0, AnT.Width, AnT.Height)
 
 
        ' активация проекционной матрицы 
        Gl.glMatrixMode(Gl.GL_PROJECTION)
        ' очистка матрицы 
        Gl.glLoadIdentity()
 
        ' установка перспективы
        Glu.gluPerspective(30, AnT.Width \ AnT.Height, 1, 100)
 
        ' установка объектно-видовой матрицы 
        Gl.glMatrixMode(Gl.GL_MODELVIEW)
        Gl.glLoadIdentity()
 
        ' начальные настройки OpenGL
        Gl.glEnable(Gl.GL_DEPTH_TEST)
        Gl.glEnable(Gl.GL_LIGHTING)
        Gl.glEnable(Gl.GL_LIGHT0)
 
        ' активация таймера
        RenderTimer.Start()
    End Sub
 
    ' отклик таймера
    Private Sub RenderTimer_Tick(sender As Object, e As EventArgs)
        ' вызов функции отрисовки сцены
        Draw()
    End Sub
 
    ' функция отрисовки
    Private Sub Draw()
        ' если текстура загружена
        If textureIsLoad Then
            ' увеличиваем угол поворота
            rot += 1
            ' корректируем угол
            If rot > 360 Then
                rot = 0
            End If
 
 
            ' очистка буфера цвета и буфера глубины 
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
            Gl.glClearColor(255, 255, 255, 1)
            ' очищение текущей матрицы 
            Gl.glLoadIdentity()
 
            ' включаем режим текстурирования
            Gl.glEnable(Gl.GL_TEXTURE_2D)
            ' включаем режим текстурирования , указывая индификатор mGlTextureObject
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, mGlTextureObject)
 
            ' сохраняем состояние матрицы
            Gl.glPushMatrix()
 
            ' выполняем перемещение для более наглядного представления сцены
            Gl.glTranslated(0, -1, -5)
            ' реализуем поворот объекта
            Gl.glRotated(rot, 0, 1, 0)
 
            ' отрисовываем полигон
            Gl.glBegin(Gl.GL_QUADS)
 
            ' указываем поочередно вершины и текстурные координаты
            Gl.glVertex3d(1, 1, 0)
            Gl.glTexCoord2f(0, 0)
            Gl.glVertex3d(1, 0, 0)
            Gl.glTexCoord2f(1, 0)
            Gl.glVertex3d(0, 0, 0)
            Gl.glTexCoord2f(1, 1)
            Gl.glVertex3d(0, 1, 0)
            Gl.glTexCoord2f(0, 1)
 
            ' завершаем отрисовку
            Gl.glEnd()
 
            ' возвращаем матрицу
            Gl.glPopMatrix()
            ' отключаем режим текстурирования
            Gl.glDisable(Gl.GL_TEXTURE_2D)
 
            ' обновлеям элемент со сценой
            AnT.Invalidate()
        End If
    End Sub
 
 
    ' обработка пункта меню загрузки изображения
    Private Sub loadImageToolStripMenuItem_Click(sender As Object, e As EventArgs)
        ' открываем окно выбора файла
        Dim res As DialogResult = openFileDialog1.ShowDialog()
 
        ' есл файл выбран - и возвращен результат OK
        If res = DialogResult.OK Then
            ' создаем изображение с индификатором imageId
            Il.ilGenImages(1, imageId)
            ' делаем изображение текущим
            Il.ilBindImage(imageId)
 
            ' адрес изображения полученный с помощью окна выбра файла
            Dim url As String = openFileDialog1.FileName
 
            ' пробуем загрузить изображение
            If Il.ilLoadImage(url) Then
                ' если загрузка прошла успешно
                ' сохраняем размеры изображения
                Dim width As Integer = Il.ilGetInteger(Il.IL_IMAGE_WIDTH)
                Dim height As Integer = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT)
 
                ' определяем число бит на пиксель
                Dim bitspp As Integer = Il.ilGetInteger(Il.IL_IMAGE_BITS_PER_PIXEL)
 
                Select Case bitspp
                    ' в зависимости оп полученного результата
                    ' создаем текстуру используя режим GL_RGB или GL_RGBA
                    Case 24
                        mGlTextureObject = MakeGlTexture(Gl.GL_RGB, Il.ilGetData(), width, height)
                        Exit Select
                    Case 32
                        mGlTextureObject = MakeGlTexture(Gl.GL_RGBA, Il.ilGetData(), width, height)
                        Exit Select
                End Select
 
                ' активируем флаг, сигнализирующий загрузку текстуры
                textureIsLoad = True
                ' очищаем память
 
 
                Il.ilDeleteImages(1, imageId)
            End If
        End If
 
    End Sub
 
    ' создание текстуры в панями openGL
    Private Shared Function MakeGlTexture(Format As Integer, pixels As IntPtr, w As Integer, h As Integer) As UInteger
        ' индетефекатор текстурного объекта
        Dim texObject As UInteger
 
        ' генерируем текстурный объект
        Gl.glGenTextures(1, texObject)
 
        ' устанавливаем режим упаковки пикселей
        Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1)
 
        ' создаем привязку к только что созданной текстуре
        Gl.glBindTexture(Gl.GL_TEXTURE_2D, texObject)
 
        ' устанавливаем режим фильтрации и повторения текстуры
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT)
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT)
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR)
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR)
        Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_REPLACE)
 
        ' создаем RGB или RGBA текстуру
        Select Case Format
            Case Gl.GL_RGB
                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, w, h, 0, _
                    Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, pixels)
                Exit Select
 
            Case Gl.GL_RGBA
                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, w, h, 0, _
                    Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, pixels)
                Exit Select
        End Select
 
        ' возвращаем индетефекатор текстурного объекта
 
        Return texObject
    End Function
 
 
End Class
Вложения
Тип файла: zip Пример4.zip (49.5 Кб, 30 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
13.11.2015, 21:08  [ТС] 6
Еще пара замечаний. Рекомендую скопировать файлы из C:\Program Files\TaoFramework\lib\ в system32. В 4 примере нужно использовать текстуры правильного размера: 32х32, 64х64, 128х128, 256х256 и т.д.

Добавлено через 7 часов 22 минуты
Потом переведу еще примеры, это как начало.От себя добавлю, проще использовать готовые движки для разработки игр. У меня ушла неделя, чтобы врубиться в основы. Сейчас я понимаю, что это не вариант для игр. Можно конечно написать что-то типа тетриса, но и здесь будут десятки км кода. Но это однозначно лучше, чем рисовать контролы, бегающие по форме!
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
14.11.2015, 18:37  [ТС] 7
Перевел еще один пример - реализация системы частиц.
Вложения
Тип файла: zip Эффект частиц.zip (58.4 Кб, 34 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
14.11.2015, 19:03  [ТС] 8
Загрузка 3D модели формата .ase.
Вложения
Тип файла: zip Загрузка 3D модели.zip (71.6 Кб, 60 просмотров)
Тип файла: zip модель.zip (92.0 Кб, 40 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
14.11.2015, 19:24  [ТС] 9
Еще одна модель.
Вложения
Тип файла: zip drum.zip (220.0 Кб, 26 просмотров)
0
14.11.2015, 19:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2015, 19:24
Помогаю со студенческими работами здесь

Вращение в TaoFramework Opengl
Здравствуйте! Используя TaoFramework. С помощью glRotated() много раз вращаю сцену в разные...

TaoFramework + Mono/Linux
Есть библиотека Таофреймворк - реализация работы C# с OpenGL. Заявлена крослатформенность (на базе...

TaoFramework: не удается загрузить DLL "freeglut.dll"
Не удается загрузить DLL &quot;freeglut.dll&quot;: Не найден указанный модуль. (Исключение из HRESULT:...

Нужна летиратура, в которой бы описывались работа с событиями, работа с элементами управления
Помогите пожалуйста найти летиратуру, в которой бы описывались работа с событиями,работа со всеми...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru