Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
 Аватар для Goose45
2 / 2 / 1
Регистрация: 30.07.2016
Сообщений: 118

Рисование сферы через OpenGL

09.05.2018, 20:43. Показов 6479. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте ,я столкнулся с одной проблемой ,создал я проект Windows Forms. Подключил OpenGL (SharpGL) ,но проблема в том что мне нужно нарисовать сферу ,с помощью Glut.glutWireSphere() ,я это отрисовываю она появляется ,и иногда не не появляется. Но если ее видно она растянута на весь элемент openGLControl1 в котором все и отрисовывается ....

Как мне получить нормальную сферу ,просто на C++ я это уже сделал ,мне в форму это нужно добавить ...

Вот на C# (форма)

C#
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
private void openGLControl1_Load(object sender, EventArgs e)
        {
 
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
            OpenGL gl = this.openGLControl1.OpenGL;
 
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            Gl.glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);
            Gl.glViewport(0, 0, 1826, 916);
 
            Glut.glutWireSphere(1.0, 10, 10);
            // //openGL_Smoothing(gl);
            // //gl.LoadIdentity();
 
            // Glut.glutDisplayFunc(draw);
            // Glut.glutReshapeFunc(reshape);
            //// Glut.glutKeyboardFunc(control_camera_translate);
 
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
            Gl.glEnable(Gl.GL_LIGHTING);
            Gl.glEnable(Gl.GL_LIGHT0);
            Gl.glColor3f(4.0f, 0.6f, 0.3f);
            Glut.glutWireSphere(0.2, 10, 10);
            for (int j = 0; j < 42; j++)
            {
                Gl.glPointSize(2);
                Gl.glBegin(Gl.GL_POINTS);
                Gl.glColor3f(0.3f, 0.7f, 0.0f);
                Gl.glVertex3f((float)Math.Cos(magn_data[j, 0]), -(float)Math.Sin(magn_data[j, 1]), -(float)Math.Cos(magn_data[j, 2]));
                Gl.glEnd();
            }
            //Glut.glutReshapeFunc(reshape);
        }
И если что вот что на C++ (только я ее немного не доделал)

C++
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
// ConsoleApplication3.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <GL/glut.h>
#include <conio.h>
 
float ex = 3.0, ey = 4.0, ez = 5.0;
 
float magn_data[42][3] = { {102.0,779.0,-50.0},
                          {453.0,645.0,-268},
                          {572.0,570.0,14.0},
                          { -152.0, -1029.0, 67.0 },
                          { -150.0, -1029.0, 65.0 },
                          { -152.0, -1029.0, 64.0 },
                          { -149.0, -1029.0, 66.0 },
                          { -154.0, -1029.0, 69.0 },
                          { -150.0, -1029.0, 68.0 },
                          { -153.0, -1029.0, 64.0 },
                          { -151.0, -1029.0, 64.0 },
                          { -149.0, -1029.0, 64.0 },
                          { -153.0, -1029.0, 65.0 },
                          { -150.0, -1029.0, 65.0 },
                          { -150.0, -1029.0, 65.0 },
                          { 389.0,279.0,-20.0 },
                          { 453.0,65.0,-68 },
                          { 55.0,55.0,14.0 },
                          { 152.0, -1029.0, 67.0 },
                          { 150.0, -1029.0, 65.0 },
                          { 172.0, -29.0, 164.0 },
                          { 149.0, -1029.0, 66.0 },
                          { 154.0, -1029.0, 69.0 },
                          { -150.0, 1029.0, 68.0 },
                          { -153.0, 1029.0, 64.0 },
                          { -151.0, 1029.0, 64.0 },
                          { -149.0, 1029.0, 64.0 },
                          { -153.0, 1029.0, 65.0 },
                          { -150.0, 1029.0, 65.0 },
                          { -150.0, 1029.0, 65.0 },
                          { 352.0, -1029.0, 67.0 },
                          { 350.0, -1029.0, 65.0 },
                          { 372.0, -29.0, 164.0 },
                          { 349.0, -1029.0, 66.0 },
                          { 354.0, -129.0, 69.0 },
                          { -50.0, 132.0, 68.0 },
                          { -53.0, 256.0, 64.0 },
                          { -51.0, 169.0, 64.0 },
                          { -49.0, 129.0, 64.0 },
                          { 53.0, 29.0, 65.0 },
                          { -50.0, 329.0, 65.0 },
                          { -50.0, 579.0, 65.0 }
                        };
 
void init() {
    glClearColor(0.0,0.0,0.0,1.0);
    glShadeModel(GL_FLAT);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    // Сглаживание точек
    glEnable(GL_POINT_SMOOTH);
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    // Сглаживание линий
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    // Сглаживание полигонов    
    glEnable(GL_POLYGON_SMOOTH);
    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
}
 
void draw() {
    glClear(GL_COLOR_BUFFER_BIT);
 
    glColor4f(0.5f,0.6f,0.3f,0.2f);
    glutWireSphere(1.0,30,20);
    for (int j = 0; j < 42; j++)
    {
        /*glBegin(GL_LINES);
        glColor3f(0.3f,0.7f,0.0f);
        glVertex3f(0.0f,0.0f,0.0f);
        glVertex3f(cos(magn_data[j][0]), -sin(magn_data[j][1]), -cos(magn_data[j][2]));
        glEnd();
*/
        glPointSize(2);
        glBegin(GL_POINTS);
        glColor3f(0.3f, 0.7f, 0.0f);
        glVertex3f(cos(magn_data[j][0]), -sin(magn_data[j][1]), -cos(magn_data[j][2]));
        glEnd();
    }
    
    glutSwapBuffers();
    glFlush();
}
 
