Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите направление в котором лучше рыть? [Delphi, Windows]


Страницы:   1 2

MegaVolt ©   (2007-05-29 17:35:00) 

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

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

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

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

Но остаются вопросы.
1. Правильно ли я мыслю о путях реализации задачи?
2. Как преобразовать координаты из моей декартовой системы в координаты с учётом преспективы? И может ли это делать исспользуя какие то встроенные средства Direct3D?
3. Как осуществлять пересчёт для различных положений камеры. Опять же может ли это делать Direct3D на автомате?


Yashin   (2007-06-01 21:05:00) [1]

Если понимать что эта функция делает, то ничего страшного не произойдет


@!!ex   (2007-05-31 22:21:00) [2]

Не стоит юзать gluLookAt ИМХО. В итоге она делает тоже самое что функции вращения и перемещения, но не явно, и не понятно какая система координат получается в итоге. ИМХО ИМХО ИМХО... Ну не люблю я эту функцию. :)


Yashin   (2007-05-31 20:19:00) [3]

Не понял на чем же ты пишешь, на OpenGl или DirectX? Ты наверно компилируешь команды в OpenGL или все таки у тебя VBO? если компилируешь, то это не очень то ускоряет прорисовку и чтобы что-то поменять надо компилировать заново. VBO обычно применяют для статичных объектов, потому что если изменять его каждый кадр, то это может не ускорить прорисовку, а наоборот замедлить. посмотри вот эту функцию GluLookAt , она может задавать проекцию вида, так будто ты смотришь из камеры.


@!!ex   (2007-05-31 19:04:00) [4]

> [25] Sapersky   (31.05.07 17:31)

Бе, гадость какая..
Хотя может и лучше, в данном случае.


Sapersky   (2007-05-31 17:31:00) [5]

Сделать задачу нужно очень быстро и времени проштудировать 500 страничную книгу нет

GLScene?


MegaVolt   (2007-05-31 13:20:00) [6]

>Тогда откуда вопрос про камеру???

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

>Да тормоза, не тормоза, какая разница? Надо смотреть кто у тебя сожрал время.

AQTime упал и отказался мониторить :( Попробую перегрузится может поможет :(


@!!ex   (2007-05-31 12:57:00) [7]

> Возможно я неправильно исспользую устоявшиеся термины. Для
> меня сцена это набор точек, линий и примитивов которые я
> загрузил в видюшку через координаты их вершин. Далее карточка
> уже внутри по моим командам их преобразовывает, поворачивает
> и проецирует на плоскость.

При каждой отрисовки нужно задавать опять ВСЕ вершины.
То что ты описал - это VBO. Но про VBO пока забудь, разберись сначала, как это работает.


> Собственно вопрос в следующем. Если мне нужно в этой сцене
> поменять десяток вершин есть ли способы из заменить прямо
> в памяти карточки не трогая ранее загруженных координат.
> Или я должен загрузить все точки заново.

Ты должен грузить все точки заново, даже если ты нчие не менял. Они не хранятся в видеокарте(если это не VBO)


> Чесно говоря не совсем понятно что вызвало ваше веселье?
> Подход про который я спрашиваю вполне очевидный способ
> оптимизации. Когда вместо загрузки всех координат я гружу
> только изменившиеся. Возможно в современных видеоускорителях
> этой возможности нет по каким то соображениям. Вот я и интересуюсь
> сделана ли подобная возможность оптимизации или нет.

Сделана. Но не стоит ей польщоваться пок ане начнешь нормлаьно ориентироваться в API и принципах работы графики.


> Я по профессии радиоинженер и мыслю несколько в другой плоскости.
> Я понимаю как это сделать в железе или програмно с нуля.
> Но вот логика уже готовых програмных решений таких как OpenGL
> мне не всегда понятна. Поэтому и возникают возможно детсткие
> вопросы.

Вот поэтому и говорят тебе - читай книжки. Поймешь суть. Читай книжки, блин.

P.S.
Тогда откуда вопрос про камеру???


> Это не совсем тормоза. Это пауза от того момента когда я
> нажал ввод в командере до того момента когда появилась форма.
> У меня это время порядка 1-2 секунд. У вас этого нет? Т.е.
> форма выскакивает мгновенно как например notepad?

Да тормоза, не тормоза, какая разница? Надо смотреть кто у тебя сожрал время.
У меня все мгновенно запускается.

P.S.
LOL - скорее не как смех, а как удивление.


MegaVolt   (2007-05-31 12:56:00) [8]

Т.е. ещё иначе это выглядит так:
Я умею строить дома из кирпичей. И знаю что есть два способа получить дом где вместо одного обычного окна установлен стеклопакет:
1. Убрать старое окно и поставить новое.
2. Развалить дом к чёрту и построить новый точно такой же но уже со стеклопакетом.

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


MegaVolt   (2007-05-31 12:39:00) [9]

>LOL. Собственно этот вопрос и вызвал у мене желание все раскатать...
Что есть сцена в вашем понимании?

Возможно я неправильно исспользую устоявшиеся термины. Для меня сцена это набор точек, линий и примитивов которые я загрузил в видюшку через координаты их вершин. Далее карточка уже внутри по моим командам их преобразовывает, поворачивает и проецирует на плоскость.

Собственно вопрос в следующем. Если мне нужно в этой сцене поменять десяток вершин есть ли способы из заменить прямо в памяти карточки не трогая ранее загруженных координат. Или я должен загрузить все точки заново.

Чесно говоря не совсем понятно что вызвало ваше веселье? Подход про который я спрашиваю вполне очевидный способ оптимизации. Когда вместо загрузки всех координат я гружу только изменившиеся. Возможно в современных видеоускорителях этой возможности нет по каким то соображениям. Вот я и интересуюсь сделана ли подобная возможность оптимизации или нет.

Я по профессии радиоинженер и мыслю несколько в другой плоскости. Я понимаю как это сделать в железе или програмно с нуля. Но вот логика уже готовых програмных решений таких как OpenGL мне не всегда понятна. Поэтому и возникают возможно детсткие вопросы.

>По поводу первого вопроса:
>У меня ниче не тормозит. Запускаешь AQTime и смотришь, какая функция
>сожрала все время.

Это не совсем тормоза. Это пауза от того момента когда я нажал ввод в командере до того момента когда появилась форма. У меня это время порядка 1-2 секунд. У вас этого нет? Т.е. форма выскакивает мгновенно как например notepad?


@!!ex   (2007-05-31 11:52:00) [10]

По поводу первого вопроса:
У меня ниче не тормозит. Запускаешь AQTime и смотришь, какая функция сожрала все время.


@!!ex   (2007-05-31 11:51:00) [11]

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

LOL. Собственно этот вопрос и вызвал у мене желание все раскатать...
Что есть сцена в вашем понимании?


MegaVolt   (2007-05-31 11:45:00) [12]

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

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

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

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

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

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

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

Заранее благодарен.


Yashin   (2007-05-30 23:04:00) [13]

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


RzCoDer   (2007-05-30 18:38:00) [14]


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

в точку ;)


@!!ex_   (2007-05-30 18:01:00) [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).
А вообще я рекомендую читать книжки. Ред Бук, как я понимаю, вы и не открывали.


MegaVolt   (2007-05-30 17:31:00) [16]

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


MegaVolt   (2007-05-30 17:13:00) [17]

И ещё вопрос :)
Если в сцене что то поменялось то перегружать её нужно всю или только то что изменилось?


MegaVolt   (2007-05-30 17:11:00) [18]

Огромное спасибо за примерчик. То что нужно :)
Примерчик просто супер.

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

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


@!!ex_   (2007-05-30 16:54:00) [19]

> OGL так OGL :)
> Есть ли где нибудь примеры вращения какого нибудь просто
> го оъекта с учётом преспекивы.
>
> Например кубика?
>
> Дальше я сам по аналогии додумаю.
>
> Заранее благодарен.

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


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

Версия 1.0 идет с Delphi, и с MSVC++ тоже идет.


MegaVolt   (2007-05-30 16:26:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо