Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
1

Круглое отсечение

22.06.2012, 12:23. Просмотров 846. Ответов 8
Метки нет (Все метки)

По дизайну игры видимость ограничена не "туманом войны", а кривизной Земли, а в углу есть миникарта, видимость на которой должна быть ограничена тем же расстоянием. Миникарта рисуется с помощью OpenGL, только в отдельном контексте. Проблема в том, что даже если подобрать высоту так, чтоб миникарта влезла точно в своё окно, она будет отсечена пирамидой видимости с основанием, подобным границам окна и в итоге миникарта квадратная, а нужен конус видимости и круглая миникарта. Как это сделать? Стандарные наблюдаемые объёмы вроде только пирамида и параллелипипед.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2012, 12:23
Ответы с готовыми решениями:

Отсечение уголком
Можно ли средствами OpenGL сделать сечение уголком(как прямоугольный кусок торта, например)?...

Подскажите как сделать отсечение
Помогите с заданием. Есть треугольник, необходимо задать такие параметры плоскости, чтобы проходила...

OpenGL отсечение невидимых линий
На первом рисунке то что есть. На втором - как хотелось бы. Т.е. вроде бы и каркасный...

Почему, если не писать матрицу и отсечение, то рисуется одна точка?
#include <GL/glut.h> #include <cmath> #define GL_PI 3.1415f using namespace std; void...

Круглое окно.
Кто нибудь что нибудь понял? :) Можно в языке асма восроизвести это? Пожалуйста! Добавлено...

8
NoMasters
Псевдослучайный
1912 / 1123 / 90
Регистрация: 13.09.2011
Сообщений: 3,182
22.06.2012, 18:32 2
Нарисовать больше и вырезать круг.
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.06.2012, 07:51  [ТС] 3
Больше у меня и рисуется. А как отрезать то?
0
NoMasters
Псевдослучайный
1912 / 1123 / 90
Регистрация: 13.09.2011
Сообщений: 3,182
23.06.2012, 16:03 4
Интерфейс поверх нарисуй, очевидно.
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.06.2012, 19:44  [ТС] 5
То есть? Во-первых как? А во-вторых там по дизайну просто чернота. Чёрный квадрат Малевича и в центре круглый иллюминатор без рамы диаметром процентов за 90, но меньше ста от стороны квадрата и в этом иллюминаторе вид на битву с птичьего полёта. Перспективный, но с очень маленьким диапазоном глубины картинки, так что перспективу почти не видно. И круглый, а не квадратный. Вот представь, что ты одним глазом смотришь с самолёта в телескоп на море, острова со средневековыми крепостями и кораблями и ни на одном острове нет гор, а только холмы метров до пяти в высоту и местами до пары квадратных километров в плане. С учётом высоты полёта одно измерение видно очень плохо. Вот так этот вид и задуман. При этом радиус видимого с самолёта куска архипелага равен радиусу горизонта с палубы корабля, даже не с мачты. Угол обзора очень узкий и видно мало. Но сразу во все стороны, а на основном виде нет панорамы, а есть только обычная перспектива в одну сторону. Можно повернуться, но тогда из поля зрения пропадёт то, что ты видел раньше. А на виде сверху одновременно присутствуют все ракурсы. Основной вид занимает самое большой дочернее окно главного окна, в высоту оно занимает всю высоту главного окна, а в ширину 3/4. Правая четверть отведена под чат и вид сверху. Вид сверху располагается в квадратном окне шириной в четверть главного окна и высотой в четверть ширины главного окна. То есть получается, что радиус самого вида сверху >9/80 ширины главного окна и <1/8 этой ширины. Окно с видом сверху прижато к верхнему краю главного кона, а весь остаток площади главного окна занимает окно чата. Это МО (не ММО, а именно с одной М). Сингл возможен, тогда в окно чата пишет только бот-информатор.
0
NoMasters
Псевдослучайный
1912 / 1123 / 90
Регистрация: 13.09.2011
Сообщений: 3,182
23.06.2012, 19:49 6
Тогда буфер трафарета в руки.
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.06.2012, 19:59  [ТС] 7
Как это лучше сделать? Шейдером, фильтрующим результат и перекрашивающий пикселы? Ограничивающим телом нужной геометри? Квадратом с масочной текстурой? Размытие, или видимая угловатость границ крайне не желательны, как и прорисовка за границей круга любым цветом, кроме чёрного с точностью до контраста и глубины чёрного целевого дисплея, а в цифровом образе в этих пикселах экрана должен быть идеальный rgb(0, 0, 0), он же clBlack.

Добавлено через 31 секунду
Цитата Сообщение от NoMasters Посмотреть сообщение
Тогда буфер трафарета в руки.
Что это такое?

Добавлено через 7 минут
Трафарет это двумерный массив целых переменных(тип int). Каждому пикселю в окне соответствует один элемент массива. Использование буфера трафарета происходит в два этапа. Сначала вы его заполняете, потом основываясь на его содержимом, рисуете ваши объекты. Буффер трафарета заполняется следующим образом. Вы делите окно вывода на зоны и каждой зоне присваиваете свое значение. Например, для рисунка 4.12.1 область, где нет ничего, будет заполнена нулями, область, где выведен куб, заполнена единицами и область, где видна сфера, двойками. Обратите внимание, что буффер трафарета - это двумерный массив, а не трехмерный.
А чему соответствует пара индексов этого массива? Экранным координатам? Или чему?
0
NoMasters
Псевдослучайный
1912 / 1123 / 90
Регистрация: 13.09.2011
Сообщений: 3,182
23.06.2012, 19:59 8
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это такое?
Это то, что может элементарным образом решить поставленную задачу, а так же множество других. В последний раз посылаю читать литературу, в дальнейшем вопросы глупые вопросы ТС буду игнорировать.
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.06.2012, 22:02  [ТС] 9
Так я не понял, мне всё равно нужен объект, повторяющий геометрию нужного мне круга?

Добавлено через 2 минуты
Или его можно заполнить не на основе объектов?

Добавлено через 37 минут
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
void                          RenderMap                 (                                   )
{
 wglMakeCurrent(WindowMap.WindowContext, WindowMap.OpenGLContext);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 LookMap();
 glEnable(GL_TEXTURE_2D);
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 DrawEarthMap();
 glDisable(GL_TEXTURE_2D);
 glFlush();
 SwapBuffers (WindowMap.WindowContext);
}
void                          DrawEarthMap              (                                   )
{
 glPushMatrix();
 glTranslatef(0.0, 0.0, 0.0);
 glRotatef(0.0, 0.0, 0.0, 0.0);
 //gluDisk(NULL, 0.0, 6000.0, 64, 1);
 glBindTexture(GL_TEXTURE_2D, Earth.TextureMap);
 glPushClientAttrib  ( GL_CLIENT_VERTEX_ARRAY_BIT );
 glBindBuffer(GL_ARRAY_BUFFER, Earth.VertexNumberMap);
 glBufferData(GL_ARRAY_BUFFER, sizeof(TVertex)*Earth.VertexCount, Earth.VertexBuffer, GL_STATIC_DRAW);
 glEnableClientState(GL_VERTEX_ARRAY);
 glVertexPointer(3, GL_FLOAT, sizeof(TVertex), BUFFER_OFFSET(0));
 glEnableClientState(GL_NORMAL_ARRAY);
 glNormalPointer(GL_FLOAT, sizeof(TVertex), BUFFER_OFFSET(12));
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 glTexCoordPointer(2, GL_FLOAT, sizeof(TVertex), BUFFER_OFFSET(24));
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Earth.IndexNumberMap);
 glDrawElements(GL_TRIANGLES, Earth.IndexCount, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));
 glPopClientAttrib();
 glPopMatrix();
}
Если разкоментить gluDisk(NULL, 0.0, 6000.0, 64, 1);, то мёртвое зависание.

Добавлено через 48 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GLUquadricObj *Quad;
 wglMakeCurrent(WindowMap.WindowContext, WindowMap.OpenGLContext);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 LookMap();
 Quad=gluNewQuadric();
 glEnable(GL_TEXTURE_2D|GL_STENCIL_TEST);
 glStencilFunc(GL_ALWAYS, 1, 0);
 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
 gluSphere(Quad, 500000.0, 64, 64);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glStencilFunc(GL_EQUAL, 1, 255);
 DrawEarthMap();
 glDisable(GL_TEXTURE_2D|GL_STENCIL_TEST);
 glFlush();
 SwapBuffers (WindowMap.WindowContext);
Вроде всё по-написанному, а вместо трафарета просто отрубилась текстура.

Добавлено через 24 минуты
Сделал ограничивающим телом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void                          RenderMap                 (                                   )
{
 GLUquadricObj *Quad;
 wglMakeCurrent(WindowMap.WindowContext, WindowMap.OpenGLContext);
 Quad=gluNewQuadric();
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glEnable(GL_TEXTURE_2D);
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 LookMap();
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 DrawEarthMap();
 glPushMatrix();
 glTranslated(0.0, 0.0, EarhRadius+MapHeight-125.0);
 glColor3d(0.0, 0.0, 0.0);
 glDisable(GL_TEXTURE_2D);
 gluDisk(Quad, 30.0, 100.0, 64, 1);
 glFlush();
 SwapBuffers (WindowMap.WindowContext);
}
0
23.06.2012, 22:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 22:02

Анимированное круглое меню
Я решила установить Анимированное круглое меню......мне оно понравилось и покозалось удобным....но...

Круглое окно WinAPI C++
:wall: Как на c++ WinAPI сделать круглое окно??? IDE у меня Codeblocks!

Сохранить круглое изображение из pictureBox
Нужно, чтобы сохранялось круглое изображение из pictureBox, а не квадратное, и рисовались круги, а...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru