PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Материалы сайта » Перевод книги "PureBasic - A Beginners Guide"


Перевод книги "PureBasic - A Beginners Guide"

Сообщений 31 страница 60 из 66

31

Добавил ссылку на сайт http://pure-basic.narod.ru/docs/books/contents.html

0

32

Петр! Будь добр, переправь пожалуйста  в 12 главе, в самом конце автора перевода, эту главу я не переводил.

0

33

haav написал(а):

переправь пожалуйста  в 12 главе, в самом конце автора перевода

Страница находится не на моём сайте.
Посмотри на адрес.

0

34

Просто я все главы редактировал по заранее заготовленному шаблону,
Если это так принципиально - я исправлю, в чем проблема...

0

35

mirashic написал(а):

Просто я все главы редактировал по заранее заготовленному шаблону, Если это так принципиально - я исправлю, в чем проблема...

Да проблем нет,  раз тебе все равно  ;)

0

36

mirashic написал(а):

http://www.mirashic.narod.ru/

Тут все понятно описано

0

37

Ребята, ну как - у вас энтузиазм ещё не иссяк? Могу помочь с переводом - прочёл большинство глав книги, особых сложностей с языком не заметил, так что обращайтесь.

0

38

osg написал(а):

Ребята, ну как - у вас энтузиазм ещё не иссяк? Могу помочь с переводом - прочёл большинство глав книги, особых сложностей с языком не заметил, так что обращайтесь.

Хорошо бы перевести раздел справки или книги, посвященный 3d-программированию, а то пока этот раздел никем не переведен...

Отредактировано Lucagin (21.12.2010 17:31:50)

0

39

Lucagin Chapter 11 - 3D Graphics? Ок, с утра начну ))

Отредактировано osg (22.12.2010 01:55:22)

0

40

osg написал(а):

Ок, с утра начну ))

Будем ждать!!! :cool:

0

41

пока вот немного. (язык у чувака ппц местами, текст зелёным цветом может быть не совсем точным)

Глава 11 - 3D графика

В этой главе я собираюсь поговорить о 3D графике и о том, как PureBasic применяет движок OGRE  для её отрисовки на экране. 3D графика использует воображаемые 3D модели для того, чтобы создавать правдоподобные миры, которые дают ощущение широты, высоты и глубины, а монитор компьютера, обычно, рассматривается как окно, сквозь которое вы можете увидеть эти 3D миры. Это конечно немного не точно, и даже наряду с тем, что я люблю думать, что я смотрю на трёхмерный мир сквозь мой монитор (особенно когда играю в 3D игры), я знаю точно, что это изощрённые математические процедуры рисуют эти воображаемые 3D модели на мониторе моего компьютера, даря мне ощущение трёх измерений. К счастью, PureBasic позаботился обо всей математике которая нужна для рисования 3D графики на экране, используя 3D движок OGRE. Это позволяет вам вызывать простые, высокоуровневые команды, которые выполняют сложные эффекты трёхмерной графики. Это делает программирование 3D графики на PureBasic быстрым, занятным и очень лёгким.

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

Общее представление о движке OGRE
Чтобы сделать возможным рисовать трёхмерную графику на экране, как я уже сказал, вам нужно использовать сложные математические процедуры для вычисления формы модели, текстуры модели, расположения и освещения и т.д., и это может быть очень трудоёмким и тяжёлым для мозгов. К счастью пользователей PureBasic, 3D движок OGRE обычно берёт на себя всю эту утомительную рутину, так что вы можете сконцентрироваться на написании кода вашей программы. OGRE (Open source GRaphics Engine) является движком трёхмерного рендеринга в реальном времени с открытым кодом, созданным и разработанным компанией Torus Knot Software Limited. Этот двиг распространяется свободно в интернете и доступен для использования всем желающим бесплатно и для любых целей.

Просмотрев исходный код движка OGRE, ведущий разработчик PureBasic Frédéric
Laboureur решил, что движок такого фантастического качества, что он включил его в состав набора команд PureBasic. Сам по себе двиг включён в PureBasic как динамическая библиотека (DLL), а встроенная 3D библиотека PureBasic – оболочка для движка. Единственный недостаток связанный с этим заключается в том, что движок OGRE имеет API интерфейс, который содержит многие сотни команд и не все из них поддерживаются PureBasic. Это обусловлено несовместимостью с языком на котором был написан OGRE, и временем затрачиваемым разработчиками PureBasic на реализацию и тестирование новых команд.

Отредактировано osg (22.12.2010 20:53:06)

0

42

osg написал(а):

пока вот немного. (язык у чувака ппц местами, текст зелёным цветом может быть не совсем точным)
Глава 11 - 3D графика

Вступление отличное, стиль перевода лаконичный  и лёгкий, если всё так же понятно будет и в работе с движком, то будет здорово!!!    :cool:
    Дорогие  коллеги, кто хорошо владеет английским, может объединить усилия, пока у человека есть желание потрудится для нашего с вами блага. Глава про 3D, в принципе, очень нужна. Эта тема  одна из немногих, к которой без перевода даже страшно подступаться…

Отредактировано Lucagin (22.12.2010 16:57:11)

0

43

В будущем может быть добавлено больше команд, поскольку разработчики PureBasic выразили интерес в увеличении набора команд OGRE доступных пользователям PureBasic, так что я думаю время покажет. Вы можете просмотреть актуальный на данный момент набор команд OGRE в файле справки, в разделе 3D Games Libraries (Helpfile:Reference Manual->3D Games Libraries).

Формат OGRE Mesh

Чтобы использовать OGRE для манипуляции и отображения 3D моделей в вашей программе, вам потребуется чтобы эти модели были в отдельном формате. Это OGRE ‘Mesh’ формат и эти файлы модели будут иметь расширение ‘*.mesh’.

Если вы заглянете в раздел «downloads» сайта OGRE, вы найдёте много инструментов и плагинов сторонних разработчиков, которые расширяют функциональность управления пакетами 3D моделирования. Данные инструменты позволяют этим пакетам сохранять и экспортировать свеже-созданные модели в корректный «mesh» формат. В сущности это вероятно хорошая идея заглянуть сюда прежде чем принять решение о том, какие пакеты 3D моделирования использовать для создания вашего «mesh».

Создание ваших собственных файлов OGRE Mesh

Чтобы создать ваши собственные mesh-файлы вам понадобится использовать то, что известно как «программа 3D моделирования». Этот тип программ позволит вам создать модель используя трёхмерное изображение. Она позволит вам увидеть превью вашей модели, обновляемое в реальном времени, под любым углом в процессе создания. Этот тип программ также предоставляет инструменты позволяющие добавлять текстуры, чтобы придать вашей модели «графическую кожу» в процессе рендеринга в 3D движке. Более продвинутые программы 3D моделирования позволяют вам точно размещать текстуры разворачивая модель в 2D форму. Эта двумерная развёрнутая форма может быть экспортирована как изображение, чтобы предоставить шаблон из которого вы можете нарисовать вашу текстуру. Когда такая текстура снова применяется к изначальной 3D модели, она превосходно соответствует трёхмерной фигуре.  Любая 3D программа, позволяющая экспортировать и сохранять модель в ‘*.mesh’ файл (родной формат OGRE), может использоваться для создания ваших 3D моделей.

Форматы текстур OGRE

Любая модель отображаемая 3D движком нуждается в текстуре. Эти текстуры – ничто иное, как изображения, обёрнутые вокруг моделей, обеспечивающие их «кожей» для детальной отрисовки. Фактически некоторые люди относятся к текстурам именно как к коже. Иногда модели имеют больше одной текстуры чтобы оснаститься более значительным массивом текстур или осуществить более детализированное покрытие.

Когда текстуры применяются для оснащения вашей 3D модели кожей, вы должны использовать корректный формат изображения, иначе текстуры не появятся после компиляции вашей программы. Это очень важно помнить, поскольку большинство пакетов 3D моделирования имеют способность загружать и использовать множество типов изображений, форматы которых не поддерживаются OGRE. Движок OGRE, применяемый в PureBasic, использует Png, Tga или Jpg файлы. Если вы используете эти форматы изображений для ваших моделей, вы будете уверены, что всё работает как ожидалось.

Трёхмерная система координат OGRE

Во время рисования и манипулирования объектами в 3D пространстве вам требуется система координат чтобы отслеживать позицию объекта в этом пространстве. OGRE использует стандартную правостороннюю ‘x, y, z’ систему координат, но для тех из вас кто не знает что это такое, позволю себе объяснить. В координатной системе как эта, трём осям координат присвоены разные буквы, вот откуда происходит ‘x, y, z’. Знание того какой символ присвоен той или иной оси координат – необходимо для использования этой системы. Рис. 39 показывает оси координат и буквы назначенные им. Эта схема также показывает как трёхмерное пространство может легко быть разделено и направлено используя три значения. Если вы представите что целая 3D сцена находится внутри этой невидимой коробки, тогда любая точка внутри этой сцены может быть описана набором из трёх значений ‘x, y, z’.

(на рисунке: X=Широта, Y=Высота, Z=Глубина
Каждая точка в 3D пространстве может быть выражена тремя значениями ‘x, y, z’. Вот точка, выраженная как  ‘5, 5, 5’, показана графически, пользуясь тремя воображаемыми перекрещивающимися линиями.)