void reshape(int w, int h) {
 
    glMatrixMode(GL_PROJECTION);
    gluPerspective(50.0,w/(GLfloat)h,3.0,90.0);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(ex,ey,ez,0.0,0.0,0.0,0.0,1.0,0.0);
}
 
void control_camera_rotate(int key, int x, int y) {
    switch (key)
    {
    case GLUT_KEY_UP:
        glRotatef(1.0f, 0.0f, 0.0f, 1.0f);
        glutPostRedisplay();
        break;
    case GLUT_KEY_DOWN:
        glRotatef(1.0f, 1.0f, 0.0f, 0.0f);
        glutPostRedisplay();
        break;
    case GLUT_KEY_LEFT:
        glRotatef(1.0f, 0.0f, 1.0f, 0.0f);
        glutPostRedisplay();
        break;
    case GLUT_KEY_RIGHT:
        glRotatef(1.0f, 1.0f, 1.0f, 0.0f);
        glutPostRedisplay();
        break;
    }
}
 
void control_camera_translate(unsigned char key, int x, int y) {
    //float rot = 0.0;
 
    switch (key)
    {
    case 'r':
        //glRotatef(rot += 1.0f, 0.0f, 1.0f, 0.0f);
        glTranslatef(0.0, 0.1, 0.0);
        glutPostRedisplay();
        break;
    case 'f':
        //glRotatef(rot += 1.0f, 0.0f, 0.0f, 1.0f);
        glTranslatef(0.0, -0.1, 0.0);
        glutPostRedisplay();
        break;
    case 'w':
        glTranslatef(0.0, 0.0, 0.1);
        glutPostRedisplay();
        break;
    case 's':
        glTranslatef(0.0, 0.0, -0.1);
        glutPostRedisplay();
        break;
    case 'a':
        //glRotatef(rot += 1.0f, 0.0f, 1.0f, 1.0f);
        glTranslatef(0.0, 0.1, -0.1);
        glutPostRedisplay();
        break;
    case 'd':
        //glRotatef(rot += 1.0f, 1.0f, 1.0f, 0.0f);
        glTranslatef(0.1, 0.0, -0.1);
        glutPostRedisplay();
        break;
    default:
 
        break;
    }
}
 
int main(int argc, char **argv)
{
 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    ///After change
    glutInitWindowSize(1920 / 2, 1080 / 2);
    glutInitWindowPosition(550, 140);
    glutCreateWindow("Window");
    
    glClearColor(0.0, 0.6, 0.5, 1.0);
    //glLoadIdentity();
    //glOrtho(-100,100, -100, 100, -100, 100);
 
    //glTranslatef(-100, 0, 0);
    init();
    glutDisplayFunc(draw);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(control_camera_translate);
    glutSpecialFunc(control_camera_rotate);
    glutMainLoop();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2018, 20:43
Ответы с готовыми решениями:

OpenTK. Рисование сферы
У университете задали задание: Сделать Солнце, Землю и Луну и осуществить вращение Земли вокруг Солнца, а Луны вокруг Земли. Это все надо...

Рисование графика через OpenGL
Хочу нарисовать параболу x2 с помощью OpenGL, но что-то не получается. Просто черный экран. В чем ошибка? var x1, x2, y: Real; begin ...

Рисование сферы
подскажите фунцию рисования сферы. вот пример из книги (супер книга опенгл) я попытался взять отдельную часть кода. void...

1
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
10.05.2018, 12:07
Цитата Сообщение от Goose45 Посмотреть сообщение
она появляется ,и иногда не не появляется
Отрисовка должна происходить не в событии openGLControl1_Load, а в openGLControl1_Paint.

Цитата Сообщение от Goose45 Посмотреть сообщение
Но если ее видно она растянута на весь элемент openGLControl1 в котором все и отрисовывается
Это нужно экспериментировать с видовыми матрицами. Плюс размер вьюпорта лучше делать не константным, а зависящим от размера окна.

PS. Если интересно, могу скинуть рабочий проект с использованием OpenGL. Там тоже, в основном одни сферы рисуются. Правда использовалась библиотека OpenTK, а не SharpGL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2018, 12:07
Помогаю со студенческими работами здесь

Рисование сферы (Delphi)
как в delphi , используя opengl нарисовать трехмерную сферу?

OpenGL летающие сферы
Нашел я пример с рисованием сферы, вокруг которой крутятся другие сферы. Но не понятны некоторые моменты, надеюсь вы опять мне поможете) ...

Тектурирование 3D сферы (openGL C#)
Добрый день всем! Проблема банальная - необходимо сделать земной шар, а соответственно на сферу нужно натянуть текстуру. Много чего уже...

Opengl текстурирование сферы
Так я загружаю текстуру glColor3f(1,1,1); unsigned int textures; AUX_RGBImageRec *texture1=auxDIBImageLoadA(&quot;texturebmp1.bmp&quot;);...

opengl - анимация сферы
Пожалуйста, помогите. хотя бы советом)). задача состоит в том, чтобы прога рисовала трехмерный шарик (сферу, то есть) и нужно создать для...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru