ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Самописная игра: "Миссия МЧС" | страница 3 |
|
|
|
Канал Игры Мечты: «Самописная игра: "Миссия МЧС"» |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Это я уже понял, что вершины соединяются по часовой стрелке и именно в такой последовательности.
Меня заботит не то как это будет отрендерено и индексные буферы - мне не подходят, так как у меня значения vertex'ов постоянно изменяются. Смысл из записывать в буфер, если на следующем кадре X,Y уже другие с точностью до тысячных? Никаких буферов не хватит...
Вот собственно картина:
Cкрытый текст (кликните здесь для просмотра)
|
На ней красным обозначены номера точек, которые вызывают непонимание.
Если первый ряд алгоритмически понятно как сделать, то со вторым рядом уже непонятно: координата по Y у места соединения 26 должна быть та же, что и у места 3. Но только это не номера точек - это последовательность их соединения.
В общем не соображу какой должен быть алгоритм, хотя я его уже нарисовал...
Видимо, я пытаюсь осилить плоскость с неизвестным числом этих самых треугольников.
Попробую дорисовать эти квадраты дальше, может на двух строках получится понять...
|
|
|
ТехноМаг
360 EGP
     Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2516 Откуда: Кронштадт Зарегистрирован: 09.04.2007
 |
|
Ну у тебя количество-то тоже? Тогда разницы никакой. А вообще я тебе в приват скайп скинул. Сегодня поздно вечером/завтра можно будет подрындеть на эту тему.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Криптон
1011 EGP
       Рейтинг канала: 3(44) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
БулерМэн : |
Но только это не номера точек - это последовательность их соединения
|
Разве не очевидно? Надо хранить массив объектов/структур (в зависимости от используемого языка) типа "точка". Сетку треугольников (т.е "что с чем соединяется") хранить, упоминая точки по номерам в этом массиве. Координаты точек хранить в свойствах/полях объектов/структур.
добавлено спустя 4 минуты:
Ну или я так и не понял смысл проблемы
Последний раз редактировалось: Криптон (14:59 02-01-2016), всего редактировалось 1 раз |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Криптон : |
Координаты точек хранить в свойствах/полях объектов/структур.
|
Насколько я помню, этот путь отжирает скорострельность игры.
Многомерные структуры я уже реализовал, хоть они и быстрые - но все равно не дотягивают до "генерации на лету".
То есть, представь себе, что у тебя есть заранее известное количество точек. Нам нужны лишь координаты глубины, т.к. плоскость фиксированного размера и шага, поэтому
z_chord[x,y] (или си-подобнее - z_chord[x][y] )
Чтобы получить новую геометрию - в каждом кадре анимации умножаем значения массива z_chord[x,y] на соответствующий этой точке коэффициент, получая в итоге эффект волны.
Далее, нам нужно отрисовать 3d-сетку, которая "знает" о количестве точек по ширине и о количестве точек по высоте в данной сетке.
Криптон : |
Сетку треугольников (т.е "что с чем соединяется") хранить, упоминая точки по номерам в этом массиве.
|
В том то и дело, что я не знаю какие с какими точки соединять Иб бин 33 квадрата по ширине и 29 квадратов по высоте, итого - 1914 треугольников, и 5742 точки! Предлагаешь вручную туда их забить?
Допустим, по вышеописанному - можно сказать, что координаты точек я знаю, но
Криптон : |
Сетку треугольников (т.е "что с чем соединяется") хранить, упоминая точки по номерам в этом массиве.
|
я не понимаю как получить эту сетку Вручную разбирать и записывать в тексте все вершины - влом.
Или все настолько очевидно - а я туплю
добавлено спустя 7 минут:
ЗЫ Ладно товарищи, придется таки создать в 3dsmax эту большую сетку и посмотреть в тексте выходного OBJ-файла - что с чем соединяется.
Может дойдет до меня наконец.
Последний раз редактировалось: БулерМэн (17:25 02-01-2016), всего редактировалось 3 раз(а) |
|
|
Криптон
1011 EGP
       Рейтинг канала: 3(44) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
БулерМэн : |
Предлагаешь вручную туда их забить?
|
Объявляешь двумерный массив
Код: |
var
Points: array [0..33, 0..29] of TPoint;
|
(содержимое структуры/класса TPoint выбираешь под свои потребности. Я предполагаю, что там есть вещественные поля x,y,z)
На этапе инициализации:
Код: |
const
C_coeff = 0.01; {подобрать число в зависимости от размеров сцены}
var
i, j: integer;
begin
for i := 0 to 33 do
for j := 0 to 29 do
begin
Points[i,j].x := i * C_coeff;
Points[i,j].y := j * C_coeff;
end;
end;
|
Координаты x, y у нас заполнены
На этапе построения каждого кадра - перерассчитываем координату z:
Код: |
var
i, j: integer;
begin
for i := 0 to 33 do
for j := 0 to 29 do
Points[i,j].z := Z_Coord(Points[i,j].x, Points[i,j].y); {Некая функция, рассчитывающая координату z}
end;
|
И, наконец, выводим треугольники:
Код: |
var
i, j: integer;
begin
for i := 0 to 32 do //Диапазон перебора на единицу меньше
for j := 0 to 28 do //Диапазон перебора на единицу меньше
begin
//Этот кусок можно (и даже нужно) изложить иначе, я постарался написать максимально наглядно (и игнорируя снижение скорости исполнения).
//Кроме координат, может потребоваться вывод glColor4f, glNormal3f и т.д., но тогда в TPoint нужны соответствующие поля
//Отрисовываем один "квадратик" сетки
//Первый треугольник
glBegin(GL_TRIANGLES);
glVertex3f(Points[i,j].X, Points[i,j].Y, Points[i,j].Z);
glVertex3f(Points[i+1,j].X, Points[i+1,j].Y, Points[i+1,j].Z);
glVertex3f(Points[i+1,j+1].X, Points[i+1,j+1].Y, Points[i+1,j+1].Z);
glEnd;
//Второй треугольник
glBegin(GL_TRIANGLES);
glVertex3f(Points[i+1,j+1].X, Points[i+1,j+1].Y, Points[i+1,j+1].Z);
glVertex3f(Points[i,j+1].X, Points[i,j+1].Y, Points[i,j+1].Z);
glVertex3f(Points[i,j].X, Points[i,j].Y, Points[i,j].Z);
glEnd;
end;
end;
|
Если я нигде не облажался (последний раз использовал OpenGL полтора года назад), то должно работать.
добавлено спустя 3 минуты:
Таким образом массив Points задаёт сетку, а поля структур TPoint - координаты конкретных точек.
Последний раз редактировалось: Криптон (18:41 02-01-2016), всего редактировалось 4 раз(а) |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
как пошёл код, кажется понял чего так тщетно допытывается автор, как одним проходом без повторов забрать все вершины, GL_TRIANGLE_STRIP
но вообще вершины сейчас принято дублировать для каждого треугольника, это потому что без нормалей и тангентов мало чего путного изобразишь, и лучче конечно освоить шейдеры, раз они есть в мейкере, это как раз то что дохтур прописал, можно даже не особо вдаваться в нижележащую математику
_________________ This is what you get ...
(c) Radiohead |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Криптон : |
for i := 0 to 33 do
for j := 0 to 29 do
begin
Points[i,j].x := i * C_coeff;
Points[i,j].y := j * C_coeff;
end;
|
Инетересный подход. Но у нас разные языки программирования: в моем случае запись вида "Нечто.X" это объект с переменной X.
В твоем примере - получается, что двумерный массив это объект, у которого есть координаты X,Y,Z, так получается?
Потом, почему я бы сказал что этот код не подходит, понятно что это пример, но - вложенные циклы! Много вложенных циклов - на GameMaker'e - не взлетит... Да и ~5 тыс. объектов реально тормознут игру. Такие фокусы я уже проделывал в одной своей игре, но опять таки - тормоза и не вариант.
Да, наверное такая реализация будет работать, но чрезвычайно медленно
Sh.Tac. : |
кажется понял чего так тщетно допытывается автор, как одним проходом без повторов забрать все вершины, GL_TRIANGLE_STRIP
|
Да, используется режим TRIANGLE_STRIP.
Вот пример реализации:
где
d3d_vertex_texture(x,y,z,xtex,ytex) Add vertex (x,y,z) to the primitive with position (xtex,ytex) in the texture, blending with the color and alpha value set before.
То есть я вместо того, чтобы рисовать просто треугольники - рисую сразу текстурируемые треугольники.
Cкрытый текст (кликните здесь для просмотра)
Код: |
/////////////////////////////////////
d3d_vertex_texture(//1+
i*secure_x,
z_chord[i,n]*secure_x+n*secure_y,
z_chord[i,n]*secure_x+n*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//2+
i*secure_x,
z_chord[i,n+1]*secure_x+(n+1)*secure_y,
z_chord[i,n+1]*secure_x+(n+1)*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//3+
(i+1)*secure_x,
z_chord[i+1,n+1]*secure_x+(n+1)*secure_y,
z_chord[i+1,n+1]*secure_x+(n+1)*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//4+
i*secure_x,
z_chord[i,n]*secure_x+n*secure_y,
z_chord[i,n]*secure_x+n*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//5+
(i+1)*secure_x,
z_chord[i+1,n]*secure_x+n*secure_y,
z_chord[i+1,n]*secure_x+n*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//6+
i*secure_x,
z_chord[i,n]*secure_x+n*secure_y,
z_chord[i,n]*secure_x+n*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//7+
(i+1)*secure_x,
z_chord[i+1,n+1]*secure_x+(n+1)*secure_y,
z_chord[i+1,n+1]*secure_x+(n+1)*secure_y,
0,0//i*secure_x, n*secure_y
);
d3d_vertex_texture(//8+
(i+1)*secure_x,
z_chord[i+1,n]*secure_x+n*secure_y,
z_chord[i+1,n]*secure_x+n*secure_y,
0,0//i*secure_x, n*secure_y
);
|
|
Это существенно экономит время процессора.
Наверное вы заметили, что используется 4 вершины на текстурный треугольник.
На счет шейдеров в GM. В частности GM8 и 8.1 - цитирую:
То есть, оптимальным вариантом для данного решения - рисование сетки с заготовленными заранее текстурами.
Для сравнения: объекты со спрайтами - дают 6-10 FPS на моем не очень быстром процессоре AMD 2гГц и встроенной видеокарте nVidia. В противовес ставим "треугольники" в текущей кривой реализации - 12-14 FPS.
Sh.Tac. : |
но вообще вершины сейчас принято дублировать для каждого треугольника,
|
Ты имеешь в виду дублировать вообще все вершины?! Это же адово медленно будет... И вопрос - зачем?
Последний раз редактировалось: БулерМэн (21:28 02-01-2016), всего редактировалось 3 раз(а) |
|
|
Криптон
1011 EGP
       Рейтинг канала: 3(44) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
БулерМэн : |
что двумерный массив это объект, у которого есть координаты X,Y,Z, так получается?
|
Нет, это двумерный массив, каждый из элементов которого - объект (хотя я больше предпочитаю структуры - в Дельфи для них память выделяется/освобождается автоматом, и накладных расходов меньше, потому что не поддерживается наследственность). И запись вида "Points[i,j].x := i * C_coeff" означает, что взять элемент с индексами i и j, и в поле x этого элемента записать значение i * C_coeff.
По-моему, в Си такое тоже можно сделать.
БулерМэн : |
на GameMaker'e - не взлетит
|
Да, насчёт возможностей GameMaker'а я не в курсе. Жаль, что там простейшие вещи сделать нельзя
БулерМэн : |
И вопрос - зачем?
|
Насколько я понимаю, это нужно в тех случаях, когда, например, одна точка - общая для двух треугольников, и при этом для одного треугольника нормаль должна быть в одну сторону, а для другого - в другую. Ну, то есть, нужно чёткую грань нарисовать, а не плавный переход.
добавлено спустя 6 минут:
Криптон : |
По-моему, в Си такое тоже можно сделать.
|
Вроде, как-то так:
Код: |
//объявляем структуру "Точка"
struct Point
{
float x;
float y;
float z;
}
//Объявляем двумерный массив точек
Point data[33][29];
|
Но в сях я разбираюсь слабо...
Последний раз редактировалось: Криптон (22:00 02-01-2016), всего редактировалось 1 раз |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Криптон : |
Нет, это двумерный массив, каждый из элементов которого - объект
|
понятно, жаль в GML такие фокусы не работают - язык довольно простой.
Криптон : |
в Дельфи для них память выделяется/освобождается автоматом,
|
Автоматом в GML высвобождается память только если сам укажешь ее освободить. Но наверное это не автомат. И кажется даже не пистолет
Криптон : |
По-моему, в Си такое тоже можно сделать.
|
Можно, структуры там похоже работают, но у меня нет великого желания переписывать игру на Си, хотя я работал с графикой OpenGl на Си. Но по сравнению с GML - Си это ассемблер
Криптон : |
Жаль, что там простейшие вещи сделать нельзя
|
Почему, можно, просто циклы на интерпретируемом языке - отнимают много времени. Я так понимаю, что разработчики GM - не стали заморачиваться на тему трансляции в машинный код пользовательского кода, а оставили в открытом виде. Отсюда тормоза, в отличии от программ например на TurboPascal в среде Lazarus.
Криптон : |
нужно чёткую грань нарисовать, а не плавный переход.
|
Вот как раз четких граней мне не надо Я от них старательно избавиться хочу...
|
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
БулерМэн : |
На счет шейдеров в GM. В частности GM8 и 8.1 - цитирую:
|
как-то это несколько отличается от чуть более раннего
Цитата: |
В GAmeMakerStudio (то есть версия старше 8.1) - есть возможность работы с шейдерами, но придется переделывать ВЕСЬ код
|
как программаст могу лишь отметить, что переписывать код полезно, и лучче с чистого листа
ведь это очень печально, когда видение и понимание изменились, а код нет
_________________ This is what you get ...
(c) Radiohead |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Sh.Tac. : |
есть возможность работы с шейдерами, но придется переделывать ВЕСЬ код
|
зачем мне переписывать весь код, если у меня видеокарта не поддерживает шейдеры? М?
|
|
|
ТехноМаг
360 EGP
     Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2516 Откуда: Кронштадт Зарегистрирован: 09.04.2007
 |
|
БулерМэн : |
если у меня видеокарта не поддерживает шейдеры?
|
Это извени меня какая видеокарта у тебя. VooDoo штоли?
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
ТехноМаг : |
Это извени меня какая видеокарта у тебя. VooDoo штоли?
|
Cкрытый текст (кликните здесь для просмотра)
|
Хм. Думал CUDA нет в моей карте, а она внезапно есть
|
|
|
ТехноМаг
360 EGP
     Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2516 Откуда: Кронштадт Зарегистрирован: 09.04.2007
 |
|
БулерМэн : |
Думал CUDA нет в моей карте
|
Я что-то совсем запутался. При чем тут CUDA и шейдеры? Что-то Вы путаете, батенька
6150 - 2ая модель пиксельных и вершинных шейдеров (даже вроде 3ая там уже есть, но точно не помню). Да. 3ая есть ( http://www.nvidia.ru/page/legacy_gpu_mobo_features.html )
Куда немножко не из этой серии. Это. Ты в скайпе ответил? Я через пару часиков до дома доберусь - посмотрю.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (08:34 07-01-2016), всего редактировалось 3 раз(а) |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
FFP видеокарт, то есть без шейдеров на рынке уже нет давно..
_________________ MOV topka, C++ |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Апну темку, работа по игре стоит, ровно так как пожирает все время работа... но борьба с этим идет
|
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Внезапно нашлось время пофиксить некоторые баги в основной игре.
Теперь самолет взрывается корректно при столкновении со зданиями
|
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Вам тут самолет к подъезду подали
|
|
|
БулерМэн
420 EGP
   Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Дорогу осилит идущий, это как раз про эту игру
Переделал сетку на trianglelist и добавил UV-координаты текстуры, получилась вот такая поверхность:
Гифка 1,7 мБ
Cкрытый текст (кликните здесь для просмотра)
|
На мой взгляд - похоже на волны на воде. А вы как считаете?
Последний раз редактировалось: БулерМэн (06:12 31-12-2016), всего редактировалось 1 раз |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
Похоже на синее желе, намазанное на лист бумаги, который кто-то пускает волнами. А UV-сдвиг никак не сделать?
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
|
|
|
Канал Игры Мечты: «Самописная игра: "Миссия МЧС"» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Трупы - они ни хорошие, ни плохие. Они просто трупы. (объяснил Stranger)
|
» Самописная игра: "Миссия МЧС" | страница 3 |
|