Эти координаты сами по себе довольно понятны, на каждую размерность можно сослаться используя положительное или отрицательное число, и движок OGRE рассчитывает их индивидуально. Коробка слева на рис. 39 демонстрирует это используя знаки + и – . Если вы представите нижний левый угол монитора вашего компьютера как существующий в 3D координатах: ‘0, 0, 0’, - номер координаты ‘x’ будет численно возрастать далее к правому краю монитора по которому вы сейчас путешествуете, а координата ‘y’ будет численно возрастать по направлению вверх экрана монитора по которому вы идёте. Координата ‘z’ немного отличается тем, что она увеличивается в значении удаляясь по отношению к вам, от экрана по которому вы путешествуете. Это демонстрируется вновь на правом изображении коробки если вы посмотрите на цифры расположенные вдоль сторон.

Некоторым нравится использовать координаты ‘0, 0, 0’ как центр любого данного 3D пространства, и тогда координаты относящиеся к другим объектам внутри такого мира могут быть либо положительными либо отрицательным в зависимости от того в каком направлении от центра находится точка которую вам нужно описать. Надеюсь эта простая диаграмма должна дать вам понимание как оперировать координатами ‘x, y, z’.

0

44

osg написал(а):

Надеюсь эта простая диаграмма должна дать вам понимание как оперировать координатами ‘x, y, z’.

Очень здорово получается!!! Я даже полез в оригинал, следить по тексту за развитием событий…  :writing:  :cool:

0

45

Lucagin
спасибо! ))
...понимание того как... )) исправлю у себя.

0

46

osg написал(а):

...понимание того как... )) исправлю у себя.

ДА супер, пока всё понятно  :cool:

0

47

Слушай, ты спец в английском, как корректнее перевести следующие цвета?
Deep Pink (Насыщенный розовай ) , Hot Pink(Ярко-розовый цвет)
Indian red(Индейский красный),  Fire Brick (Огненно кирпичный)
Можно сказать, что перевод правильный?

Отредактировано Lucagin (23.12.2010 01:30:39)

0

48

Lucagin
я думаю да. Перевод бывает разный - когда дословно, когда просто подставляются наши понятия под текст, особенно когда речь идёт об ощущениях, чувствах и т.д.
http://en.wikipedia.org/wiki/Variations_of_pink - тут пинков штук 10

Отредактировано osg (23.12.2010 12:43:04)

0

49

osg написал(а):

http://en.wikipedia.org/wiki/Variations_of_pink - тут пинков штук 10

Спасибо, очень актуально…  :)

0

50

(то что выделено зелёным может быть не точно переведено - чёт он там нагородил  :confused: )

API  идентификаторы OGRE

При использовании PureBasic и OGRE для создания 3D моделей, вы фактически используете OGRE API (application programming interface – интерфейс программирования приложений) невидимо управляя им. PureBasic не показывает вам ничего из этого сырого OGRE API, а в место этого облачает API команды в намного более дружественные команды бейсика. Тем не менее иногда вам может понадобиться обратиться к каким-нибудь объектам OGRE при помощи их OGRE-идентификаторов. Эти идентификаторы – всего лишь значения типа «Long», и они очень похожи на идентификаторы операционной системы в которых так же нуждается API (Win32 API). Чтобы получить OGRE-идентификаторы различных объектов вы можете использовать эти команды PureBasic:

‘MaterialID(#MATERIAL)’
Возвращает OGRE -идентификатор материала (material) указанного (как PB number) в параметре.

‘MeshID(#MESH)’
Возвращает OGRE -идентификатор mesh указанного (как PB number) в параметре.

‘TextureID(#TEXTURE)’
Возвращает OGRE -идентификатор текстуры указанной (как PB number) в параметре.

Плавный старт

В следующем примере я собираюсь показать вам как инициализировать 3D среду (окружение), загрузить 3D mesh, применить текстуру к нему и отобразить всё это на экране. Чтобы было веселее, я сделал вращение модели и включил свет, так что модель не выглядит слишком плоской когда выводится на экран.

Код:
Enumeration
#MESH
#TEX
#MAT
#ENTITY_INVADER
#LIGHT
#CAMERA_ONE
EndEnumeration
;Установить ширину, высоту и глубину цвета экрана в битах 
;Аббревиатуры использованы как имена переменных из-за ограничения ширины страницы :(
Global ScrW.l = 1024
Global ScrH.l = 768
Global ScrD.l = 32
;Other global variables
Global Quit.b = #False
;Простая процедура проверки на ошибки
Procedure HandleError(Result.l, Text.s)
If Result = 0
MessageRequester("Error", Text, #PB_MessageRequester_Ok)
End
EndIf
EndProcedure
;Инициаилизировать среду (окружение)
HandleError(InitEngine3D(), "InitEngine3D()команда не может быть выполнена.")
HandleError(InitSprite(), "InitSprite() команда не может быть выполнена.")
HandleError(OpenScreen(ScrW, ScrH, ScrD, ""), "Не могу открыть экран.")
HandleError(InitKeyboard(), "InitKeyboard()команда не может быть выполнена.")
SetFrameRate(60)
Add3DArchive("Data\", #PB_3DArchive_FileSystem)
HandleError(LoadMesh(#MESH, "Invader.mesh"), "Не могу загрузить mesh")
HandleError(LoadTexture(#TEX, "Invader.png"), "Не могу загрузить текстуру")
HandleError(CreateMaterial(#MAT, TextureID(#TEX)), "Не могу создать Материал")
CreateEntity(#ENTITY_INVADER, MeshID(#MESH), MaterialID(#MAT))
CreateLight(#LIGHT, RGB(255,255,255), 0, 5, 0)
CreateCamera(#CAMERA_ONE, 0, 0, 100, 100)
CameraLocate(#CAMERA_ONE, 0, 1, 2.5)
RotateCamera(#CAMERA_ONE, -15, 0, 0)
;Основной цикл
Repeat
y.l + 2
RotateEntity(#ENTITY_INVADER, 0, y, 0)
RenderWorld()
FlipBuffers()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
Quit = #True
EndIf
Until Quit = #True
End

Этот пример будет довольно полезным вам, поскольку он демонстрирует все необходимые шаги, которые вы должны осуществить для отображения 3D модели на экране. Как всегда, код является довольно простым для понимания, но я пройдусь по основным моментам, просто для того чтобы вы ничего не упустили.

Как только константы, переменные и процедуры задекларированы, вы увидите, что я использовал команду ‘InitEngine3D()’ чтобы инициализировать 3D среду (окружение). Вызов этой команды необходим чтобы загрузить из директории компилятора всё что содержит 3D движок. Этот файл DLL содержит движок OGRE в нескомпилированном виде (pre-compiled), что как и это может быть легко использовано в ваших программах.

Как только 3D окружение было инициализировано – можно создать экран обычным способом. Сначала инициализируется спрайтовый движок, а затем открывается экран. Это должно быть сделано именно в таком порядке, иначе компилятор выдаст ошибку, и IDE начнёт жаловаться. Если это произойдёт – вы можете убить программу и переставить инициализации в корректную последовательность перед повторным запуском.

Отредактировано osg (25.12.2010 21:48:32)

0

51

Включение OGRE в состав вашей программы

Когда вы создаёте 3D программу используя PureBasic, и хотите поделиться ею с другими людьми, будь она коммерческой или бесплатной программой, вы должны помнить о поставке движка OGRE 3D вместе с ней.

PureBasic использует OGRE как скомпилированную DLL чтобы снабдить всеми 3D функциями в компактном и переносимом (машиннонезависимом) виде. Когда вы компилируете вашу программу, команды OGRE не встраиваются в вашу программу как обычные встроенные команды PureBasic. Вместо этого, все команды OGRE вызываются динамически из DLL. Это значит, что файл DLL должен сопровождать ваш исполняемый файл, чтобы запустить его корректно.

Это делается автоматически в процессе разработки, потому что когда вы нажимаете F5 в среде IDE чтобы скомпилировать и запустить свою программу, временный исполняемый файл создаётся в директории ‘\Compilers’, - именно там куда установлен движок OGRE. Это обеспечивает тестирование 3D команд как можно более удобным. Однако, скомпилировав исполняемый файл куда-либо ещё, движок требуется скопировать вместе с ним.

Два файла, которые вы должны поставить с вашей 3D программой, для правильной инициализации и работы:

‘Engine3D.dll’
‘stlport_vc646.dll’

Оба эти файла находятся в директории ‘\Compilers’, внутри папки вашего PureBasic. Эти файлы не должны быть упакованы (и не должны быть в другой папке), а должны находиться в той же папке, что и ваш исполняемый файл.


Создание 3D архива для размещения медиа-файлов

После выполнения всех инициализаций мы можем начинать использовать 3D команды и самая первая вещь, которую мы должны сделать, это задать ‘3D архив’. Это путь по которому OGRE ищет внешние файлы когда загружает медиа такие как: модели, текстуры, карты и т.д. Вы должны иметь по крайней мере один 3D архив заданный в вашей 3D программе, иначе компилятор выдаст ошибку. Чтобы установить  такой архив вы должны  использовать команду ‘Add3DArchive()’ (Helpfile:Reference Manual->3D Games Libraries->Engine3D->Add3DArchive). Эта команда принимает два параметра, первый это строковый тип, определяющий путь к файлу, а второй является встроенной константой которая сообщает компилятору какой это именно путь. Вот эти встроенные команды:

‘#PB_3DArchive_FileSystem’
Эта сообщает компилятору, что путь установлен как обычная папка

‘#PB_3DArchive_Zip’
Эта константа сообщает компилятору, что путь установлен как файл упаковки ZIP.

В моём примере «Invader» я создал 3D архив используя относительный путь, это сообщает  OGRE заглянуть внутрь той же директории где и моя программа, а затем посмотреть в папке под названием ‘Data\’. Когда всё таким образом определено, все требуемые медиа должны быть в этой папке. Вот так, затем разрешается использовать простые команды как:

...
LoadMesh(#MESH, "Invader.mesh")
...

Когда подобная команда встречается в нашей программе, это вызывает необходимость загружать внешние медиа, OGRE  будет искать этот файл внутри всех  указанных 3D архивов, в нашем случае OGRE  поищет файл ‘Invader.mesh’ в папке ‘Data\’.

0

52

osg написал(а):

....В следующем примере я собираюсь показать вам как инициализировать 3D среду (окружение), загрузить 3D mesh, применить текстуру к нему и отобразить всё это на экране. Чтобы было веселее, я сделал вращение модели и включил свет, так что модель не выглядит слишком плоской когда выводится на экран....

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

Хотя конечно в чем лучше и быстрее  создавать 3D-объекты и 3D mesh и все тонкости 3D-рисования придется изучать отдельно. В движок похоже их уже надо загружать готовыми…
А почему ты не даешь расшифровку 3D mesh, это специально или как?  это же по идее 3D сетка или так сказать 3D сеточный каркас… фото(http://www.cgal.org/Manual/3.3/doc_html … _main.html) видео (http://www.youtube.com/watch?v=vbvex7maHL8)

Потом вопрос к знатокам!!! В переводе написано:

osg написал(а):

Два файла, которые вы должны поставить с вашей 3D программой, для правильной инициализации и работы:
            ‘Engine3D.dll’‘stlport_vc646.dll’
            Оба эти файла находятся в директории ‘\Compilers’, внутри папки вашего PureBasic. Эти файлы не должны быть упакованы (и не должны быть в другой папке), а должны находиться в той же папке, что и ваш исполняемый файл.

Почему-то у меня в каталоге Compilers есть только файл (Engine3D.dll), второго файла(stlport_vc646.dll) у меня нет…может надо поставить какой-то доп. модуль, чтобы она появилась???

Сам код, представленный как пример, не запускается, вероятно потому, что нет файлов которые загружаются в программу ().

osg написал(а):

Add3DArchive("Data\", #PB_3DArchive_FileSystem)
HandleError(LoadMesh(#MESH, "Invader.mesh"), "Не могу загрузить mesh")
HandleError(LoadTexture(#TEX, "Invader.png"), "Не могу загрузить текстуру")

Есть интересно где-то эти файлы, чтобы посмотреть на реальную работу этого кода???

Отредактировано Lucagin (26.12.2010 03:47:06)

0

53

Lucagin написал(а):

Есть интересно где-то эти файлы, чтобы посмотреть на реальную работу этого кода???

Вообще то с книгой в комплекте идет сборник всех кодов и ресурсов, которые там используются. Лежал  в сети в свободном доступе, там где книгу продавали.
Ссылка есть тут
http://forums.purebasic.com/english/vie … mp;t=37059

Отредактировано ВиниПур (26.12.2010 08:36:03)

0

54

ВиниПур написал(а):

Вообще то с книгой в комплекте идет сборник всех кодов и ресурсов, которые там используются. Лежал  в сети в свободном доступе, там где книгу продавали.Ссылка есть тутhttp://forums.purebasic.com/english/vie … mp;t=37059

Супер, спасибо!!!  :cool:  :writing:

Нашёл из сборника кодов 4-ре примера, относящихся к 3-D.. http://ifolder.ru/21023737
Красотища!!!  :love:

0

55

Если вы хотите упорядочить ваши данные в более строгую систему файлов и вложить дополнительные поддиректории в папку ‘Data\’, than you can do by all means (не пойму как это перевести вменяемо). Тогда вам нужно будет загружать эти данные из их нового расположения, как здесь:

...
LoadMesh(#MESH, "Meshes\Invader.mesh")
LoadTexture(#TEX, "Textures\Invader.png")
...

И снова эти команды разыщут папки ‘Meshes\’ и ‘Textures\’ внутри исходного 3D архива (‘Data\’) и загрузят из них данные. Если этот синтаксис покажется немного неуклюжим, то вместо того, чтобы задавать имена папок в командах загрузки, вы так же легко можете добавить OGRE дополнительные 3D архивы для поиска в них во время запроса данных, вот как здесь:
...
Add3DArchive("Data\", #PB_3DArchive_FileSystem)
Add3DArchive("Data\Meshes\", #PB_3DArchive_FileSystem)
Add3DArchive("Data\Textures\", #PB_3DArchive_FileSystem)
...

Теперь мы можем использовать команды загрузки в более простом виде:
...
LoadMesh(#MESH, "Invader.mesh")
LoadTexture(#TEX, "Invader.png")
...

В данном случае OGRE переберёт папки: ‘Data\’, ‘Data\Meshes\’ и ‘Data\Textures\’ в поисках этих файлов.

Также если хотите, вы можете использовать ZIP-файлы для 3D архивов. Это может очень помочь при распространении программы, потому что все ваши данные содержатся внутри сжатого файла. Если вы захотите сделать это, вы должны установить при его создании, что этот 3D архив является ZIP-файлом. Это достигается использованием встроенной константы ‘#PB_3DArchive_Zip’ в качестве параметра в команде ‘Add3DArchive()’. Если у вас есть поддиректории внутри вашего ZIP-файла, вы можете получить к ним доступ в командах загрузки используя стандартный формат:
...
Add3DArchive("Data.zip", #PB_3DArchive_Zip)
LoadMesh(#MESH, "Meshes\Invader.mesh")
LoadTexture(#TEX, "Textures\Invader.png")
...

Создание 3D объекта (примитива)

После того как вы создали 3D архив, вы готовы к созданию объекта способного использовать ваши данные. Этот объект будет отображён на экране и им можно манипулировать в трёх измерениях используя различные встроенные команды. OGRE называет эти 3D объекты: ‘Entities’ (примитивы, модули).

Примитив это объект являющийся строительным блоком любой игры или демо, они так же являются 3D моделями отображёнными на экране, которые используют mesh как структуру и текстуры как «кожу». Примитивами (модулями, объектами) может быть всё что угодно смоделированное в 3D, они могут быть игровыми картами или персонажами населяющими их.


Процесс создания 3D Entity (3D примитива, модуля)

1) Загрузка Mesh
2) Загрузка текстуры
3) Создание материала (Material) из текстуры
4) Создание примитива (модуля) из Mesh и Material
5) Примитив (модуль) автоматически отображается при использовании ‘RenderWorld()’

Рис. 40

Знание того, как правильно создавать эти примитивы (модули, объекты), необходимо для отображения любой 3D модели на экране. Рис.40 показывает процесс правильного создания 3D примитива и то, в каком порядке должны быть сделаны шаги. Я точно следовал этой диаграмме в предыдущем примере «Invader». Вот как это выглядит в коде:
...
HandleError(LoadMesh(#MESH, "Invader.mesh"), "Can't load mesh")
HandleError(LoadTexture(#TEX, "Invader.png"), "Can't load texture")
HandleError(CreateMaterial(#MAT, TextureID(#TEX)), "Can't create Material")
CreateEntity(#ENTITY_INVADER, MeshID(#MESH), MaterialID(#MAT))
...

Команды использованные для завершения этого процесса просты. Первая это команда ‘LoadMesh()’ (Helpfile:Reference Manual->3D Games Libraries->Mesh->LoadMesh), которая принимает два параметра. Первый параметр это PB номер (PB number), который будет ассоциироваться с этим mesh, а второй параметр – сам mesh файл который нужно загрузить из 3D архива.
Следующая команда: ‘LoadTexture()’ (Helpfile:Reference Manual->3D
Games Libraries->Texture->LoadTexture), которая так же принимает два параметра. Первый параметр - PB номер ассоциируемый со свежесозданной текстурой, а второй – имя картинки используемой как текстура.  При использовании изображений в качестве текстуры необходимо отметить одну вещь – размер картинки в пикселях. Старые видеокарты могут поддерживать только квадратные текстуры и размер изображения который является степенью для числа «2» (т.е. наверное 2 в какой-либо степени может являться размером текстуры: 2, 4, 8, 16 и т.д.. (прим.: osg)). Для максимальной совместимости со старыми видеокартами, я так же советую вам использовать такие размеры. Рис.41 демонстрирует стандартные размеры изображений текстур, которые вы можете использовать для безопасного создания materials (материалов).

Стандартные размеры изображений текстур
Ширина в пикселях:
32
64
128
256
512
1024

Высота в пикселях:
32
64
128
256
512
1024

Глубина цвета изображения (бит):
8, 16 и 32
8, 16 и 32
8, 16 и 32
8, 16 и 32
8, 16 и 32
8, 16 и 32

Рис. 41: Все стандартные размеры текстур которые являются результатом вычисления степеней для «2».

Следующая команда не загружает ничего, она только создаёт material. Этот material – особый OGRE-формат текстуры, который может иметь различные свойства. Это простейшая форма материала (material), потому что мы создаём его из текстуры. Я расскажу о более продвинутых материалах (material) немного позже.

Чтобы создать материал вы используете команду ‘CreateMaterial()’ (Helpfile:Reference Manual->3D GamesLibraries->Material->CreateMaterial), которая принимает два параметра. Первый параметр: PB номер (PB number) с которым будет ассоциироваться этот material, а второй: OGRE-идентификатор текстуры. Этот идентификатор может быть возвращён (получен) используя команду ‘TextureID()’, которая использует PB номер (PB number) текстуры как параметр.

Как только мы получили все необходимые «ингредиенты», мы можем создать наш примитив. Это делается с помощью команды ‘CreateEntity()’ (Helpfile:Reference Manual->3D Games Libraries->Entity->CreateEntity), как здесь:
...
CreateEntity(#ENTITY_INVADER, MeshID(#MESH), MaterialID(#MAT))
...

Как видно из этой строки, команда принимает три параметра. Первый это PB номер с которым будет ассоциирован примитив. Второй: OS-идентификатор mesh (наверное идентификатор использующийся в операционной системе (прим. osg)) из которого мы хотим создать этот примитив, а третий параметр это OGRE-идентификатор материала которым мы хотим покрыть mesh.

Эти два последних идентификатора OGRE могут быть возвращены с помощью команд ‘MeshID()’ и ‘MaterialID()’ соответственно. Эти две команды принимают PB номер в качестве параметра и возвращают OGRE-идентификатор.

Отредактировано osg (01.01.2011 19:00:36)

0

56

osg написал(а):

than you can do by all means (не пойму как это перевести вменяемо)

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

osg написал(а):

Команды, использованные для завершения этого процесса просты.

Здесь, наверно, более корректнее, написать: «Команды, использованные для ВЫПОЛНЕНИЯ этого процесса просты».

0

57

может и так, но вроде логично - там 4 команды и последняя делает этот примитив поэтому завершение процесса создания командами.

0

58

Как только 3D примитив был создан, он помещается в очередь на отрисовку на экране в координатах ‘0, 0, 0’ в трёхмерном пространстве. А пока мы продолжим наш анализ примера Invader.

Освещая путь

После того как примитив был создан, я создал свет чтобы лучше осветить сцену. Этот свет даёт источник яркого освещения, который может быть любого цвета, чтобы лучше выделить этот примитив. Когда вы создаёте 3D окружение, оно уже по умолчанию содержит определённое количество света окружающей среды, но этот свет фактически не излучается из какой-либо одной точки, а в место этого, как подсказывает само название, – это амбиентный свет, свет окружающей среды. Это может заставить примитив выглядеть плоским, потому что он не может просчитать какие стороны должны сиять, а на каких должна быть тень. Когда вы добавляете свет на сцену, вы позволяете примитиву изменять его наружное освещение чтобы сымитировать освещённость и тень, в зависимости от того где размещён свет по отношению к используемому mesh (к используемой сетке). Чтобы создать свет я использовал команду ‘CreateLight()’. (Helpfile:Reference Manual->3D Games Libraries->Light->CreateLight)
...
CreateLight(#LIGHT, RGB(255,255,255), 0, 5, 0)
...

Команда принимает пять параметров, первый из которых это PB номер, который будет ассоциирован с этим светом. Второй является цветом испускаемого света, и должен быть введён как 24-битное значение цвета (для этого может быть использована команда ‘RGB()’). Третий, четвёртый и пятый параметр – опциональные, и определяют расположение света в 3D пространстве используя координатную систему ‘x, y, z’. Если эти параметры не используются, свет создаётся в позиции ‘0, 0, 0’, которая является центром 3D пространства. В примере «Invader» я использовал расположение ‘0, 5, 0’, которое поднимает свет над полом на 5 единиц измерения. См. Рис. 39 для графического представления 3D пространства используя координатную систему ‘x, y, z’.


Камера вращается

Теперь, когда 3D элементы на своих местах, нам нужно создать точку обзора, чтобы посмотреть через неё на нашу 3D сцену. OGRE называет такие точки обзора камерами (Cameras), но на самом деле мы должны провести различие между этими двумя терминами чтобы избежать путаницы. Точка обзора, это 2D точка обзора, которая существует на текущем открытом экране и отображает то, на что смотрит камера. Как только точка обзора камеры создана, она автоматически создаёт 3D камеру размещённую в координатах ‘0, 0, 0’ и вновь созданная точка обзора показывает на что смотрит 3D камера. 3D камера может быть размещена и повёрнута по желанию, но точка обзора всегда фиксируется в той же самой позиции на экране. (нихрена не понял)

Теперь, когда 3D элементы на своих местах, нам нужно создать экран просмотра, чтобы посмотреть через него на нашу 3D сцену. OGRE называет такие экраны просмотра камерами (Cameras), но на самом деле мы должны провести различие между этими двумя терминами чтобы избежать путаницы. Экран просмотра, это 2D экран, который существует на текущем открытом экране и отображает то, на что смотрит камера. Как только экран просмотра камеры создан, он автоматически создаёт 3D камеру размещённую в координатах ‘0, 0, 0’ и вновь созданный экран просмотра показывает на что смотрит 3D камера. 3D камера может быть размещена и повёрнута по желанию, но экран просмотра всегда фиксируется в том же положении на экране.

Чтобы создать точку обзора камеры и автоматически создать 3D камеру в текущем 3D мире, вы используете команду ‘CreateCamera()’ (Helpfile:Reference Manual->3D Games Libraries->Camera->CreateCamera). Эта команда принимает пять параметров и как обычно, первый параметр это PB номер, который будет ассоциирован с этим объектом-камерой. Второй и третий параметры это ‘x’ и ‘y’ позиция верхнего левого угла точки обзора на 2D экране. Четвёртый и пятый параметры – ширина и высота экрана просмотра сквозь который видна 3D сцена. При использовании этой команды очень важно понимать те значения которые она использует, потому что они очень отличаются от большинства команд PureBasic. Значения параметров, которые использует команда ‘CreateCamera()’ – не в пикселях, а в процентах текущего открытого экрана. В примере «Invader» я создал вот такую камеру:

...
CreateCamera(#CAMERA_ONE, 0, 0, 100, 100)
...

Чтобы полностью это понять давайте разберём вызов этой команды на уровне отдельного параметра. Первый параметр это PB, назначение которого легко понять, так что мы его быстро пропустим. Второй параметр был определён как «0». Это означает, что он будет рассчитан как ноль процентов ширины экрана (1024), и что является нолём. Третий параметр тоже определён как «0». Это так же в процентном соотношении но по отношении к высоте экрана (768), так что он тоже равен «0». Четвёртый параметр был определён как ‘100’. Это равняется ста процентам ширины экрана, которая в данном случае ‘1024’. Пятый параметр также определён как ‘100’, и он будет равен ста процентам высоты экрана, что составляет ‘768’. Это всё даёт нам представление о координатах точки обзора камеры как: ‘x=0, y=0, width=1024, height=768’ (‘x=0, y=0, ширина=1024, высота=768’), это полностью покрывает экран, чтобы дать нам полноэкранную точку обзора камеры в 3D мир.

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

Множественные точки обзора камеры

Использование процентного соотношения это также хороший способ поддержки множественных точек обзора камеры. Представьте если вам нужно написать код игры в поделённом или расчетверённом экране, вам понадобится хороший способ рассчитать размер экрана просмотра  на каждое данное разрешение экрана (если оно может быть выбрано пользователем). Всё это делается для вас в PureBasic используя процентное соотношение с полной уверенностью что каждое окно просмотра камеры всегда снимает ту же самую область независимо от использованного разрешения экрана. Также, при создании множества камер, очень важен порядок создания. Все экраны просмотра созданные позже в вашем коде всегда перекроют экраны просмотра созданные раньше. Взгляните на этот код для примера:
...
CreateCamera(#CAMERA_ONE, 0, 0, 100, 100)
CreateCamera(#CAMERA_ONE, 75, 0, 25, 25)
...


* короче говоря "viewport" это скорее всего "экран просмотра", а не "точка обзора".- прошу прокомментировать тех кто это использовал

Отредактировано osg (07.01.2011 22:02:44)

0

59

osg написал(а):

* короче говоря "viewport" это скорее всего "экран просмотра", а не "точка обзора".- прошу прокомментировать тех кто это использовал

Это окно просмотра или экран просмотра… (некая Область просмотра)
Если помнишь интерфейс 3DS MAX, то 4 экрана интерфейса ,  где отображаются  3-ри проекции на плоскость и 3D вид объекта,  называются viewport-Ы.
viewport  проекции сверху , viewport проекции сбоку, 3d-viewport…

osg написал(а):

Теперь, когда 3D элементы на своих местах, нам нужно создать экран просмотра, чтобы посмотреть через него на нашу 3D сцену....

Второй и третий параметры это ‘x’ и ‘y’ позиция верхнего левого угла точки обзора на 2D экране. Четвёртый и пятый параметры – ширина и высота экрана просмотра сквозь который видна 3D сцена.

...это полностью покрывает экран, чтобы дать нам полноэкранную точку обзора камеры в 3D мир.

Может так более корректно?

Теперь, когда 3D-элементы на месте, мы должны создать окно просмотра(viewport), с помощью которого(посредствам которого) можно смотреть  нашу 3D сцену....
Второй и третий параметры это ‘x’ и ‘y’ позиция верхнего левого угла окна просмотра(viewport) на 2D экране. Четвёртый и пятый параметры – ширина и высота «смотрового окна», по средствам которого просматривается 3D сцена.
…это полностью покрывает экран, чтобы дать нам полноэкранное окно «смотрения» камеры в 3D мир

А в остальном, классный перевод!!! :cool:

Отредактировано Lucagin (08.01.2011 08:55:36)

0

60

Lucagin
да, наверное так лучше, исправь плз весь текст в моём мессаге с этим экраном если хочешь и выложи - будет второй вариант.

0


Вы здесь » PureBasic - форум » Материалы сайта » Перевод книги "PureBasic - A Beginners Guide"