Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];

Вниз

Подскажите направление в котором лучше рыть?   Найти похожие ветки 

 
MegaVolt ©   (2007-05-29 17:35) [0]

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

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

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

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

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


 
@!!ex_   (2007-05-29 17:51) [1]

OpenGL, DirectX, все это умеют. Вообще элемнентарщина.
Рекомендую Почитать Red Book или Краснов. "OpenGL для Delphi" если не знаешь английского.
Хотя вроде Ред бук есть на русском где то.


 
RzCoDer ©   (2007-05-29 18:57) [2]

русский ред бук http://old.mirgames.ru/files/books/


 
@!!ex_   (2007-05-29 19:17) [3]

http://www.delphisources.ru/pages/sources/graph/1_graph.html
Basic Game Engine - первая ссылка.
Это пример от Яна Хорна(мир его праху), по которму лично я начинал. Очень хорошо понимаешь че и как работает. И модуль текстурный удобный.


 
Yashin ©   (2007-05-29 21:44) [4]

На OpenGL это делается в пять действий


 
MegaVolt ©   (2007-05-30 10:46) [5]

Т.е. на OpenGL эта задача решается проще?

За литературу спасибо.


 
@!!ex_   (2007-05-30 13:49) [6]

> [5] MegaVolt ©   (30.05.07 10:46)

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

Это можно и ручками делать, ниче сложного вобщем то нет.
Просто ОГЛ уже сам считает глубину, перспектиыное искажение и все прочее.


 
MegaVolt ©   (2007-05-30 14:45) [7]

>Это можно и ручками делать, ниче сложного вобщем то нет.

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

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

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


 
@!!ex_   (2007-05-30 15:34) [8]

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

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


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

OpenGL поддерживается всеми карточками, и поодерживался всегда. А еще он поддерживается практически всеми операционными системами.


 
MegaVolt ©   (2007-05-30 16:22) [9]

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

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

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

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


 
MegaVolt ©   (2007-05-30 16:26) [10]

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


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

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

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


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

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


 
MegaVolt ©   (2007-05-30 17:11) [12]

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

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

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


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

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


 
MegaVolt ©   (2007-05-30 17:31) [14]

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


 
@!!ex_   (2007-05-30 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 ©   (2007-05-30 18:38) [16]


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

в точку ;)


 
Yashin ©   (2007-05-30 23:04) [17]

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


 
MegaVolt ©   (2007-05-31 11:45) [18]

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

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

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

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

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

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

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

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


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

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

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


 
@!!ex ©   (2007-05-31 11:52) [20]

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


 
MegaVolt ©   (2007-05-31 12:39) [21]

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

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

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

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

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

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

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


 
MegaVolt ©   (2007-05-31 12:56) [22]

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

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


 
@!!ex ©   (2007-05-31 12:57) [23]

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

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


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

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


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

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


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

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

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


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

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

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


 
MegaVolt ©   (2007-05-31 13:20) [24]

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

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

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

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


 
Sapersky   (2007-05-31 17:31) [25]

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

GLScene?


 
@!!ex ©   (2007-05-31 19:04) [26]

> [25] Sapersky   (31.05.07 17:31)

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


 
Yashin ©   (2007-05-31 20:19) [27]

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


 
@!!ex ©   (2007-05-31 22:21) [28]

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


 
Yashin ©   (2007-06-01 21:05) [29]

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



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1241615532
@!!ex
2009-05-06 17:12
2009.07.05
Как получить методы и параметры из lib?


2-1242531018
Julia
2009-05-17 07:30
2009.07.05
Работа со стеком


15-1241622164
Step
2009-05-06 19:02
2009.07.05
Скрыть главную форму


15-1241156123
palva
2009-05-01 09:35
2009.07.05
А с Первым мая никто не поздравит?


15-1241642742
Юрий
2009-05-07 00:45
2009.07.05
С днем рождения ! 7 мая 2009 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский