4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

Конус отсечения

23.06.2012, 07:19. Показов 1506. Ответов 9
Метки нет (Все метки)

Стандартных объёмов отсечения два: пирамида и параллелипипед. Но иногда нужен конус. Оптика с круглым полем зрения (оптический прицел, подзорная труба), или, как у меня, помимо основного окна ещё второе в углу с видом сверху и ограничением согласно дизайну видимости в этом окне предельным расстоянием от центра, но без "тумана войны". На основном виде можно ограничить дальность без помощи "тумана войны", согнув поверхность в сферу, или в геоид. Но вид сверху, как ни настраивай углы и высоту, получается квадратным вместо круглого, по диагонали окна угол отсечения оказывается в https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{2} больше, чем вдоль осей. А можно как то отсечь по конусу? Пусть рендеринг работает в пирамидальном отсечении. А отфильтровать результат каким нибудь шейдером и перекрасить пикселы за границей окружности в чёрный цвет можно? Вычислить для каждого пиксела расстояние от центра окна по евклидовой норме https://www.cyberforum.ru/cgi-bin/latex.cgi?d=\sqrt{\left(x-w/2\right)^2+\left(y-w/2\right)^2}, сравнить с https://www.cyberforum.ru/cgi-bin/latex.cgi?w/2, если больше, то перекрасить. Как может выглядеть исходник такого шейдера? Где вообще искать по нему инфу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2012, 07:19
Ответы с готовыми решениями:

Плоскость отсечения
Здравствуйте, у меня вопрос: Функция glClipPlane(GL_CLIP_PLANE0, Clip_eq); Что означают элементы...

Плоскость отсечения и каркас объекта
имеется часть сферы полученная при помощи плоскости отсечения и присоединяемый к ней усеченный...

Что такое область отсечения?
Здравствуйте, начал изучать OpenGL. Столкнулся с проблемой, я не понимаю, что такое область...

SDL: OpenGL: установка границ объема отсечения glOrtho(.);
Открыл окно SDL, создал контекст OpenGL. Соответственно, что бы что-либо рисовать, нужно...

9
Модератор
3365 / 2138 / 351
Регистрация: 13.01.2012
Сообщений: 8,316
26.06.2012, 11:21 2
а что если над картой разместить сферу таким образом что бы она вырезала на ней круг нужного размера - этот круг будет внутри сферы. сфера черная. все что внутри (в том числе и круг) будут рендерится. все что вышло за сферу - нет
0
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,378
Записей в блоге: 5
26.06.2012, 13:48 3
Если правильно понял, то:
А что если рендерить в усечённую пирамиду как обычно, а после на весь экран наложить чёрный прямоугольник с прозрачной окружностью по центру? Можно обойтись четырьмя вершинами и одной текстурой с альфа каналом + вся остальная сцена.
Цитата Сообщение от taras atavin Посмотреть сообщение
На основном виде можно ограничить дальность без помощи "тумана войны", согнув поверхность в сферу, или в геоид.
Это ж какая оптика должна быть чтобы практически с поверхности океана увидеть кривизну Земли? Не выдумывайте!
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.06.2012, 14:53  [ТС] 4
С синтаксисом уже разобрался, а параметры переврал так, что вместо изображения в неподвижном круге движется весь круг вместе с изображением.
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
void                          RenderMap                 (                                   )
{
 GLUquadricObj *Quad;
 wglMakeCurrent(WindowMap.WindowContext, WindowMap.OpenGLContext);
 Quad=gluNewQuadric();
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glEnable(GL_STENCIL_TEST);
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
 LookMap();
 glStencilFunc(GL_NEVER, 1, 0);
 glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
 glPushMatrix();
 glTranslated(0.0, 0.0, EarhRadius);
 gluDisk(Quad, 0.0, 5000.0, 64, 1);
 glPopMatrix();
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glStencilFunc(GL_EQUAL, 1, 255);
 glEnable(GL_TEXTURE_2D);
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 DrawEarthMap();
 glDisable(GL_TEXTURE_2D);
 glDisable(GL_STENCIL_TEST);
 glFlush();
 SwapBuffers (WindowMap.WindowContext);
}
void                          LookMap                   (                                   )
{
 gluLookAt(Control.Position.Top    .x, Control.Position.Top    .y, Control.Position.Top    .z,
           Control.Position.TopLook.x, Control.Position.TopLook.y, Control.Position.TopLook.z,
           Control.Position.TopUp  .x, Control.Position.TopUp  .y, Control.Position.TopUp  .z);
}
Добавлено через 32 минуты
Может так:
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
void                          RenderMap                 (                                   )
{
 static double AngleFactor=M_PI/180.0;
 GLUquadricObj *Quad;
 wglMakeCurrent(WindowMap.WindowContext, WindowMap.OpenGLContext);
 Quad=gluNewQuadric();
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glEnable(GL_STENCIL_TEST);
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
 LookMap();
 glStencilFunc(GL_NEVER, 1, 0);
 glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
 glPushMatrix();
 glTranslated(Control.Position.Main.x, Control.Position.Main.y, Control.Position.Main.z);
 glRotated(Control.Position.GeoPosition.Lattitude*AngleFactor, 1.0, 0.0, 0.0);
 glRotated(Control.Position.GeoPosition.Longitude*AngleFactor, 0.0, 0.0, 1.0);
 gluDisk(Quad, 0.0, 5000.0, 64, 1);
 glPopMatrix();
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glStencilFunc(GL_EQUAL, 1, 255);
 glEnable(GL_TEXTURE_2D);
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 DrawEarthMap();
 glDisable(GL_TEXTURE_2D);
 glDisable(GL_STENCIL_TEST);
 glFlush();
 SwapBuffers (WindowMap.WindowContext);
}
?
0
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,378
Записей в блоге: 5
26.06.2012, 15:23 5
Стенсил в топку
Я бы сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Render(void)
{
  Clear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  // здесь прорисовка сцены
 
  // теперь включаем режим 2d 
  glPushMatrix();// сохранили GL_MODELVIEW 3d
  glLoadIdentity();
  glMatrixMode( GL_PROJECTION );
  glPushMatrix();// сохранили GL_PROJECTION 3d
  glLoadIdentity();
  gluOrtho2D( 0, ClientWidth, ClientHeight, 0 ); // 2d now!
  glMatrixMode( GL_MODELVIEW );
  // теперь здесь можно задавать координаты как в винде ))
  
  // рисуем квадрат на весь экран с текстурой, где посередине прозрачный круг
 
  glMatrixMode( GL_PROJECTION );
  glPopMatrix();// восстановили GL_PROJECTION 3d
  glMatrixMode( GL_MODELVIEW );
  glPopMatrix();// восстановили GL_MODELVIEW 3d
   SwapBuffers (WindowMap.WindowContext);
}
Добавлено через 2 минуты
Альфа смешивание не забываем включить
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.06.2012, 15:28  [ТС] 6
snake32, а мне уже стенсил понравился. А вот орто здесь точно ни к селу, ни к городу, это не автокад.
0
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,378
Записей в блоге: 5
26.06.2012, 16:03 7
taras atavin, не умничай. Я посмотрю как будешь прикручивать HUD к игре без 2d проекции.

автокад судя по одним эффектам к игре эта "игра" будет круче чем исследовательские программы NASA.
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.06.2012, 16:26  [ТС] 8
Кто такой худ?

Добавлено через 49 секунд
Цитата Сообщение от snake32 Посмотреть сообщение
судя по одним эффектам к игре эта "игра" будет круче чем исследовательские программы NASA.
Ну как приведи хоть один пример такого суперэфекта.

Добавлено через 4 минуты
Heads-Up Display (сокр. HUD) — термин в компьютерных играх, который обозначает часть графического интерфейса пользователя, служащего для отображения важной информации непосредственно во время игрового процесса
Это что ли? Ну во-первых у меня есть и чисто двумерное окно. Во-вторых запланирован вывод текста в текстуру. То есть есть, например, корабль, этот корабль имеет имя собственное и оно пишется прямо на борту корабля. Не над кораблём в плоскости экрана, а на самом корабле. Маны не будет вообще, а индикатор прочки оформлю где ни будь тоже в 3D. И это будет вообще не текст и даже не стрелочный индикатор. В диабло индикаторы жизни и маны были прозрачными шарами, заполняемые жидкостью и роль стрелки выполнял уровень жидкости. Что такого, если их тоже сделать в 3D7 У меня вряд ли будет именно шар, но что нибудь приду4маю. Ещё нужно количество золота, серебра, чемчуга, ядер. Их, видимо, придётся текстом. Ну так это будет одна из функций бота-информатора, он будет писать в чисто плоском окне.
0
Модератор
3365 / 2138 / 351
Регистрация: 13.01.2012
Сообщений: 8,316
26.06.2012, 17:11 9
эу.. так как насчет сферы которая отсечет все лишнее)?
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.06.2012, 19:15  [ТС] 10
Почему сферы? Мне надо отсечь по конусу и пока получается. Камеры пролетели уже 35 723 метров и глюков не видно. Конус следует за верхней камерой и поворачивается, следя за местной вертикалью, а в него попадает каждый раз чуть другая часть мира и в центре её как раз нижняя камера, ка я и хотел.

Добавлено через 1 час 15 минут
камеры пролетели уже более 60-ти километров до того места, где граница модели попала в горизонт. И на всём пути не было глюков. Габариты модели увеличены, камеры полетели заново. Теперь граница доступного пространства отстоит от центра уже на 131,072 км=70 морских миль. Более градуса дуги меридиана, или экватора.

Добавлено через 23 часа 18 минут
Камеры пролетели 262 144 метров и теперь уже на сверхзвуке. Глюков не видно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2012, 19:15
Помогаю со студенческими работами здесь

Вращающийся конус
Здравствуйте. Пытаюсь создать вращающийся конус, проштудировав форум, нашел статью как рисовать...

Реализовать трансформацию 4-х гранной пирамиды в конус
Возможно ли это реализовать в Open GL ? Если есть у кого-нибудь хоть какой-то пример трансформации....

Работа с трехмерными примитивами. Вокруг конуса GLU вращаются сфера GLUT и конус GLUT
создание виртуальной камеры gluLookAt и добавление эффектов анимации. вот само задание Вокруг...

применение отсечения !
Игрок относятся к одой из 3 лиг, и может пригласить на игру либо игрока со своей лиги, либо игрока...


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

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

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