Механічний наддув двигуна власноруч: установка компресора. Установка механічного комперсора на двигун: тонкощі та нюанси. Гравітаційний вічний двигун

сталь, норка, яловичина, папір 28 липня 2017 о 17:03

Game Engine своїми руками на С++. Частина 1 (Вступ)

  • C++,
  • Аналіз та проектування систем
  • Розробка ігор

Game Engine
Проектуємо, пишемо, думаємо розмірковуємо, читаємо та багато іншого
Увага: статті містять багато милиць!

Всім доброго доби. Нещодавно, вирішив зайнятися розробкою 3D ігрового двигуна, оскільки структурованої інформаціїЗ цього приводу небагато, вирішив створити серію статей, у якій намагатимусь показати, більше технічну частину, ніж теоретичну.

Зараз відійду від теми і хочу дещо відразу обговорити… Я не є хорошим програмним архітектором та Senior developer(ом). Мені 21 і я є маленький амбітний C++ middle developer, можу помилятися, і писати дурниці.

Тільки a Sith deals in absolutes. Obi-Wan “Ben” Kenobi
Радий бачити зауваження та пропозиції у коментарях.
Мабуть, я закінчу вступну частину і перейдемо до справи.

Частина 1: Вступ

По-перше, треба розібратися в чому суть двигуна і навіщо його писати.
Хм… І що це?!

Ігровий двигун

центральний програмний компоненткомп'ютерних та відеоігор чи інших інтерактивних додатківз графікою, що обробляється в реальному часі. Він забезпечує основні технології, спрощує розробку та часто дає грі можливість запускатися на кількох платформах, таких як ігрові консоліта настільні Операційні системи, наприклад, GNU/Linux, Mac OS X та Microsoft Windows.
Посилання на Wiki


- Такс ... Значить, просто написати пару класів мало?!

Хороші двигуни (UE, Unity, Cocos2D) складаються з кількох сотень класів, кількох підсистем і купи менеджерів. Якщо конкретніше:

  • Графічна система
  • Звукова система
  • Система для роботи з мережею
  • Менеджер процесів
  • Менеджер завдань
  • Менеджер об'єктів
  • Менеджер сцен
і багато іншого…

І що нам робити? Як, що й куди?

Найперше і найголовніше - розділити велике завданняна більш дрібні та йти крок за кроком. Маленькими, невпевненими, черепашими кроками.

Послідовність статей:

Мітки: game engine, gamedev, c++, architecture,

Якийсь час тому ми торкалися теми створення комп'ютерних ігор і розповідали про унікальний безкоштовний тривимірний движок, написаний на Delphi - GLScene(Двигун забирайте з нашого CD/DVD ). Тема створення повноцінних тривимірних комп'ютерних ігор була вам дуже цікава, про що можна було судити за кількістю листів, що прийшли. Однак тоді ми вирішили, що розповідати про програмування під двигун – надто складно. З того часу ваш рівень помітно зріс (про це також можна судити з листів та активності на форумі журналу), ви стали більш підковані в питаннях програмування. Особливо після публікації циклу “ Комора програміста”.
З цього номера ми розпочинаємо публікацію серії статей, у яких детально розглянемо різні етапи створення тривимірної гри. Ви підвищите свої навички програмування і, що називається, загляньте за завісу таємниці, що відокремлює серйозних розробників ігор від простих смертних.
Двигун будь-якої гри складається з багатьох і часто незалежних частин-цеглинок: контроль зіткнень, фізична модель, ігровий інтерфейс, головне меню, завантаження рівнів та багато іншого. Є специфічні цеглинки,
які потрібні лише для якогось одного жанру. Наприклад, модуль погодних явищ важливий і потрібен в авіаційному чи морському симуляторі, а у стратегії реального часу він другорядний чи взагалі не потрібен, а у футбольному симуляторі ні до чого модуль пострілів. Але кілька десятків цегли є у будь-якій грі. У серії статей ми розповімо про кожну з таких цеглинок, покажемо, як вона реалізується і як її пов'язати з рештою. До кінця циклу ви зможете з цих цеглинок зібрати свою власну комп'ютерну гру досить високого рівня.

Що це ви тут робите?
Для тих, хто пропустив якісь із попередніх моїх статей (або навіть усі), відповім на питання, що у вас виникли. Так би мовити, невеликий технічний вступ.
Чому Delphi?Це середовище розробки та мова програмування Object Pascalдосить гнучкі, щоб створити повноцінну тривимірну групрактично будь-якого жанру із сучасним рівнем графіки. Багато хто заперечить, що стандартом де-факто розробки комп'ютерних ігор є MSVC++або інші середовища на основі С++. Але такі стандарти, як це часто буває, складаються стихійно. Не змішуватимемо два поняття - мова та середовище розробки.
C++, безумовно, потужніший, ніж Object Pascal. Але він і менш високорівневий, тобто у рази складніший. Для новачків С++ підходить слабо. Object Pascal не лише простий, а й досить гнучкий, щоб у ньому можна було розробити повноцінну комп'ютерну гру сучасного рівня. Тепер про середовище. Тут так категорично не скажеш. Середовище розробки- справа смаку та звички кожного конкретного програміста. Поділюсь своєю думкою з цього приводу. MSVC++ генерує трохи більше швидкий кодніж Delphi. Власне, на цьому переваги закінчуються (повторюся, на мій суб'єктивний погляд, який ні до чого не зобов'язує). Козирі Delphi - велика швидкістькомпіляції (у десятки і навіть сотні разів швидше, ніж MSVC++), висока якістьзасобів налагодження (у більшості випадків Delphi вказує точно той рядок коду, в якому міститься помилка, тоді як MSVC++ може вказати рядок за кілька сторінок від шуканої) і зручний інтерфейс.
Чому GLScene?Я побачив і перепробував багато безкоштовних тривимірних двигунів, але зупинився саме на цьому. Його найголовніша перевага – GLScene постійно вдосконалюється. Розробники не поставили крапку і, швидше за все, не поставлять її ніколи. Двигун постійно еволюціонує і вбирає всі новинки технічного прогресу. Це єдиний з відомих мені безкоштовних двигунів, про який ніколи не скажуть "застарілий". Кілька сотень ентузіастів, що постійно працюють над “двигуном”, не допустять цього. Як приклад: у двигуні підтримка перших шейдерів з'явилася вже через кілька місяців після того, як NVidiaвипустила відповідні інструментальні засоби.
Ще одна перевага: у комплекті з GLScene постачаються повні його вихідники. Початківцям цей факт, напевно, навряд чи буде корисним. Хоча познайомитися з вихідними джерелами, написаними рукою професіонала, багато чого варте. А ось досвідчені програмісти відчувають основний зміст цих слів: адже вони зможуть перекроювати двигун як їм.
заманеться. Єдина умова відповідно до ліцензії MPL – будь-які зміни у вихідниках мають бути доступні координатору проекту (зараз координатор - Ерік Гранж). Раптом ваш код ще комусь знадобиться?!
Незважаючи на те, що всі приклади коду, які будуть наведені в цьому циклі статей, будуть написані на Delphi із застосуванням GLScene, вони будуть корисні і тим, хто програмує іншими мовами та з іншими графічними бібліотеками. Адже загальні принципистворення графічного движка не залежить ні про те, ні від іншого. Отже… ми починаємо.

Навіщо потрібен тривимірний двигун?
Товариші новачки, зосередьтеся! Можливо те, що я зараз скажу, з першого разу буде не дуже зрозуміло. Обов'язково перечитайте та вникніть: це один з основних принципів програмування взагалі та розробки складних систем (а гра – це складна система) зокрема. Уявіть собі якусь простеньку гру. Пінг-понг, наприклад. Програміст написав його на чистому OpenGL, Вихідники вмістилися рядків десь у 200. Що там буде двигуном, а що основним кодом гри? Так прямо відразу і не скажеш... А якщо подумати, такий поділ на двигун і основний код взагалі не потрібний.
Тепер уявіть, що ми хочемо зробити більш менш серйозний 3D-action (десятки тисяч рядків коду). І ми програмуватимемо таким же способом, як би ми робили той самий пінг-понг. І скоро заплутаємось! Так, цей код будешвидким, там нічого очікувати зайвого, але... не всякий програміст зможе дописати його остаточно. А помилки в такому щільному кодішукати - справжнє пекло. Значить, його треба якось упорядкувати. Найпростіше це зробити за допомогою виділення рівнів абстракції.
Рівень абстракції – це одне з найважливіших понять модульного програмування. Уявіть, що ви є будівельником, і вам потрібно побудувати будинок. Ви оперуєте цеглою: берете цеглу, кладете її на стіну, що будується, намазуєте розчином, берете наступну цеглу... Цеглини - ваш рівень абстракції. Тепер уявіть, що ви забудовник. І вам потрібно збудувати мікрорайон. Ви кажете будівельнику, де будувати будинки, які будинки зносити. Будинок – це ваш рівень абстракції. Було б дивно, якби ви вказували будівельнику, яку цеглу куди класти. Ви сказали: Ось тут буде дім. Всі інші турботи перебирає будівельник. Ну, а тепер уявіть, що ви мер міста. І вам необхідно дати завдання натовпу забудовників до такого року дати місту стільки нового житла. Навряд чи ви особисто плануватимете, де якийсь будинок повинен стояти. Це робота забудовника. Рівень абстракції мера – обсяг житлового фонду, який можна збільшувати, можна зменшувати, а як це виконуватиметься – справа десята. За великим рахунком, на цьому рівні абстракції все одно, з чого будуються будинки: хоч із цегли, хоч із бивнів мамонта. І у мера у списку команд просто не може бути “ покласти цеглу”, хоч будь-яка його команда через кілька рівнів абстракції до цього й приведе.
У більш менш складній комп'ютерної програмиабо грі - те саме. Кожен рівень абстракції відповідає за свою частину роботи, спираючись на можливості низького рівня. Кожен рівень абстракції забезпечуєвищого рівня зручний інтерфейс до роботи з об'єктами. У комп'ютерній грі нижній рівеньабстракції - це мова програмування (хоча, насправді, можна копнути ще глибше – до заліза). Далі йдуть команди OpenGL API(Якщо ми саме з його допомогою програмуємо). На цьому рівні ми можемо віддати команду на кшталт “ намалювати полігон” та “ поміняти місцями видиму та тіньову частини відеобуфера”. Потім – команди GLScene. На цьому рівні ми можемо дати команди на кшталт “ побудувати куб”, “завантажити модель у форматі 3ds” та “ накласти на модель такусь текстуру”. А ось далі - ігровий двигун. І, нарешті, ігровий код, який може давати ігровому движку команди на кшталт “ завантажити рівень”, “вистрілити таким персонажем з такої зброї” та “ показати заставний ролик”. В ідеальному випадку, кожен рівень абстракції користується командами тільки попереднього рівня. Не завжди це можливо. Але до цього треба прагнути, тому що в такому випадку код буде швидким, зручним і легкочитаним.

Динамічне створення об'єктів
Ми розглянули вертикальну організацію комп'ютерної гри. Але кожен рівень абстракції можна поділити на смислові блоки – модулі. Поділ це необов'язково і завжди буде суто умовним, просто так простіше програмувати. Сьогодні ми розберемо маленьку, але дуже важливу модуль-цеглу - динамічне створенняоб'єктів, що є у всіх без винятку іграх.
Припустимо, ви створюєте модуль озброєння і хочете запрограмувати чергу зкулемета. Все б нічого, але звідки ви знаєте скільки гравець може випустити куль за всю гру? Через редактор об'єктів у IDE GLScene можна створювати будь-які об'єкти, але тільки якщо ви чітко знаєте скільки і яких об'єктів вам потрібно. Найчастіше це неприйнятно. Наприклад, у грі є 20 рівнів, у кожного рівня - свій набір об'єктів. І що ж, перед початком гри створювати всі об'єкти всіх рівнів? Це довго та й займе величезну кількість пам'яті. Єдиний вихід- створювати об'єкти безпосередньо під час гри, динамічно. У GLScene динамічне створення будь-якого об'єкта складається з двох стадій - створення екземпляра класу цього об'єкта та присвоєння йому необхідних властивостей. Візьмемо приклад, що вже згадувався, з чергами біля кулемета і динамічно створимо кулю. Припустимо, куля у нас буде промтосферою. За сфери у GLScene відповідає клас TGLSphere. Здавалося б, можна написати так:
Sphere:=TGLSphere.Create
Однак команда не працюватиме, оскільки кожному об'єкту в GLScene треба зареєструватися в черзі об'єктів. Крім того, об'єкт не можна створити в "порожнечі", він повинен бути прив'язаний до якогось об'єкта вищого рівня. Кореневий об'єкт найвищого рівня – glscene1.Objects (якщо об'єкт компонента TGLScene у вас називається glscene1). Правильний варіант:
Sphere:=TGLSphere (glscene1.Objects.AddNewChild(TGLSphere))
Розберемо цей рядок частинами. У кореневого об'єкту glscene1.Objectsми викликаємо метод AddNewChild, який додає в корінь об'єкт класу, вказаний у параметрі (у даному випадкуце сфера -
TGLSphere). Так також можна: параметри процедурам передавати не об'єкти, а цілі класи. Навіщо перед присвоєнням потрібне перетворення типу до TGLSphere? Справа в тому, що метод AddNewChild, щоб ви йому в параметр не передали, повертає об'єкт класу TGLBaseSceneObject. Нас це не влаштовує, тому ми і перетворюємо тип TGLSphere. Об'єкт, що вийшов, присвоюється змінною Sphere. Тепер за допомогою цієї змінної ми можемо нашій пулі поставити різні параметри, наприклад становище у просторі:
Sphere.Position.X:=
Sphere.Position.Y:=
Sphere.Position.Z:=
Або колір:
Sphere.Material.FrontProperties.Diffuse=
Динамічне створення моделей ми розібрали, а тепер поговоримо про динамічне їхнє знищення. Справді, куля колись потрапляє в стіну, людину або ж відлітає в блакитну далечінь. Із цього моменту вона більше не потрібна. Якщо ми так і залишимо її, вона займатиме якусь область пам'яті. Враховуючи, скільки пострілів робить середньостатистичний кемпер, доки його ничку не виявлять, нам усієї пам'яті комп'ютера не вистачить, щоб зберігати таку кількість куль. Тому будь-які об'єкти гри, які стали непотрібними, треба негайно знищувати. Єдиний правильний спосібзробити це - викликати метод Free, наприклад:
Sphere.Free
Часто буває потрібно перевірити, чи існує об'єкт, чи його вже знищили. Для цього порівнюємо об'єкт із універсальною константою нуля - nil, наприклад:
If Sphere<>nil then
Begin
(сферу ще не знищили,
значить, робимо тут щось корисне)
End
Або ж викликаємо функцію Assignedяка робить те ж саме. І ось тут вас чатує один гігантський підводний камінь, на який рано чи пізно натрапляли всі програмісти. Якщо ви звільнили об'єкт методом Free, це не гарантує, що змінна об'єкта стала рівною. nil! Тобто за певного збігу обставин у прикладі вище, навіть якщо сфера знищена, умова виконуватиметься. Якщо ви за умови після перевірки звертаєтеся з цією сферою (а так майже завжди і буває), станеться критична помилкащо загрожує вильотом гри в сині кватирки. Щоб гарантувати, що звільнений об'єкт стане рівним nil, використовуйте спеціальну процедуру FreeAndNil, наприклад:
FreeAndNil(Sphere)
Тепер ви можете бути впевненими в тому, що ніколи не зверніться до об'єкта, що вже не існує. Описану процедуру створення та знищення об'єктів можна застосовувати до будь-яких об'єктів GLScene.

Навіщо ігор акумулятор?
Розглянемо приклад вище із кулеметом. Зазвичай в іграх кулі – це не просто сфери, а складні об'єкти, у яких ще й текстура є. Щоразу, коли ви створюєте кулю, звільняється ділянка пам'яті, встановлюються властивості цієї кулі, завантажується модель кулі, завантажується текстура (з вінчестера!). Все це займає визначений час. Якщо число куль, які вивергає кулемет на секунду, дуже велике, можуть початися дикі гальма, особливо на слабких комп'ютерах. Зі знищенням куль така сама проблема:треба вивантажити об'єкт, звільнити пам'ять... Те саме стосується не тільки куль, але й будь-яких об'єктів, які часто з'являються і зникають, наприклад до крапель дощу, іскор від електропроводки... Подібна марнотратність системних ресурсіву комп'ютерних іграх неприйнятна. Ви ж не хочете, щоб вашу гру можна було запустити лише на суперкрутій графічній станції?
Вихід простий. Прикидаємо, скільки в середньому подібних об'єктів може існувати одночасно. Припустимо, кулемет може викинути кілька сотень куль за десяток секунд, і за цей десяток секунд кулі обов'язково долетять до мети. Перед початком гри створюємо всі сто куль. Найкраще це робити під час завантаження рівня. Невеликої затримки ніхто не помітить. Далі кулі поміщаються до списку або масиву, який називаємо акумулятором. Робимо кулі невидимими або виносимо їх кудись за межі ігрового простору. Як тільки кулемет почав стріляти, замість того, щоб створювати кулі, ми переміщуємо в потрібне місце вже створені кулі з акумулятора і робимо їх видимими. Як тільки куля досягне мети, ми не знищуємо її, а знову робимо невидимою та поміщаємо в акумулятор. У результаті для кожної кулі ми заощаджуємо час створення та час знищення. А це дуже багато! А якщо ми трохи помилилися у своїх прикидках, кулі в акумуляторі скінчилися, а кулемет продовжує стріляти? Тут уже нічого не вдієш - доведеться нові кулі створювати динамічно, поки в акумулятор не повернуться старі. І нові кулі теж не знищуватимемо, а запасемо в акумуляторі - раптом ще знадобляться...

Атака клонів
Нехай у нас є великий ліс, в якому багато однакових дерев або, скажімо, багато дерев кількох різних видів. Приклад схожий на попередній, тільки ми тут нічого динамічно не створюємо та не знищуємо – на цьому рівні дерева є завжди. Проблема буде під час завантаження рівня. Створення стільки дерев займе величезний час. Але ж вони однакові! Тобто ми щоразу завантажуємо з вінчестера і створюємо в пам'яті копії одного і того ж. Завантажили. Граємо. Перед рендером кожного дерева виконуються підготовчі процедури. Для кожного дерева вони будуть одними і тими ж, але викликати ми їх знову будемо знову велике числоразів, за кількістю дерев! Марнотратно виходить. І пам'ять під кожне дерево резервувати треба, і обробка кожного з них займає час.
От би завантажити одне-єдине дерево, а коли треба буде вивести на екран інші дерева, просто показати графічній бібліотеці, звідки брати необхідні дані. Це ж яка економія ресурсів вийде, який проріст FPS! Такі "хибні" дерева (і не тільки дерева - що завгодно), про які в пам'яті зберігається тільки приватна інформація(положення у просторі, кути повороту), а однакова інформація зберігається лише один раз, називаються проксі-об'єктами.
У GLScene для створення проксі-об'єктів існує спеціальний клас - TGLProxyObject. Користуватися ним дуже просто. Спочатку створюємо об'єкт-джерело, тобто єдине дерево, наприклад так:
Tree:=TGLFreeFrom(glscene1.objects.AddNewChild(TGLFreeFrom));
//Завантажуємо
його модель:
Tree.LoadFromFile('Tree.3ds');
//Завантажуємо його текстуру:
Tree.Material.Texture.Disabled:=false;
Tree.Material.Texture.Image,LoadFromFile('tree.jpg');
//А тепер створимо десять дерев-клонів у випадкових місцях:
for i:=1 to 10 do begin
//Створюємо черговий проксі-об'єкт
proxy:=TGLProxyObject(glscene1.objects.AddNewChild(TGLProxyObject));
with proxy do begin
//В якості MasterObject записуємо наше дерево-зразок
MasterObject: = Tree;
//Показуємо, що успадковуватись повинна тільки структура об'єкта
ProxyOptions:=;
//Орієнтацію дерева у просторі треба залишити незмінною
Direction: = Tree.Direction;
Up: = Tree.Up;
//А ось становище задаємо випадкове
Position.X:=Random(100);
Position.Y:=Random(100);
//І повернемо дерево на випадковий кут, щоб краще виглядало
RollAngle:=Random(360);
end;
end;
Тепер ми маємо десяток дерев за ціною одного. Зверніть увагу, що якщо ми змінимо об'єкт-оригінал, ця зміна миттєво позначиться на всіх об'єктах-клонах.

* * *
Ми розповіли про першу цеглу. У наступних статтях ми подаруємо вам цілу вантажівку такої цегли, з якої ви зможете побудувати тривимірний ігровий двигун своєї мрії. А щоб вам було простіше, на компакт ми викладаємо останню протестовану версію GLScene.

Двигун для сайту своїми руками. Варіант перший: якщо у вас немає бази...

Кожен сайтобудівник одного разу раптом зауважує, що він уже займається не стільки підготовкою нових матеріалів для свого сайту, скільки банальними та рутинними речами: там виколупав меню, замінив; там перезберіг, оновив; тут - copy, там - paste, а потім все це save та upload. «Ну ні – думає вебмайстер – так більше не можна! Але що робити?». А робити потрібно двигун для сайту.

Ця стаття - перша із задуманого мною циклу статей, в якому ми з вами спробуємо зробити щось на зразок движка для нескладних сайтів. Ми розглянемо також принципи відокремлення контенту сайту від його оформлення (дизайну) та способи автоматизації вебмайстерні праці.

Двигуном прийнято називати набір скриптів та програм, на основі яких тримається, живе та оновлюється сайт. Двигун може бути як простим PHP-скриптом та статтями, що зберігаються в текстових файлахпевного формату, так і складним комплексом програмних засобіву зв'язку з базами даних (MySQL, Oracle, etc.) та веб-службами, написаними на Java.

Найкращим (але при цьому не найскладнішим) був би варіант із застосуванням баз даних. Але найчастіше вебмайстрам база даних недоступна, оскільки дають її (наскільки мені відомо) лише на платних хостингах. Тому наш перший двигун ми організуємо при допомоги PHPта набору файлів. При цьому можна себе втішити тим, що на працездатність нашого сайту не впливатимуть додаткові фактори ризику, що вносяться використанням баз даних (всі, я вважаю, вже чули про історію з діркою в Microsoft SQL Server 2000) (1).

Наш двигун буде спеціально пристосованим під контент-проекти (тобто сайти, які регулярно поповнюються авторськими статтями чи іншими матеріалами). А це означає, що нам доведеться зробити все для зручного та швидкого оновлення змісту сайту.

Отже, для початку нам треба визначити пару функцій для читання даних із файлу. Перед тим, як наводити вихідні коди, Розглянемо наявні у нас (вірніше, в PHP) засоби для роботи з файлами (а ті, хто не в курсі - відразу й дізнаються).

Функції читання файлів у PHP.

...
$strings = file("myfolder/myfile.txt");
$first_string = $strings;
...

Зробимо таку собі самопальну базу даних. Для неї нам, по-перше, знадобляться такі функції: одна для читання контенту сторінки (наприклад, тексту статті) з зовнішнього файлу- завантаження даних; функція для завантаження шаблону з файлу - тобто завантаження оформлення (дизайну).

function loadTemplate($path)
/* функція завантажує шаблон по вказаному шляху,
і повертає його у вигляді рядка, наприклад,
для обробки функцією parceTemplate() */
{
$template = fopen($path, "r") or print("Не вдалося завантажити файл шаблону [".$path."]");

If ($template)
return fread($template, filesize($path));
else
return false;

Fclose($template);
}

Function parceTemplate($template, $params_values)
/* функція синтаксично розбирає вказаний шаблон,
замінюючи назви параметрів, що служать індексами
масиву $params_values ​​на їх значення */
{
while (list($param, $value) = each($params_values))
{
$template = str_replace("¤(".$param.")¤", $value, $template);
}

Return $template;
}

Function readArticle($path)
/* функція читає вказаний файлі повертає
його вміст у вигляді масиву частин статті,
розділених конструкцією ¤(ім'я частини)¤ */
{
$article = fopen($path, "r") or print("Не вдалося завантажити файл статті [".$path."]");

If ($article)
{
$astring = fread($article, filesize($path));
$result = split("[¤](1)[(](1)([ a-z_-]*)[)](1)[¤](1)", $astring);

$result = eregi_replace("[ ,]*([ - ](1))[, ]*", " - ", $result);
$result = basename($path);
return $result;
}
else
{
return false;
}
}

Десь тут треба було б прикрутити гранітну плиту з написом «Регулярним виразам від вдячних фанатів», оскільки без цієї зручної штуки було б дуже складно створити наведені вище функції. Розглянемо трохи докладніше, як ці висловлювання влаштовані.

Писати багато разів про одне і те ж немає сенсу, тому я процитую одну із статей про регулярні висловлювання (Джерело: http://sitemaker.ru/):

Регулярні вирази.

Трохи історії.

Математик Стівен Клін вперше представив регулярні висловлювання в 1956, в результаті його роботи з рекурсивними наборами в природною мовою. Вони були створені як синтаксичні набори, що використовувалися для знаходження відповідей шаблонів у рядках, які пізніше допомагали звертатися до технологічної інформації, що з'являється, полегшуючи автоматизацію.

З того часу регулярні вирази пройшли через безліч ітерацій, і поточний стандарт зберігається ISO (Міжнародною організацією зі стандартизації) та визначений Open Group, спільним зусиллям різних технічних некомерційних організацій (2).

Відповідність символів.

Труднощі регулярних виразівполягає в тому, що Ви хочете шукати або чому це має відповідати. Без цієї концепції, RE непотрібні. Кожен вираз міститиме деяку команду про те, що шукати:

Відповідність символів у регулярних виразах
Оператор Опис приклад Результат
. Відповідає будь-якому одному символу .ord Відповідатиме "ford", "lord", "2ord", і т.д. у файлі sample.txt.
Відповідає будь-якому одному символу, укладеному у квадратні дужки ord Відповідатиме лише «cord», «nord» та «gord»
[^] Відповідає будь-якому одному символу, не укладеному у квадратні дужки [^cn]ord Відповідатиме "lord", "2ord" і т.д., але не "cord" або "nord"
Відповідає будь-якій букві ord Відповідатиме "aord", "bord", "Aord", "Bord" і т.д.
[^0-9] Відповідає будь-якій нецифрі в проміжку 0-9 [^0-9]ord Відповідатиме "Aord", "aord" і т.д., але не "2ord" і т.д.

Оператори повторення.

Оператори повторення, або квантифікатори, описують скільки разів потрібно шукати вказаний рядок. Вони використовуються разом із відповідним символом синтаксисом, щоб шукати багаторазові входження символів. У різних додаткахїх підтримка може змінюватися або бути неповною, тому потрібно прочитати документацію до програми, якщо раптом шаблон не працює, як очікувалося.

Оператори повторення у регулярних виразах
Оператор Опис приклад Результат
? Відповідає певному символу один раз, якщо той існує ?erd Відповідатиме "berd", "herd", і т.д. та «erd»
* Відповідає певному символу багаторазово, якщо той існує n.*rd Відповідатиме "nerd", "nrd", "neard" і т.д.
+ Відповідає певному символу один або більше разів [n]+erd Відповідатиме "nerd", "nnerd" і т.д., але не "erd"
(n) Відповідає певному символу точно n разів (2)erd Відповідатиме "cherd", "blerd" і т.д., але не "nerd", "erd", "buzzerd" і т.д.
(n,) Відповідає певному символу мінімум n разів .(2,)erd Відповідатиме «cherd» та «buzzerd», але не «nerd»
(n, N) Відповідає певному символу мінімум n разів, але не більше ніж N разів n[e](1,2)rd Відповідатиме "nerd" і "neerd"

Якоря описують, де відповідати шаблону. Вони можуть бути зручними, коли ви шукаєте загальні строкові комбінації.

Якоря регулярних виразів
Оператор Опис приклад Результат
^ Відповідає початку рядка ereg_replace("^/", "blah") Вставляє «blah» на початок рядка
$ Відповідає кінцю рядка ereg_replace("$/", "blah") Вставляє "blah" в кінець рядка
\< Відповідає початку слова ereg_replace("\<", "blah") Вставляє «blah» на початок слова
\ Відповідає "blahfield" і т.д.
\> Відповідає кінцю слова ereg_replace("\>", "blah") Вставляє blah в кінець слова
\blah Відповідає "soupblah" і т.д.
\b Відповідає початку або кінцю слова \bblah Відповідає «blahcake» та «countblah»
\B Відповідає середині слова \Bblah Відповідає "sublahper" і т.д.

(Кінець цитати, джерело опису: http://sitemaker.ru/)

Отже, продовжимо. Створені нами функції знадобляться для читання статей із файлів та виведення списку найновіших статей. Причому для модифікації цього нам потрібно буде лише написати нову статтюу вигляді файлу з певним синтаксисом (див. нижче) і додати його до папки на сервері.

Символи ¤( і )¤ використовуються для відокремлення частин один від одного. Ім'я частини ніякого значення не має і може бути будь-яким набором символів англійського алфавіту, пробілу, підкреслення або дефісу.

Для виведення списку статей використовується цикл, який перебирає всі файли з потрібного каталогу. Якщо він натикається на файл *.art, то відразу на радощах додає його до масиву. Залежно від вказаного параметра, він може або додати ім'я цього файлу, або назву статті, що міститься в ньому, або відразу готове посилання на цю статтю.

Що ж, невелика частинароботи над нашим двигуном вже зроблена. Ця частина коду – основа нашого першого движка. Для конкретних цілей до нього потрібно чіпляти додаткові функції та створювати самі тексти та шаблони сторінок.

Саморобний двигун можна виготовити кількома способами. Огляд почнемо з біполярного або крокового варіанта, який є електричним мотором з подвійним полюсом без щіток. Він має харчування постійного струму, Поділяє повний оборот на рівні частки. Для функціонування даного пристрою потрібно спеціальний контролер. Крім того, в конструкцію пристрою входить обмотка, магнітні елементи, передавачі, сигналізатори і вузол управління з панеллю приладів. Основне призначення агрегату - облаштування фрезерувальних та шліфувальних верстатів, а також забезпечення роботи різних побутових, виробничих та транспортних механізмів.

Типи двигунів

Саморобний двигун може мати кілька конфігурацій. Серед них:

  • Варіанти із магнітом постійної дії.
  • Комбінована синхронна модель.
  • Змінний двигун.

Привід із постійним магнітом обладнується основним елементом у роторній частині. Функціонування таких приладів ґрунтується на принципі тяжіння або відштовхування між статором та ротором пристосування. Такий кроковий електродвигун оснащений роторною частиною із заліза. Принцип його роботи полягає в фундаментальній основі, згідно з якою, гранично допустиме відштовхування проводиться з мінімальним зазором. Це сприяє тяжінню точок ротора до полюсів статора. Комбіновані пристрої поєднують у собі обидва параметри.

Ще один варіант – це двофазні мотори крокового типу. Прилад є простою конструкцією, може мати два типи обмотки, легко встановлюється в необхідному місці.

Монополярні модифікації

Саморобний двигун цього типу складається з єдиної обмотки та центрального магнітного крана, що впливає на всі фази. Кожен відсік обмотки активується забезпечення певного магнітного поля. Так як у подібній схемі полюс може функціонувати без додаткового перемикання, комутація шляху і напрями струму має елементарний пристрій. Для стандартного двигуна із середньою потужністю вистачає одного транзистора, передбаченого в оснащенні кожної обмотки. Типова схема двофазного двигуна передбачає шість проводів на вихідному сигналі і три аналогічні елементи на фазі.

Мікроконтролер агрегату може використовуватися для активізації транзистора автоматично певної послідовності. При цьому обмотки підключаються за допомогою з'єднання вихідних дротів та постійного магніту. При взаємодії клем котушки вал блокується для прокручування. Показник опору між загальним проводом і частиною торцевої котушки пропорційний аналогічному аспекту між торцями проводки. У зв'язку з цим довжина загального дроту вдвічі більша, ніж сполучна половина котушки.

Біполярні варіанти

Саморобний кроковий двигун цього обладнаний однією обмоткою фази. Надходження струму до неї здійснюється переломним способом з допомогою магнітного полюса, що зумовлює ускладнення схеми. Вона зазвичай агрегує з мостом, що з'єднує. Є пара додаткових проводів, які є спільними. При змішуванні сигналу такого двигуна на підвищених частотах ефективність тертя системи знижується.

Створюються також трифазні аналоги, що мають вузьку спеціалізацію. Вони застосовуються в конструкції верстатів з ЧПУ, а також деяких автомобільних бортових комп'ютерах і принтерах.

Пристрій та принцип роботи

При передачі напруги клем щітки двигуна наводяться в безперервне обертання. Встановлення на холостому ходіунікальна, оскільки перетворює вхідні імпульси на заздалегідь визначену позицію наявного ведучого валу.

Будь-який імпульсний сигнал впливає на вал під конкретним кутом. Такий редуктор максимально ефективний, якщо ряд магнітних зубців розміщений навколо центрального залізного зубчастого стрижня або його аналога. Електричні магніти активуються від зовнішнього контрольного ланцюга, що складається з мікрорегулятора. Для початку повороту валу двигуна один активний електромагніт притягує до поверхні зубчики колеса. При їхньому вирівнюванні по відношенню до провідного елементу вони трохи переміщаються до чергової магнітної деталі.

У кроковому електродвигуні перший магніт повинен включатися, а наступний елемент деактивуватися. В результаті шестерня почне обертання, поступово вирівнюючись із попереднім коліщатком. Процес повторюється по черзі необхідну кількість разів. Такі звороти й одержали назву «постійний крок». Швидкість обертання двигуна можна визначити шляхом підрахунку кількості кроків для повного обороту агрегату.

Підключення

Під'єднання міні-двигуна, зробленого власноруч, здійснюється за певною схемою. Основна увага звертається на кількість проводів приводу та призначення приладу. Мотори крокового типу можуть оснащуватися 4, 5, 6 або 8 проводами. Модифікація із чотирма елементами проводки може експлуатуватися виключно з біполярним пристроєм. Будь-яка фазна обмотка має два дроти. Для визначення необхідної довжини підключення покроковому режимірекомендовано використовувати звичайний метр, що дозволяє досить точно встановити потрібний параметр.

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

своїми руками?

Для створення елементарного мотора знадобиться шматок магніту, свердло, фторопласт, дріт із міді, мікрочіп, дріт. Замість магніту можна використовувати непотрібний вібродзвінок мобільного телефону.

Як деталь обертання використовується свердло, оскільки інструмент оптимально підходить по технічним параметрам. Якщо внутрішній радіус магніту не відповідає аналогічному аспекту валу, можна використовувати мідний дріт, намотавши його таким чином, щоб усунути люфт валу. Така операція дозволяє збільшити діаметр валу в точці з'єднання з ротором.

Надалі створення саморобного двигуна потрібно зробити втулки з фторопласту. Для цього візьміть підготовлений лист і зробіть отвір діаметром 3 мм. Потім сконструюйте трубку-втулку. Вал необхідно відшліфувати до діаметра, що забезпечує вільне переміщення. Це дозволить уникнути зайвого тертя.

Фінальна стадія

Далі проводиться намотування котушок. Каркас необхідного розміру затискається в тисах. Щоб намотати 60 витків, знадобиться 0,9 метра дроту. Після проведення процедури котушка обробляється клейовим складом. Найкраще цю делікатну процедуру проводити з мікроскопом чи збільшувальним склом. Після кожної подвійної обмотки краплю клею впроваджують між втулкою та дротом. Один край кожної обмотки спайується між собою, що дасть можливість отримати єдиний вузол з парою виходів, які паяються до мікрочіпа.

Параметри технічного плану

Міні-двигун, зроблений своїми руками, залежно від конструкційних особливостей може мати різні характеристики. Нижче наведено параметри найпопулярніших крокових модифікацій:

  1. ШД-1 - має крок 15 градусів, має 4 фази і крутний момент 40 Нт.
  2. ДШ-0,04 А - крок становить 22,5 градуса, кількість фаз - 4, спритність - 100 Нт.
  3. ДШІ-200 – 1,8 градуса; 4 фази; 0,25 Нт моменту, що крутить.
  4. ДШ-6 – 18/4/2300 (значення вказані за аналогією з попередніми параметрами).

Знаючи, як зробити двигун у домашніх умовах, необхідно пам'ятати про те, що швидкість крутного показника крокового мотора трансформуватиметься прямо пропорційно аналогічному параметру струму. Зниження лінійного моменту на високих швидкостяхбезпосередньо залежить від схеми приводу та індуктивності обмоток. Двигуни зі ступенем захисту IP 65 розраховані на серйозні умови роботи. Порівняно з серверами, крокові моделі працюють набагато довше та продуктивніше, не вимагають частого ремонту. Однак у серводвигунів трохи інша спрямованість, тому порівняння цих типів немає особливого сенсу.

Робимо саморобний ДВС

Мотор своїми руками також можна зробити на рідкому паливі. При цьому не потрібне складне обладнання та професійний інструментарій. Необхідна, яку можна взяти з тракторного або автомобільного паливного насоса. Циліндр плунжерної втулки створюється шляхом обрізання потовщеного елемента шлефа. Потім слід зробити отвори для вихлопного і перепускного вікна, припаяти пару гайок у верхній частині, призначених для свічок запалювання. Тип елементів – М-6. Поршень вирізається із плунжера.

Саморобний дизель-двигун вимагатиме встановлення картера. Він виготовляється з жерсті з припаяними підшипниками. Додаткову міцність дозволить створити тканину, покриту епоксидною смолою, якою покривається елемент.

Колінчастий вал збирається із потовщеної шайби з парою отворів. В одне з них необхідно запресувати вал, а друге крайнє гніздо служить для монтажу шпильки з шатуном. Операція також проводиться методом пресування.

Завершальні роботи зі збирання саморобного дизельного мотора

Нижче наведено порядок збирання котушки запалювання:

  • Використовується деталь від авто чи мотоцикла.
  • Встановлюється відповідна свічка.
  • Монтуються ізолятори, які фіксуються за допомогою «епоксидки».

Альтернативою двигуну з системою ДВС може служити безконтактний двигун замкнутого типу, пристрій і принцип роботи якого представляють систему зворотного обміну газів. Він влаштований із двосекційної камери, поршня, колінвала, передавальної коробки, системи запалювання. Знаючи, як зробити двигун своїми руками, ви можете суттєво заощадити та отримати в господарстві потрібну та корисну річ.

Із дешевих матеріалів. На цей раз ми розглянемо, як зробити таку гарну річяк "дрімель", або бормашину. За допомогою цього маленького, але багатофункціонального інструменту можна гравірувати, свердлити, різати, шліфувати і багато чого іншого. Працює цей пристрій дуже просто, по суті, це дриль з гнучким валом, що робить процес робіт дуже зручним. Вал є тросиком, який обертається всередині спеціального шланга. А моторчики використовуються різноманітні.


Виготовлена ​​саморобка зібрана на основі двигуна 775, це дуже популярний та надійний двигун для виготовлення різних домашніх верстатів. Він потужний, має примусову системуохолодження, усередині корпусу знаходиться вентилятор. Як корпус автор вирішив використовувати запчастини для сантехніки з ПВХ, це дешево та надійно.

Матеріали та інструменти, які використовував

Список матеріалів:
- ;
- ;
- Вимикач;
- Гніздо для підключення блока живлення;
- Проводи;
- ПВХ-труба, заглушка, а також перехідник (конус);
- Блок живлення 12В/6А;
- двостороння клейка стрічка;
- Муфта для двигуна 775.











Список інструментів:
- паяльник;
- Викрутка;
- ножовка по металу;
- Плоскогубці.

Процес виготовлення дремелю:

Крок перший. Робимо корпус
Як корпус автор вирішив використовувати шматок труби. Відрізаємо потрібну довжину і відзначаємо місця під вентиляційні вікна. Їх зробити дуже важливо, тому що в іншому випадку мотор буде перегріватися і швидко вийде з ладу. Автор вирізає їх, використовуючи ножівку по металу.












Крок другий. Виготовлення задньої кришки
Як задню кришку автор використовував заглушку для труб. В ній знаходиться вимикач і роз'єм для підключення блоку живлення. Малюємо під них вікна і потім вирізаємо, використовуючи звичайний паяльник. Намагайтеся не дихати парами, це не корисно.








Тепер вам потрібно встановити вимикач та роз'єм на свої місця. Просто заштовхніть їх у гнізда, вони повинні надійно зафіксуватись, якщо отвори потрібного діаметра.

Крок третій. Встановлюємо двигун на своє місце
Можна встановлювати двигун. Наскільки я зрозумів, автор зміцнює його, використовуючи двосторонню клейку стрічку чи щось подібне. Обмотуємо двигун стрічкою, залишаємо край, щоб потім її можна було витягнути, і встановлюємо в трубу. Витягуємо верхнє покриття стрічки і двигун виходить надійно закріпленим у трубі. Перед установкою не забудьте припаяти до контактів двигуна.










Крок четвертий. Припаюємо дроти
Припаяйте всі дроти, як у автора. Живлення на двигун йде від гнізда у розрив через вимикач. Остаточно збираємо корпус і пробуємо увімкнути пристрій. Двигун працює? Все відмінно! Йдемо далі.








Крок п'ятий. Підключення
Гнучкий вал підключається дуже просто, спочатку вам потрібно закріпити на валу двигуна сполучну муфту. Вона кріпиться за допомогою гвинтів та шестигранного ключа. На вал надягніть конусоподібну деталь з ПВХ, а тепер закріпіть чотиригранний трос в муфті. Встановіть конусоподібну частину на корпус, а зовнішню частину валу засуньте всередину корпусу.












Крок шостий. Завершальний етап складання та тестування
Остаточне складання дремеля ми завершимо вже за допомогою виготовленого пристрою. Нам належить добре закріпити гнучкий вал у корпусі пристрою. Для цього знадобиться просвердлити отвори, встановлюємо потрібну насадку в наш дрімель і пробуємо свердлити, автор виходить непогано. Загорніть в отвори шурупи, у автора їх 3 штуки.