Конференция "Игры" » Подскажите направление в котором лучше рыть? [Delphi, Windows]
 
  • MegaVolt © (29.05.07 17:35) [0]
    Есть фигуры и линии заданые координатами вершин в декартовом пространстве. Есть точка заданная координатами в которой должна распологатся камера.
    Нужно отрисовать элементы на экране с учётом преспективы и координаты камеры.

    Как можно это сделать максимально просто? Количество точек задающих вершины элементов не превосходит 300-400.

    Перерисовка экрана желательна с высокой частотой (больше 25 fps в идеале 100fps)

    Очень похоже что просто рисование в фоне на некой битмапке и копирование её на экран будет медленным :(
    Склоняюсь к Direct3D. Примеры по рисованию линий и треугольников залитых цветом нашел. Так что нарисовать картинку смогу.

    Но остаются вопросы.
    1. Правильно ли я мыслю о путях реализации задачи?
    2. Как преобразовать координаты из моей декартовой системы в координаты с учётом преспективы? И может ли это делать исспользуя какие то встроенные средства Direct3D?
    3. Как осуществлять пересчёт для различных положений камеры. Опять же может ли это делать Direct3D на автомате?
  • @!!ex_ (29.05.07 17:51) [1]
    OpenGL, DirectX, все это умеют. Вообще элемнентарщина.
    Рекомендую Почитать Red Book или Краснов. "OpenGL для Delphi" если не знаешь английского.
    Хотя вроде Ред бук есть на русском где то.
  • RzCoDer © (29.05.07 18:57) [2]
    русский ред бук http://old.mirgames.ru/files/books/
  • @!!ex_ (29.05.07 19:17) [3]
    http://www.delphisources.ru/pages/sources/graph/1_graph.html
    Basic Game Engine - первая ссылка.
    Это пример от Яна Хорна(мир его праху), по которму лично я начинал. Очень хорошо понимаешь че и как работает. И модуль текстурный удобный.
  • Yashin © (29.05.07 21:44) [4]
    На OpenGL это делается в пять действий
  • MegaVolt © (30.05.07 10:46) [5]
    Т.е. на OpenGL эта задача решается проще?

    За литературу спасибо.
  • @!!ex_ (30.05.07 13:49) [6]
    > [5] MegaVolt ©   (30.05.07 10:46)

    На DirectX - тоже элементарно. Но мы за OGL! :))

    Это можно и ручками делать, ниче сложного вобщем то нет.
    Просто ОГЛ уже сам считает глубину, перспектиыное искажение и все прочее.
  • MegaVolt © (30.05.07 14:45) [7]
    >Это можно и ручками делать, ниче сложного вобщем то нет.

    Ручками что? Пересчёт координат? Это понятно. У меня даже пример есть :) Но хотелось бы и от этого избавится.

    >Просто ОГЛ уже сам считает глубину, перспектиыное искажение и все прочее.
    А DirectX сам не считает?

    OpenGL сейчас поддержан во всех карточках? Или могут быть проблемы?
  • @!!ex_ (30.05.07 15:34) [8]
    > [7] MegaVolt ©   (30.05.07 14:45)
    > >Это можно и ручками делать, ниче сложного вобщем то нет.
    >
    > Ручками что? Пересчёт координат? Это понятно. У меня даже
    > пример есть :) Но хотелось бы и от этого избавится.
    >
    > >Просто ОГЛ уже сам считает глубину, перспектиыное искажение
    > и все прочее.
    > А DirectX сам не считает?

    И Direct3D тоже сам считает. Но мы все равно за ОГЛ. :))


    > OpenGL сейчас поддержан во всех карточках? Или могут быть
    > проблемы?

    OpenGL поддерживается всеми карточками, и поодерживался всегда. А еще он поддерживается практически всеми операционными системами.
  • MegaVolt © (30.05.07 16:22) [9]
    OGL так OGL :)
    Есть ли где нибудь примеры вращения какого нибудь просто го оъекта с учётом преспекивы.

    Например кубика?

    Дальше я сам по аналогии додумаю.

    Заранее благодарен.
  • MegaVolt © (30.05.07 16:26) [10]
    Где брать заголовочный файлы для OGL?
  • @!!ex_ (30.05.07 16:54) [11]
    > OGL так OGL :)
    > Есть ли где нибудь примеры вращения какого нибудь просто
    > го оъекта с учётом преспекивы.
    >
    > Например кубика?
    >
    > Дальше я сам по аналогии додумаю.
    >
    > Заранее благодарен.

    Примерчки основанный на примере Краснова. Добавил выбор типа отрисовки(Линии, полигоны) и вращение мышкой(ПРавда кривое, но мне влом нормально делать, сам разбирайся):
    http://afera-net.narod.ru/Cube_Rotate.rar


    > Где брать заголовочный файлы для OGL?

    Версия 1.0 идет с Delphi, и с MSVC++ тоже идет.
  • MegaVolt © (30.05.07 17:11) [12]
    Огромное спасибо за примерчик. То что нужно :)
    Примерчик просто супер.

    Есть несколько вопросиков:

    1. Почему при запуске происходит тормоз примерно на секунду другую? Это как то связано с инициализаций OpenGL?
    2. Что нужно поправить чтобы камеру можно было приближать удалять от объекта?
  • MegaVolt © (30.05.07 17:13) [13]
    И ещё вопрос :)
    Если в сцене что то поменялось то перегружать её нужно всю или только то что изменилось?
  • MegaVolt © (30.05.07 17:31) [14]
    И ещё вопрос:
    Правильно ли я понимаю: чтобы вывести текст непродвижный относительно камеры то вначале осуществляем перемещение камеры а потом добавляем текст?
  • @!!ex_ (30.05.07 18:01) [15]
    > [14] MegaVolt ©   (30.05.07 17:31)

    Блин, у тебя же написано в анкеты, что образование высшее...
    Ты на стекольщика чтоли учился? Вспомни Линейную Алгебру. Перемножение матриц, перенос системы координат.

    Я без проблем отвечу на вопросы, но ты спрашиваешь основы, я просто не смогу их объяснить, я не учитель.

    Значит так. Как работает OpenGL и любой другой API для вывода 3д графики(грубо и приближенно).
    Есть система коодринат. ПДСК(Перпендикулярная Декартова Система Координат)
    ДЛя того, чтобы нарисовать некий примитив(точку, линию, треугольник, квадрат) нужно передать на конвейер видеокарты набор вершин(вершина - одна точка примитива с набором параметров, в твоем случае только цвет и координаты). передавать ВСЕ вершины нужно при КАЖДОЙ отрисовки.
    Это делается здесь:
    glBegin(GL_QUADS);
      glVertex3f(1.0, 1.0, 1.0);
      glVertex3f(-1.0, 1.0, 1.0);
      glVertex3f(-1.0, -1.0, 1.0);
      glVertex3f(1.0, -1.0, 1.0);
    glEnd;


    Первая команда - говорим, что все далее переданные вершины - описывают квады. Соответственно 4 вершины - один квад. В коде каждый квад вынесен в свой блок glBegin glEnd, но это учебный пример, пожтому так сделано, вообще же можно оставить только первый glBegin и последний glEnd.
    Далее передаются координаты с помощью процедуры glVertex3f. 3 - означает, что передаем три координаты, еще бывает 2 - для плоскости. f - означает что в качестве парметров будет передан тип float(в delphi - single).
    Приведенный список команд НАРИСУЕТ квадрат в видео памяти(в примере используется двойная буфферизация. Тоесть мы не на экран все рисуем, а в буффер, а потом одной коммандой SwapBuffers(DC) выводим все на экран. Это избавляет от мерцания и всяких других неприятных эффектов). Стоит учитывать, что в момент вывода вершины на конвеере ее координаты преобразуются с помощью матрицы преобразоания.
    по умолчанию эта матрица единичная. Соответственно  мы работаеем в исходной системе коордианты.
    Мы можем систему координат вращать(glRotate - первый параметр в градусах, три остальных - оси, выставляем 1 для той оси, по которой будем вращать и 0 для всех остальных), перемещать(glTranslate - тупо три числа, перемещение по трем осям), масштабировать(glScale - три числа, коэффициент масштабирования для каждой оси), также мы можем восстановить исходную матрицу командой glLoadIdentity.
    Если мы например выполним команду glTranslatef(10,0,0); ТО передав вертекс с коодринатами 0,0,0, в конечном результате ее координаты будут равыно 10,0,0. Соответственно, если мы перед заданием вертекса применим команду glRotatef(90,0,1,0); то координаты конечные будут уже 0,10,0 и т.д.
    Соответственно перемещение камеры делается очень просто. Если нам нужна камера с координатами 10,10,5, то мы должна переместить систему координат в -10,-10,-5 с вращением соответственно также. Если нужно приблизить предмет, есть два варианта: переместить камеру ближе к нему(glTranslate), примениьт к объекту масштабирование(glScale).
    А вообще я рекомендую читать книжки. Ред Бук, как я понимаю, вы и не открывали.
  • RzCoDer © (30.05.07 18:38) [16]

    > Правильно ли я понимаю: чтобы вывести текст непродвижный
    > относительно камеры то вначале осуществляем перемещение
    > камеры а потом добавляем текст?

    в точку ;)
  • Yashin © (30.05.07 23:04) [17]
    @!!ex_ непонятно зачем ты все это объясняешь, это все есть в любой книжке, но я не думаю что он прочитал хоть одну дальше пятой страницы. Он еще с основами не разобрался, а ему уже надо камеру отодвигать.
  • MegaVolt © (31.05.07 11:45) [18]
    @!!ex_
    >Блин, у тебя же написано в анкеты, что образование высшее...
    >Ты на стекольщика чтоли учился? Вспомни Линейную Алгебру. >Перемножение матриц, перенос системы координат.
    >Я без проблем отвечу на вопросы, но ты спрашиваешь основы, я просто не >смогу их объяснить, я не учитель.

    Yashin
    >@!!ex_ непонятно зачем ты все это объясняешь, это все есть в любой книжке, но я не думаю что он прочитал хоть одну дальше пятой страницы. Он еще с основами не разобрался, а ему уже надо камеру отодвигать.

    Ребяты давайте жить дружно. Теорию я сам прекрасно знаю и понимаю, и Red Book полистал. И если бы это нужно было сделать на каком нибудь процессоре то сделал бы без проблем.

    Проблема же понять идеологию конкретной реализации. Т.е. вопросы не про теорию а что то типа ДА/нет можно/неможно или название комманды. Т.е. так как ответил RzCoDer мол мыслишь правильно копай дальше.

    Вот например на вопрос про приближение камеры достаточно было бы написать какой коммандой это делать дальше я уже сам разберусь что в неё передать.

    Так что вопросы остались:
    1. Почему при запуске происходит тормоз примерно на секунду другую? Это как то связано с инициализаций OpenGL? Желательно с пояснениями. Хотя бы на одну строчку.

    2. Если в сцене что то поменялось то перегружать её нужно всю или только то что изменилось? Варианты ответов перегружать всю/перегружать частично

    Заранее благодарен.
  • @!!ex © (31.05.07 11:51) [19]
    > Если в сцене что то поменялось то перегружать её нужно всю
    > или только то что изменилось? Варианты ответов перегружать
    > всю/перегружать частично

    LOL. Собственно этот вопрос и вызвал у мене желание все раскатать...
    Что есть сцена в вашем понимании?
 
Конференция "Игры" » Подскажите направление в котором лучше рыть? [Delphi, Windows]
Есть новые Нет новых   [119209   +23][b:0][p:0.001]