Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 9

Эффект бесконечного ландшафта

08.11.2012, 18:21. Показов 3612. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Есть задачка - нарисовать ландшафт по карте высот, ездить по нему стрелками, а также сделать так, чтобы он никогда не заканчивался. С первыми пунктами справилась, с бесконечностью ландшафта что делать, не пойму оО
java, opengl.
Вкратце это безобразие выглядит так:

Java
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
public void display(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();
        GLU glu = new GLU();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
        
        gl.glEnable(GL.GL_TEXTURE_2D); //включает текстуры
        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE); 
      
        
        if (right==1){
         b=b-0.5;
        }
        if (left==1){
        b=b+0.5;
        }
        if (up==1){
        ahead=ahead+0.5;
        if (ahead<-60){ahead=0;}
        if (ahead>0){ahead=-60;}
        }
        if (down==1){
        ahead=ahead-0.5;
        if (ahead>0){ahead=-60;}
        if (ahead<-65){ahead=0;}
        }
        if (a==1){
            if (y11<=70){
              y11=y11+0.1;
              y22=y22+0.1;
            }
        }
        if (a1==1){
            if (y11>=-1){
             y11=y11-0.1;
             y22=y22-0.1;
            }
        }
       
        gl.glLoadIdentity();
        glu.gluLookAt(0, y11, ahead,   0, y22, 3,    0, 1.5, ahead);
        gl.glRotated(b, 0, 1, 0);      
 
        gl.glBindTexture(GL.GL_TEXTURE_2D, TextureSet[0].getTextureObject());
        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.glEnable(GL.GL_NORMALIZE);
 
        gl.glPushMatrix();
        gl.glBegin(GL.GL_TRIANGLES);
          
          for (x = 0; x < mapSize; x+=stepSize)
            for (z = 0; z < mapSize; z+=stepSize)
            {
                y1 = -getHeight(x,z)/10;
                y2 = -getHeight(x+stepSize,z)/10;
                y3 = -getHeight(x+stepSize,z+stepSize)/10;
                y4 = -getHeight(x,z+stepSize)/10;
                x1 = 100*(x)/mapSize-50;
                x2 = 100*((x)+16)/mapSize-50;
                z1 = 100*z/mapSize-50;
                z2 = 100*(z+16)/mapSize-50;
                gl.glTexCoord2d(0, 0);
                gl.glVertex3d(x1,  y1, z1);
                gl.glTexCoord2d(1, 0);
                gl.glVertex3d(x2,  y2, z1);
                gl.glTexCoord2d(1, 1);
                gl.glVertex3d(x2,  y3, z2);
                gl.glTexCoord2d(1, 1);
                gl.glVertex3d(x2,  y3, z2);
                gl.glTexCoord2d(0, 1);
                gl.glVertex3d(x1,  y4, z2);
                gl.glTexCoord2d(0, 0);
                gl.glVertex3d(x1,  y1, z1);
            }
 
          gl.glEnd();
        gl.glPopMatrix();
 
        gl.glFlush();
        gl.glDisable(GL.GL_TEXTURE_2D);
       
    }
з.ы. ещё есть непонятность с освещением - как я ни меняю параметры, свету хоть бы хны. Разница есть только в том случае, если закомменчиваю его нафиг...

з.ы.ы. да, кстати. Есть даже руководство:
Для того, чтобы создать эффект "бесконечного" ландшафта при перемещении камеры, необходимо разработать алгоритм подстановки цикла для создания плоскости из треугольников с одной картой высот. Это значит, что если наблюдатель находится на плоскости (5), то должны уже быть построены аналогичные плоскости 1,2,3,4,6,7,8,9 и при перемещении эти плоскости должны каждый раз перестраиваться.
И нарисован примерно такой квадратик
1 2 3
4 5 6
7 8 9
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2012, 18:21
Ответы с готовыми решениями:

Как сделать эффект размытия (эффект стекла) в Xaml?
Как сделать эффект размытия(эффект стекла) в Xaml?

Как убрать эффект вдавливания с формы? (3d эффект)
Не знаю как задать по конкретней вопрос, поэтому выложу так: вот в местах, где стрелочки какой то стрёмный эффект 3d, все свойства...

Эффект затухания/появления и слайд эффект
Привет Всем. Подскажите как можно решить эту задачу? Пока с тем что есть выходит криво: $(&quot;#amben&quot;).animate({opacity:...

8
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
08.11.2012, 18:43
Цитата Сообщение от LeAnnAlice Посмотреть сообщение
з.ы. ещё есть непонятность с освещением - как я ни меняю параметры, свету хоть бы хны.
Нормали не пробовали задействовать? Без них свет не считается.

Цитата Сообщение от LeAnnAlice Посмотреть сообщение
с бесконечностью ландшафта что делать
В руководстве всё описано. Что не понятно? Как вычислить какой плоскости принадлежит камера?
0
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 9
08.11.2012, 18:46  [ТС]
Не понимаю про свет((( что и куда нужно воткнуть, чтобы работало?
Вот кусок кода:
Java
1
2
3
4
5
6
7
8
9
10
gl.glClearColor(0.8f, 0.9f, 1.0f, 0.0f);
        gl.glShadeModel(GL.GL_SMOOTH); // try setting this to GL_FLAT and see what happens.
        gl.glEnable(GL.GL_LIGHTING);
        gl.glEnable(GL.GL_LIGHT0);
        gl.glLightModelf(GL.GL_LIGHT_MODEL_AMBIENT, 0);
        gl.glLightiv(GL.GL_LIGHT0, GL.GL_POSITION, new int[] { -1, -3, -3, 0 }, 0);
        gl.glColorMaterial(GL.GL_FRONT,GL.GL_DIFFUSE);
        gl.glEnable(GL.GL_COLOR_MATERIAL);
        gl.glEnable(GL.GL_DEPTH_TEST); //проверка пересечения граней
        gl.glEnable(GL.GL_NORMALIZE);
В руководстве - теоретически все понятно. А дальше проблемы >< Ни математически, ни логически в этом направлении не думается, никак...
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
08.11.2012, 18:54
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                gl.glNormal3f( n1, n2, n3 );//  <- сюда
 
                gl.glTexCoord2d(0, 0);
                gl.glVertex3d(x1,  y1, z1);
 
                gl.glTexCoord2d(1, 0);
                gl.glVertex3d(x2,  y2, z1);
 
                gl.glTexCoord2d(1, 1);
                gl.glVertex3d(x2,  y3, z2);
 
 
                gl.glNormal3f( n4, n5, n6 );//  <- сюда
 
                gl.glTexCoord2d(1, 1);
                gl.glVertex3d(x2,  y3, z2);
 
                gl.glTexCoord2d(0, 1);
                gl.glVertex3d(x1,  y4, z2);
 
                gl.glTexCoord2d(0, 0);
                gl.glVertex3d(x1,  y1, z1);
Но прежде чем вставлять, их нужно посчитать.
Введите в браузере: нормаль к треугольнику
1
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 9
09.11.2012, 03:56  [ТС]
о, то есть это не в init пихать? оО надо же. Благодарю.
А с какой стороны к бесконечности подкатывать? По идее да, надо бы знать, где находится камера... посчитать, похоже, проблема >< вернее, не столько посчитать, сколько сравнить с данными о том, где отрисовывается поверхность оО

Добавлено через 8 часов 58 минут
Нормали я вроде бы посчитала, но все равно ноль эффекта оО
Вот что получилось:
Java
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
//считаем нормали------------                      
                        n1=(x2-x1)*(x2-x1);
                        n2=(y2-y1)*(y3-y1);
                        n3=0;
                        dlina_normali=Math.sqrt(n1*n1+n2*n2);
                        n1=n1/dlina_normali;
                        n2=n2/dlina_normali;
                        //=============
                              gl.glNormal3d(n1, n2, n3);
                gl.glTexCoord2d(0, 0);
                gl.glVertex3d(x1,  y1, z1);
                gl.glTexCoord2d(1, 0);
                gl.glVertex3d(x2,  y2, z1);
                gl.glTexCoord2d(1, 1);
                gl.glVertex3d(x2,  y3, z2);
                        //считаем нормали------------
                        n1=(x1-x2)*(x1-x2);
                        n2=(y4-y3)*(y1-y3);
                        n3=0;
                        dlina_normali=Math.sqrt(n1*n1+n2*n2);
                        n1=n1/dlina_normali;
                        n2=n2/dlina_normali;
                        //=============
                              gl.glNormal3d(n1, n2, n3);
                gl.glTexCoord2d(1, 1);
                gl.glVertex3d(x2,  y3, z2);
                gl.glTexCoord2d(0, 1);
                gl.glVertex3d(x1,  y4, z2);
                gl.glTexCoord2d(0, 0);
                gl.glVertex3d(x1,  y1, z1);
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
09.11.2012, 13:24
Цитата Сообщение от LeAnnAlice Посмотреть сообщение
Нормали я вроде бы посчитала
Что ж такое... формула не верная(где же векторное произведение) и ошибки есть. Почему n3 у вас всегда 0?
Специально делал тему для вычисления нормалей(правда для Delphi): Простая работа с OpenGL на Delphi. Вычисление нормали.

По настройке света ничего сказать не могу(не помню). Но есть куча туториалов.
0
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 9
09.11.2012, 13:33  [ТС]
n3=0 потому что одна из скобок = z2-z2 или z1-z1
А вот по этому: "создать эффект "бесконечного" ландшафта при перемещении камеры"???
Свет это так, не сильно важно...

Добавлено через 5 минут
И ещё, у меня куда-то "упрыгивает" камера при ahead=0 (то есть тогда, когда при перемещении камеры я дохожу до края куска ландшафта), ну так же не должно быть? (если все условия убрать)
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
09.11.2012, 14:38
Цитата Сообщение от LeAnnAlice Посмотреть сообщение
n3=0 потому что одна из скобок = z2-z2 или z1-z1
А вам не кажется странным появление таких скобок? Эта явная ошибка. Смотрите формулы внимательнее. GetHeight не всегда же одинаковые значения будет возвращать.
Цитата Сообщение от LeAnnAlice Посмотреть сообщение
эффект "бесконечного" ландшафта
Я бы сделал для начала так:
1. Определяем координаты квадрата куда попадает камера
2. Рисуем копии рельефа в квадрат где камера и вокруг её.
3. ....
4. profit
0
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 9
24.11.2012, 03:57  [ТС]
Java
1
2
3
4
5
6
7
8
nax=x1-x2; nbx=x1-x2;
                        nay=y1-y3; nby=y1-y2;
                        naz=z1-z2; nbz=z1-z2;
                        len=Math.sqrt(nax*nbx + nay*nby + naz*nbz);
                        nax=nax/len; nbx=nbx/len;
                        nay=nay/len; nby=nby/len;
                        naz=naz/len; nbz=nbz/len;
                        gl.glNormal3d(nax*nbx,nay*nby,naz*nbz);
Вот так посчитала, не работает ><
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2012, 03:57
Помогаю со студенческими работами здесь

Генерирование ландшафта
Товарищи, вообщем нажимаю размер массива 50*50 - генерирую поверхность. Нажимаю 100*100 все равно генерируется массив 50*50. Не знаю как...

Построение ландшафта
Здравствуйте. Мне надо построить ландшафт по карте высот. У нашел пример(код ниже). Карта высот в формате RAW все работает, все строится. ...

создание ландшафта
здравствуйте. необходимо создать ландшафт на delphi по имеющейся карте. при работе с маленькими картами это легко осуществимо с помощью...

Программирование ландшафта
Посоветуйте книги/статьи, где рассказано о программировании ландшафта (желательно с 0 и с примерами на C++).

создание ландшафта
Здравствуйте! хочу написать прогу для рисования ландшафта. Подскажите пожалуста с чего начинать изучал только паскаль


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru