Возвращение культа Солнца
срочно начинайте молиться Солнцу
даже если вы произошли от обезьяны
пока оно не бомбануло в нашу сторону
Сурья Намаскар - Приветствие солнцу
срочно начинайте молиться Солнцу
даже если вы произошли от обезьяны
пока оно не бомбануло в нашу сторону
Сурья Намаскар - Приветствие солнцу
Пожалуй, многие из вас помнят, какими были мобильные игры до и после выхода первого iPhone. В начале 2000-х годов, ещё до появления яблочного смартфона, игры для телефонов в основном были весьма интересными, но тем не менее, достаточно простенькими с точки зрения графики и реализации в целом. После запуска AppStore в 2008 году, на iPhone начали выходить самые разные красочные, невиданные раннее по уровню детализации и проработке 2D и 3D игры. Но появление таких игр — отнюдь не заслуга Apple, а относительной малоизвестной компании PowerVR (подразделение Imagination Tech), которая смогла разработать на базе видеочипа Dreamcast и внедрить один из первых действительно массовых мобильных 3D-ускорителей, имя которому — PowerVR MBX! Сейчас мы с вами привыкли, что почти любой дешевый смартфон может отрисовывать графику уровня PS3 в 1080p, а то и выше, но когда-то даже уровень PS2 был роскошью… Сегодня мы с вами: узнаем предысторию появления аппаратно-ускоренной 3D-графики на телефонах, рассмотрим такую фирменную фишку PowerVR, как тайловый рендеринг, а в практической части статьи нам поможет легендарный КПК Dell Axim X51v с MBX на борту, под который мы напишем 3D-игру «про жигули» с нуля! Интересно? Тогда добро пожаловать под кат!
Пожалуй, 3D-графика на мобильных устройствах начала развиваться ещё с самого начала 2000-х годов. К тому моменту, как мобильные телефоны научились запускать сторонние Java-приложения, практически сразу же появился прибыльный рынок мобильных игр. Ещё до появления поддержки jar-приложений, люди ставили рекорды в «Змейке» на телефонах Nokia, таскали ящики в «Строителе» на Siemens и играли в другие предустановленные игры на девайсах других брендов, поэтому было очевидно, что игры на мобильных телефонах рано или поздно смогут занять немалую часть сегмента портативных игровых устройств.
Именно появление J2ME дало тот самый толчок для развития мобильного гейминга. Производители телефонов активно развивали и дорабатывали мобильную платформу, добавляя в неё различные API-расширения — например, активацию приложений через СМС и доступ в WAP-интернет. Сама платформа J2ME была достаточно простой для изучения и имела низкий порог вхождения не только для людей, имевших какой-то опыт программирования, но даже для совсем новичков, которые никогда не писали код и тем более игр! Благодаря этому, появились сотни игр, многие из которых до сих пор помнят и любят: это и легендарный «мячик» Bounce, и «зайчик с морковками» Bobby Carrot, и весьма крутой Gish, а также множество различных платформеров по известным фильмам и «большим» играм!
В 2003 году появился Nokia N-Gage — первый массовый телефон, ориентированный именно на мобильный гейминг, который поддерживал не только Java-игры, но и собственные Symbian-игры с достаточно крутой 3D-графикой! Примерно в том же 2003 году, для платформы Java вышло сразу два API-расширения, которые добавляли поддержку симпатичной 3D-графики даже в самые простенькие и бюджетные телефоны: Mobile 3D Graphics (M3G, была почти везде) и Mascot Capsule (эта платформа была только на Sony Ericsson и Motorola). Именно благодаря этим API, мы с вами увидели такие легендарные игры, как V-Rally, Galaxy on Fire, Deep3D и многие другие! Но тем не менее, эти API были относительно медленными из-за программной растеризации на процессоре без отдельного 3D-ускорителя и весьма ограниченными в функционале. Ближайший пример по функционалу — уровень софтрендера первой кваки на первом Pentium! Кстати, про 3D на мобильных телефонах я писал отдельную статью, там в практической части мы пишем 3D-бродилку для Sony Ericsson!
Но помимо кнопочных телефонов, существовал сегмент High-end мультимедийных устройств, которые предоставляли гораздо больший функционал и производительность за немалые деньги. И речь, конечно же, о КПК! Девайсы, работавшие на базе шустрых процессоров Intel PXA и Samsung S3C с Windows Mobile на борту были заметно более перспективными для игр… но как-то не задалось из-за отсутствия нормальных каналов для распространения. Но тем не менее, Intel (иронично, но один из самых больших производителей ARM-чипсетов для КПК в те годы), которая уже занималась развитием десктопной графики GMA и PowerVR активно работали в этой сфере и результатом стало появление видеоускорителя 2700G, который представлял из себя не только 3D GPU PowerVR MBX Lite, но и аппаратный декодер видео, позволявший смотреть видео в высоком качестве! MBX Lite позволял запустить даже Quake 3 в 640x480 (!), пусть и в 10-15 FPS… Ещё за 5 лет до этого, далеко не все десктопные видеокарты могли выдать больше 30 FPS в 800x600!
Конечно в 2004 году уже вышел PSP, выставивший новую планку уровня 3D-графики для портативного гейминга, однако для смартфонов и КПК, уровень графики, разрешение и производительность 3D-игр на MBX Lite был просто немыслимым! Одним из самых легендарных и популярных устройств с 2700G, которое вы можете приобрести достаточно дешево и сейчас, был КПК Dell Axim X51v, флагманская модель с VGA-дисплеем тех лет. Но нельзя сказать, что только PowerVR работала в этом направлении. Параллельно NVidia выпустили GoForce, крайне редко попадающийся в «полноценном» виде (NVidia предлагала дешевле лицензировать только видео-декодер с отключением 3D-части, как это было в Toshiba Portege G900) и ATI Imageon, который чаще всего можно встретить в виде Adreno на ранних Android-чипсетах Qualcomm (Adreno — анаграмма Radeon :)).
Тем не менее, решение PowerVR было действительно массовым: компания не предлагала отдельный чип (что обычно было дороже), как конкуренты, а лицензировала другим компаниям уже готовые IP-ядра, которые производители чипов могли синтезировать и использовать в своих собственных чипсетах, или, сопроцессорах, как в случае с 2700G. Благодаря этому, MBX появился в чипсете TI OMAP 2430, использовавшийся в легендарных Nokia N93i и Nokia N95, Samsung INNOV8, Asus Lamborghini, Nokia E90 и некоторых других. Кроме того, PowerVR MBX использовался в процессоре Samsung S5L8900, судя по всему, разработанный для iPhone 2G и 3G! Благодаря этому, его можно считать одним из первых массовых 3D GPU в телефонах!
Одна из игр для iPhone 2G и N95 — Assasins Creed
И Asphalt 5!
Весьма симпатично, согласитесь?
Но MBX, конечно же, не появился «из ниоткуда» и был основан на более ранних разработках компании Imagination Tech, а именно GPU из полноценной домашней консоли SEGA Dreamcast — PowerVR CLX2, который в свою очередь был основан на ранних десктопных GPU PowerVR из середины-конца 90-х годов. Основная фишка PowerVR была в использовании так называемой техники отложного тайлового рендеринга (TBDR), которая, в отличии от классической растеризации и сортировки с помощью Z-буфера (или ручной сортировки треугольников) всех примитивов «в лоб» (методика, используемая в PSP, PS2 и большинстве видеокарт 2000-х годов), сначала ждёт от программы списка всех рисуемых треугольников в кадре, разбивает весь экран на тайлы (небольшие прямоугольные области), которые содержат в себе информацию о пересекающихся треугольниках, а затем процессом, несколько схожим с рейтрейсингом, определяет, какой из пикселей треугольника ближе всего находится к камере наблюдателя. Таким образом, мы избавляемся от необходимости сортировки геометрии с помощью Z-буфера (который сам по себе занимает достаточно много, по меркам тех лет, памяти и страдает от проблем точности и Z-fighting'а), а также такой метод позволяет реализовать более дешевый альфа-блендинг без ручной сортировки полупрозрачных примитивов и имеет ещё одну приятную фишку — «бесплатный» Occlusion Query, который можно использовать для реализации продвинутых техник отсечения невидимой глазу геометрии.
Производительность PowerVR MBX была весьма достойной для своих лет: при частоте работы в 200МГц, видеочип обеспечивал филлрейт в 100Мп, обрабатывал до 1млн треугольников в секунду. Нативным графическим API MBX был OpenGL ES 1.1 — специальная урезанная версия OpenGL для встраиваемых устройств, из которой выбросили все ненужное и которая заточена не только под floating-point, но и под fixed-point арифметику. В остальном, особо никаких отличий для программиста по сравнению с обычными GPU не было, можно было без проблем портировать уже существующие приложения для десктопого OpenGL для мобильные девайсы, чем и пользовались энтузиасты при портировании Quake 3 на Nokia E90, КПК и другие девайсы. Также, PowerVR MBX поддерживал D3DM — графический API Windows Mobile, о котором мы поговорим позднее.
Однако PowerVR MBX был GPU с фиксированным конвейером (FFP), а не программируемым, как принято в современных 3D-ускорителях. Что-же такое программируемый и фиксированный конвейер? Давайте разберемся:
Фиксированный конвейер: для того, чтобы задать визуальную составляющую рисуемой геометрии, программист оперирует набором заранее определенных при проектировании видеочипа параметров, которые позволяют управлять внешним видом растеризуемых примитивов. Например, для реализации света, программист задает параметры каждого из 8 источников света влияющих на рисуемый объект. Если программисту необходимо наложить несколько текстур за один проход (например, для реализации плавных переходов текстур на ландшафте или нанесения карты отражений на модель), он оперировал комбайнерами, которые позволяли задавать для каждого сэмплера параметры наложения. Такой подход использовался на десктопных GPU эпохи до GeForce 3 (т. е. примерно до 2000 года), до PS3 на Sony PlayStation (Xbox сразу вышел с GeForce 3) и до PSP включительно на портативках. Очевидно, что такой подход сильно ограничивает программиста в том, как будет выглядеть его игра на той или иной видеокарте.
Программируемый конвейер: в программируемом подходе, для управления визуальной составляющей программист пишет небольшие программы для видеокарты, называемые шейдерами. Всего есть два базовых (в современных GPU их больше) этапа программируемого конвейера: первый из них — вершинный шейдер, отвечающий за трансформацию геометрии (перевод из мировой системы координат в экранную) и, например, анимацию. Трансформированные вершины отправляются в следующий этап конвейера — растеризацию, где выполняется уже пиксельный шейдер, который определяет цвет пикселя (или более корректно — фрагмента в терминологии 3D графики) — т.е например, окрас объекта в определенной цвет, текстуру (или несколько текстур), рассчитывает попиксельное освещение, накладывает тени и т. д. Кроме того, такой подход позволяет реализовать сложные техники типа Ambient Occlusion, SSR, а также пост-эффекты (например блюр/блум, правда эти два можно «сэмулировать» и на FFP при определенной сноровке).
К 2007 году, Khronos выпустили спецификацию второй версии OpenGL ES, которая добавляла в мобильные устройства поддержку программируемого конвейера и шейдеров. Таким образом, мобильные GPU всё ближе приближались к уровню консолей и могли выдавать вполне годную графику, близкую к консолям. Даже была когда-то такая консоль, как Zeebo, которая работала на базе смартфонного чипсета Qualcomm с графикой ATI Imageon (!). PowerVR уже в 2009 выпустила серию SGX, которая также использовалась в iPhone, iPad, многих Android-смартфонах и планшетах, а также PS Vita!
Modern Combat 3 на iPad
Но статья с пересказом фишек PowerVR MBX была бы не особо интересной без практической части с написанием 3D-игры под этот GPU с нуля! Поэтому предлагаю посмотреть на нашего сегодняшнего гостя, легендарный флагманский КПК Dell Axim X51v из далекого 2005 года! Для тех лет, это настоящий «жир»:
Его мне подарил мой читатель Сергей с Хабра, за что ему огромное спасибо! Девайс был в полной комплектации, даже с флэшкой и усиленной АКБ, которая до сих пор неплохо держит заряд, однако у него не работал тачскрин. Если вам интересен только процесс программирования игры, а не аппаратного ремонта, то листайте ниже сразу до следующего абзаца :)
По факту, девайс полностью работал, однако в некоторые моменты времени не откликался на кнопки и тачскрин, и по всем симптомам это напоминало дребезг кнопок. При этом тачскрин сам по себе реагировал нормально во всех местах, что, фактически, исключало вероятность его поломки (хотя резистивные тач-панели сами по себе не особо надежные, в отличии от емкостных тачскринов). Дело было вот в чём: во многих КПК тех лет был отдельный аппаратный переключатель блокировки клавиатуры и тачскрина, который можно было использовать при просмотре фильмов. Однако на моем девайсе он был слишком разболтанным…
Разбирается КПК несложно: выкручиваем 4 винта и снимаем переднюю часть корпуса. На всякий случай я прочистил грязь между тачем и верхней частью корпуса — она тоже бывает влияет на ложные нажатия и чувствительность тачскрина:
А вот и виновник наших проблем: рычажок переключателя был отломан, но все еще находится в положении «разблокирован». Даже если в выжать в упор — он все равно не работал. Ну что ж, фен в руки, сдуваем переключатель и ставим вот такую перемычку (на фото флюс ещё не отмыт):
Включаем девайс и смотрим — теперь всё работает! Вот такой простой и быстрый ремонт Axim'а. КПК мне сразу очень понравился, я и ранее знал о его легендарности, но теперь узнал и о том, что он очень круто спроектирован и собран! Кстати, есть смысл сразу сдуть концевой выключатель, который прижимает задняя крышка и заменить на перемычку.
GPU не очень хорошо работает на кастомных прошивок, на которую прошиты многие Axim X51v. Поэтому есть смысл прошить сток: качаем прошивку (Файл отката), закидываем на SD-карту и ребутим девайс нажатием клавиш Wi-Fi + включение + Reset. После этого, девайс пойдет прошиваться.
Теперь девайс чистый, как с завода! Можно приступить к написанию небольшой демки-игрушки, которая сможет продемонстрировать нам перспективы нашего КПК в 3D!
Изначально, в практической части статьи должна была участвовать не менее легендарная Nokia N95. Однако вот незадача: несмотря на то, что под Symbian сохранился SDK (который работает нормально только под Windows XP), на устройствах с системой старше 9.x необходимо взламывать installserver, дабы иметь возможность ставить хоумбрю программы (к которым относится и наша игра) и отладчик TRK.
И хотя свой девайс я пропатчил, дебаггер нормально поднять мне так и не удалось. Я смог проинициализировать контекст GLES, запилить примитивный рендерер с загрузкой ассетов из памяти устройства но потом решил перевести проект на WinMobile… Проблем с разработкой под Symbian много: если приложение крашится — то оно просто закрывается, без сообщений и логов. Добавьте к этому то, что в Symbian вообще нет исключений и не всегда можно записать ошибки в лог и отладка превращается в ужас. Ситуацию исправляет Qt, который работает на N95, но в котором нет поддержки GLES (по крайней мере, в виде обычного QOpenGL, хотя возможность юзать API системы из Qt есть и дебаггер там работает нормально, так что не всё потеряно). Если вы когда-то что-то пилили под Symbian, особенно в Carbide — пишите свой опыт в комментариях, интересно почитать :)
WinMobile не менее интересен тем, что в нём поддерживается сразу два графических API: классический OpenGLES в профиле Common Lite (только fixed-point арифметика) и мобильная версия Direct3D — D3DM.dll, которая предоставляет API очень похожее на DX9, но без поддержки шейдеров. Что не менее приятно — есть официальные биндинги от Microsoft к D3DM в .NET Compact Framework, что позволяет легко писать 3D-игры под WM на C#/VB.NET.
Поскольку WinMobile — достаточно открытая для пользователя система, хватит лишь накатить VS2005/2008 на машину с WinXP/WinVista/Win7/Win8 и сразу начать разрабатывать под неё приложения, никаких проблем с отладкой и запуском приложений тут нет. На Win10/Win11 совместимость с WM5 поломали :(
Создаём приложение для смарт-устройств, выбираем в качестве целевой платформы WM5-устройство (эмулятор будет слишком медленным для наших целей, он даже для 2D-игр не подойдет) и, наконец-то, приступаем к написанию игры!
Что же за игра у нас будет? Я решил сделать эдакое 3D-переосмысление популярного в прошлом бесконечного раннера из «тетриса», где мы едем на машинке F1 и обгоняем другие машины, стараясь в них не врезаться. Основной целью является набрать как можно больше очков. Подобные игры достаточно популярны на мобильных девайсах и сейчас: вспомнить хотя-бы Highway Traffic, однако мой вариант будет весьма колоритным: ведь в моей демке мы будем кататься на ТАЗе 21099 и уворачиваться от гнилых «вторых гольфов». Ну а почему бы и нет, я просто очень люблю старые гнилые жигули и это не первый мой проект про машины этого производителя :)
Как и у настоящей машины, у каждой игры должен быть собственный движок! Однако в случае конкретно нашей игры, это скорее небольшой фреймворк, который предоставляет ровно тот функционал, который нужен игре без каких либо излишеств. Необходимо изначально распланировать требования для будущего фреймворка, дабы написание игры не скатилось в процесс, известный в узких кругах как «движкописание» :)
Рендерер: с графической точки зрения, фреймворк должен реализовывать весьма небольшой функционал. Загружать геометрию и текстуры из файлов в специально-подготовленном формате, реализовывать концепцию камеры, отрисовывать статическую геометрию, а также спрайты и текст, реализовывать примитивную систему материалов, которая позволяет наносить на геометрию текстуры, красить их в определенный цвет и управлять повершинным освещением, а также наносить на геометрию отражения с помощью специально подготовленных enviornment-текстур. Кроме того, рендерер должен уметь рисовать симпатичное анимированное небо в виде полусферы.
Звук: воспроизведение wav-звуков и музыки из файлов. Да и всё пожалуй — что ещё нужно от звуковой подсистемы? :) Стерео ведь нет, поэтому и 3D-звук не нужен.
Ввод: обработка нажатий на тачскрин и аппаратные кнопки устройства, маппинг кейкодов в виртуальный «геймпад». GUI-подсистему тоже частично можно отнести именно сюда!
Физика: AABB и Sphere vs Sphere столкновения. Никакого полноценного солвера тут и не нужно :)
Начинаем, пожалуй, с реализации рендерера. Сначала нам необходимо создать окно и контекст D3DM. Процесс практически идентичен D3D8 и D3D9: передаём информацию о нужном адаптере (видеочипе) и заполняем структуру PresentationParameters, однако есть важные нюансы: аппаратный FSAA лучше всего отключить (MultisampleQuality), а также передавайте точный размер окна, в которое собираетесь рендерить изображение, иначе система начнёт софтварно (!) скейлить рендертаргет до размера окна каждый кадр, что, как сами понимаете, крайне медленно.
Из форматов Depth-Stencil форматов поддерживается D16, D24S8 и D32. Желательно использовать D16 (несмотря на тайловую архитектуру, насколько мне известно, в MBX все равно есть fallback до классического рендеринга при некоторых условиях). Практически на всех КПК и коммуникаторах использовался 16-битный цвет, т.е RGB565, но можно указать Unknown — тогда GAPI подцепит тот формат пикселя, что используется в остальной системе.
PresentParameters pp = new PresentParameters();
pp.AutoDepthStencilFormat = DepthFormat.D16;
pp.BackBufferCount = 1;
pp.BackBufferFormat = Format.Unknown;
pp.BackBufferWidth = parentForm.ClientSize.Width;
pp.BackBufferHeight = parentForm.ClientSize.Height;
pp.EnableAutoDepthStencil = true;
pp.FullScreenPresentationInterval = PresentInterval.One;
pp.MultiSample = MultiSampleType.None;
pp.PresentFlag = PresentFlag.None;
pp.SwapEffect = SwapEffect.CopyVSync;
pp.Windowed = true;
device = new Device(0, DeviceType.Default, parentForm.Handle, CreateFlags.None, pp);
device.RenderState.Lighting = false;
aspectRatio = (float)parentForm.ClientSize.Width / (float)parentForm.ClientSize.Height;
Переходим сразу же к рисованию геометрии! Для начала рендеринга, нам необходимо подготовить состояние контекста: посчитать и установить матрицы вида (т. е. камеры) и проекции для трансформации геометрии, задать рендерстейты (список состояний, например нужно ли рисовать модельку с освещением, или нет), очистить экран и Z-буфер и установить параметры фильтрации текстур. Перспективная коррекция текстур — достаточно тяжелая операция и использовать её стоит лишь при необходимости:
public void BeginScene()
{
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.SkyBlue, 1.0f, 0);
device.BeginScene();
device.TextureState[0].MinFilter = TextureFilter.Point;
device.TextureState[0].MagFilter = TextureFilter.Point;
device.RenderState.TexturePerspective = true;
// Prepare projection
Matrix matrix = Matrix.PerspectiveFovLH(60.0f * MathUtils.DegToRad, aspectRatio, 0.1f, 350.0f);
device.SetTransform(TransformType.Projection, matrix);
}
public void EndScene()
{
device.EndScene();
device.Present();
System.Threading.Thread.Sleep(16);
}
Чтобы какую-то модельку нарисовать, нам нужно сначала её загрузить! Для возможности напрямую прочитать треугольники из файла и сразу записать их в вершинный буфер, я написал небольшой конвертер из формата SMD (GoldSrc) в собственный, очень простой и легковесный формат, который состоит из позиции вершины и её текстурных координат:
public struct BoundingBox
{
public float MinX, MinY, MinZ;
public float MaxX, MaxY, MaxZ;
}
public sealed class ModelConverter
{
public const int Header = 0x1234;
static BoundingBox CalculateBBox(SmdMesh mesh)
{
BoundingBox ret = new BoundingBox();
ret.MinX = float.PositiveInfinity;
ret.MinY = float.PositiveInfinity;
ret.MinZ = float.PositiveInfinity;
ret.MaxX = float.NegativeInfinity;
ret.MaxY = float.NegativeInfinity;
ret.MaxZ = float.NegativeInfinity;
foreach (SmdTriangle triangle in mesh.Triangles)
{
for (int i = 0; i < 3; i++)
{
ret.MinX = Math.Min(ret.MinX, triangle.Verts[i].Position.X);
ret.MinY = Math.Min(ret.MinY, triangle.Verts[i].Position.Y);
ret.MinZ = Math.Min(ret.MinZ, triangle.Verts[i].Position.Z);
ret.MaxX = Math.Max(ret.MaxX, triangle.Verts[i].Position.X);
ret.MaxY = Math.Max(ret.MaxY, triangle.Verts[i].Position.Y);
ret.MaxZ = Math.Max(ret.MaxZ, triangle.Verts[i].Position.Z);
}
}
return ret;
}
private static int FloatToFixedPoint(float x)
{
return ((int)((x) * 65536.0f));
}
public static void Convert(string fileName, Stream stream)
{
Console.WriteLine("Converting mesh " + fileName);
Smd2Bmd.SmdMesh mesh = new Smd2Bmd.SmdMesh(stream);
BoundingBox bb = CalculateBBox(mesh);
using(Stream outStrm = File.Create(Path.GetFileNameWithoutExtension(fileName) + ".mdl"))
{
BinaryWriter writer = new BinaryWriter(outStrm);
writer.Write(Header);
writer.Write(mesh.Triangles.Count * 3); // Verts count
// BBox
writer.Write(bb.MinX);
writer.Write(bb.MinY);
writer.Write(bb.MinZ);
writer.Write(bb.MaxX);
writer.Write(bb.MaxY);
writer.Write(bb.MaxZ);
foreach (SmdTriangle triangle in mesh.Triangles)
{
for (int i = 0; i < 3; i++)
{
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.X));
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.Y));
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.Z));
writer.Write(triangle.Verts[i].UV.X);
writer.Write(triangle.Verts[i].UV.Y);
}
}
}
}
}
Обратите внимание, PowerVR MBX оперирует fixed-point арифметикой! D3DM, конечно, может автоматически преобразовывать float-координаты вершин в числа с фиксированной точкой, вот только реализовано это криво и косо: драйвер будет конвертировать все вершины в fixed-point каждый вызов отрисовки, вместо того, чтобы один раз преобразовать их после Unlock'а вершинного буфера. Теперь представьте, насколько это тормозно для хоть сколь-либо комплексной модели :)
При этом загрузчик модели при таком подходе будет очень простым и будет работать шустро даже на таком слабеньком железе:
public Model(string debugName, Stream strm)
{
BinaryReader reader = new BinaryReader(strm);
int hdr = reader.ReadInt32();
int numVerts = reader.ReadInt32();
int vertSize = 20;
Bounds = new BoundingBox(reader.ReadSingle() * 2, reader.ReadSingle() * 2, reader.ReadSingle() * 2,
reader.ReadSingle() * 2, reader.ReadSingle() * 2, reader.ReadSingle() * 2);
PrimitiveCount = numVerts / 3;
byte[] data = new byte[numVerts * vertSize];
strm.Read(data, 0, (int)(strm.Length - strm.Position));
Buffer = new VertexBuffer(Engine.Current.Graphics.device, vertSize * numVerts, Usage.None, VertexFormats.PositionFixed | VertexFormats.Texture1, Pool.SystemMemory);
GraphicsStream gs = Buffer.Lock(0, Buffer.SizeInBytes, LockFlags.None);
gs.Write(data, 0, data.Length);
Buffer.Unlock();
DebugName = debugName;
}
Переходим к текстурам. Грузить напрямую png/jpg на КПК слишком долго, поэтому их я тоже перегоняю в собственный примитивный формат, который состоит из описания ширины/высоты, а также формата текстуры и собственно, самих пикселей. На данный момент поддерживаются только RGB565 текстуры — с ними MBX работает лучше всего:
public sealed class TextureConverter
{
public const int Header = 0x1234;
public static unsafe void Convert(string fileName, Stream stream)
{
Console.WriteLine("Converting texture " + fileName);
Bitmap bitmap = (Bitmap)Image.FromStream(stream);
byte[] pixels = new byte[bitmap.Width * bitmap.Height * 2];
System.Drawing.Imaging.BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format16bppRgb565);
Marshal.Copy(data.Scan0, pixels, 0, pixels.Length);
bitmap.UnlockBits(data);
using (Stream outStrm = File.Create(Path.GetFileNameWithoutExtension(fileName) + ".tex"))
{
BinaryWriter writer = new BinaryWriter(outStrm);
writer.Write(Header);
writer.Write(0); // 0 - 565, 1 - RGBA
writer.Write(bitmap.Width);
writer.Write(bitmap.Height);
writer.Write(pixels);
}
}
}
Загрузчик тоже получился примитивным и шустрым донельзя, пусть и без какой либо компрессии. PowerVR MBX поддерживает собственный формат компрессии — PVRTC:
BinaryReader reader = new BinaryReader(strm);
int hdr = reader.ReadInt32();
int fmt = reader.ReadInt32();
Width = reader.ReadInt32();
Height = reader.ReadInt32();
byte[] data = new byte[Width * Height * 2];
strm.Read(data, 0, data.Length);
Handle = new Texture(Engine.Current.Graphics.device, Width, Height, 1, Usage.Lockable, Format.R5G6B5, Pool.VideoMemory);
int pitch;
GraphicsStream gs = Handle.LockRectangle(0, LockFlags.None, out pitch);
gs.Write(data, 0, data.Length);
Handle.UnlockRectangle(0);
strm.Close();
Переходим, наконец, к фактическому рисованию модели! Для этого мы строим мировую матрицу для трансформации нашей модели, а также задаем вершинный буфер для, собственно, вершинного конвейера и посылаем видеочипу команду отрисовки. ZBufferWriteEnable нужен для отрисовки геометрии без записи в Z-буфер, что можно использовать, например, для реализации скайбоксов:
public void DrawModel(Model model, Transform transform, Material material)
{
Matrix matrix = Matrix.RotationY(transform.Rotation.Y * MathUtils.DegToRad)
* Matrix.Translation(transform.Position);
device.SetTransform(TransformType.World, matrix);
// Setup renderstate
device.RenderState.ZBufferWriteEnable = !material.DepthWrite;
device.SetTexture(0, material.Diffuse.Handle);
device.SetStreamSource(0, model.Buffer, 0);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, model.PrimitiveCount);
}
И рисуем модельку:
Model model;
Material mat;
Transform t;
void Start()
{
model = Model.FromFile("model.mdl");
mat = new Material();
mat.Diffuse = Texture2D.FromFile("test.tex");
}
void Update()
{
t = new Transform();
t.Position.Z = 150;
t.Rotation.Y += 0.1f;
graphics.DrawModel(model, t, mat);
}
Результат: у нас есть крутящийся кубик или любая другая произвольная 3D-модель!
Переходим к обработке ввода. Тут ничего сложного нет, ловим события KeyUp/KeyDown формы и назначаем виртуальным кнопкам их состояние.
public Input(Form parentForm)
{
keyState = new bool[(int)GamepadKey.Count];
parentForm.KeyPreview = true;
parentForm.KeyDown += new KeyEventHandler(OnKeyDown);
parentForm.KeyUp += new KeyEventHandler(OnKeyUp);
}
private GamepadKey ResolveKeyCode(Keys key)
{
GamepadKey k = GamepadKey.Count;
switch (key)
{
case Keys.Left:
k = GamepadKey.Left;
break;
case Keys.Right:
k = GamepadKey.Right;
break;
case Keys.Up:
k = GamepadKey.Up;
break;
case Keys.Down:
k = GamepadKey.Down;
break;
case Keys.Return:
k = GamepadKey.OK;
break;
}
return k;
}
void OnKeyUp(object sender, KeyEventArgs e)
{
GamepadKey key = ResolveKeyCode(e.KeyCode);
if (key != GamepadKey.Count)
SetKeyState(key, false);
}
void OnKeyDown(object sender, KeyEventArgs e)
{
GamepadKey key = ResolveKeyCode(e.KeyCode);
if (key != GamepadKey.Count)
SetKeyState(key, true);
}
public bool GetKeyState(GamepadKey key)
{
return keyState[(int)key];
}
private void SetKeyState(GamepadKey key, bool state)
{
keyState[(int)key] = state;
}
Теперь мы сможем управлять нашей машинкой в игре (которой пока ещё нет). Самая-самая основа для реализации игры подобного плана у нас есть, пора переходить к геймплею!
Одним вечером раздается звонок по телефону. Далее диалог:
-Здравствуйте,мы нашли вас на Пикабу.
Вы можете срочно починить телефон. Сегодня срочно уезжать нужно , а телефон не работает. У нас айфон 14 pro max и он ничего не показывает после съемки под водой в аквапарке.
-Да,когда ответила Я. Мы готовы помочь вам
Принесли такую красоту.
Телефон включался, но после того как с ним искупались с аквапарке, он решил превратиться в лягушку.
Интересный факт : На таких дисплеях можно восстановить дорожки шлейфа матрицы на специальном станке и они будут работать.
По времени такой ремонт занимает пару часов, но на такой ремонт нельзя дать гарантию.
Давайте откроем его и посмотрим что внутри?
Откручиваем все винтики и убираем пластины в сторону.
Так же я достала основную камеру чтобы она просохла,потому что под линзами было много воды.
После полной сушки устройства подключаем новый дисплей и проверяем на полную работоспособность его.
После всех манипуляций полностью собираем устройство и подготавливаем к выдаче.
В связи с ограничением по времени полный результат не удалось заснять нормально (((
Удалось сделать только фото окончательного результата.
P.S. Аппарат ни разу не вскрывался. Где же обещанная IP68 от Apple ?
Год назад смотрел видео в youtube “Картинку в 3D объект с помощью нейронной сети”, которая из изображения делает 3D модели. Ссылка на видео https://youtu.be/vHYxAMVFOb4?si=Q5vIlqkqz-7TAUxC Из недостатков этой нейросети было долгое ожидание генерации 3d модели (1 день) и сумма за готовую 3d модель, которая сопоставима со стоимостью заказа 3D модели на фрилансе. Под этим видео был комментарий следующего характера «Скорее это не нейронка, а просто дешёвый труд”. На тот момент я тоже подумал, что скорее всего делают люди и моделят за деньги. Со временем мое мнение поменялось. За последнее время нейронные сети стремительно развиваются. И сегодня доступно несколько нейронных сетей которые генерируют 3д модель по изображению или текстовому описанию
Большая Гауссова Модель
По своей сути Большая Гауссова Модель — это тип нейронной сети, которая может обучаться и генерировать сложные трехмерные фигуры на основе простых входных параметров. По сути, она действует как своего рода цифровой скульптор или художник, используя вероятности и статистику, чтобы заполнить пробелы между известными точками данных и создать связное, цельное целое. В одной из недавних демонстраций исследователи использовали Большую Гауссову Модель для создания детальных реконструкций целых зданий всего лишь из нескольких фотографий, сделанных под разными углами. Анализируя закономерности и особенности, общие для нескольких изображений, модель смогла заполнить недостающие детали и создать полное и точное представление экстерьера здания.
Видео по созданию с помощью программы LUMA AI
Нейросеть Pifu HD
Нейросеть PIFU - это алгоритм машинного обучения, который позволяет создавать 3D-модели человека на основе одной фотографии. Он был разработан в 2019 году командой ученых из Университета Цюриха в Швейцарии.
Процесс создания 3D модели с помощью PIFU начинается с загрузки фотографии человека в специальную программу для обработки изображений. Затем программа использует алгоритмы машинного обучения для анализа формы и пропорций лица на фотографии. На основе этих данных создается геометрическая модель, которая затем преобразуется в 3D модель.
Одной из особенностей PIFU является то, что он может создавать 3D модели людей с различными типами кожи, волос и глаз. Это позволяет создавать более реалистичные модели, которые могут быть использованы в различных областях, таких как медицина, кино и видеоигры.
Однако, следует отметить, что PIFU не является идеальным алгоритмом для создания 3D моделей людей. Он может иметь некоторые ограничения и ошибки, особенно если фотография не очень хорошего качества или если человек на фотографии имеет необычный тип лица или прическу. Кроме того, для создания 3D модели требуется достаточно высокое качество фотографии, чтобы алгоритмы могли точно проанализировать форму и пропорции лица.
Нейросеть ICON
ICON – революционная нейронная сеть, которая меняет традиционные методы создания трехмерных аватаров. В отличие от существующих методов, которые требуют либо постановочного 3D-сканирования, либо тщательно контролируемых двумерных изображений, ICON может создавать реалистичные 3D аватары из неограниченного количества реальных положений человека, используя только стандартные фотографии. ICON – Implicit Clothed humans Obtained from Normals (Неявные одетые люди, полученные от нормальных людей)
Попробовать нейросеть ICON https://hubai.ru/icon/
Создание 3D модели по текстовому запросу (описанию)
Мы рассказали Вам как нейросети могут создавать 3д модели по изображению. Но, нейросети способны не только создавать 3D модели из изображений, но и по текстовому описанию. Создание 3d моделей по текстовому описанию было лишь вопросом времени. Компания OpenAI создала генеративную нейросеть, которая способна преобразовывать текстовые промты в 3D-модели.
Нейросеть Shap E состоит из двух моделей: первая генерирует простое изображение на основе текстового запроса, а вторая — преобразовывает его в 3D-модель. Для этого она создает облака точек в пространстве, которые повторяют трёхмерную форму объекта.
Специалисты OpenAI обучили нейросеть Point-E создавать 3D-модели на массиве данных состоявшего из нескольких миллионов 3D объектов. В компании продолжат обучение алгоритмов, а также будут работать над тем, чтобы повысить качество детализации генерируемых моделей.
Нейросеть Shap-E с легкость генерирует предметы, скульптуры, архитектуру. И после повышения качества генерируемых 3д моделей в будущем это может пригодиться для 3D-печати. Или созданные нейросетью 3д модели будут появляться в виртуальных мирах,
В настоящее момент многие созданные нейросетью 3д модели из выглядят очень просто и даже примитивно, но потенциал этой нейросети весьма значителен.
Нейросеть TripoSR
TripoSR AI — уникальная платформа от компании Stability AI и Tripo AI, которая использует искусственный интеллект для создания первоклассных и удобных в использовании трехмерных моделей за считанные секунды! Благодаря современным методам синтеза и алгоритмам машинного обучения нейросеть TripoSR AI позволяет пользователям мгновенно преобразовывать тексты или визуальные изображения в сложные 3D-проекты, значительно сокращая время и ресурсы, необходимые для художественного творчества.
Попробовать нейросеть TripoSR https://hubai.ru/triposr/
Нейросеть для создания 3D модели с помощью карты глубины
Нейронная сеть, называемая генеративно-состязательной сетью (GAN), может быть обучена для преобразования двухмерных изображений в трехмерные модели. В данном случае нейросеть использует маску глубины изображения для определения глубины каждого пикселя на изображении. Затем эта информация используется для создания трехмерной модели, которая включает в себя текстуры и цвета, соответствующие исходному изображению.
Модель созданная при помощи нейрости с помощью карты глубины https://skfb.ly/oFoQz
Для обучения нейронной сети требуется большой набор данных, состоящий из пар изображений: двухмерного изображения и соответствующей ему трехмерной модели. Эти данные могут быть получены с помощью специальных 3D-сканеров или путем ручной работы.
После обучения, генеративно-состязательная сеть может быть использована для преобразования любого двухмерного изображения в трехмерную модель. Однако, следует учитывать, что результаты могут быть не очень точными, особенно если исходное изображение имеет низкое разрешение или содержит сложные детали.
Одним из основных преимуществ создания нейронных 3D-моделей является то, что оно устраняет многие ограничения, связанные с другими методами. Например, фотореалистичные 3D-модели, созданные традиционными методами, требуют обширных ресурсов, включая дорогостоящее оборудование, специализированное программное обеспечение и квалифицированных операторов. Более того, создание этих моделей вручную требует значительного времени и усилий, особенно для сложных сцен. Напротив, новый подход позволяет быстро и экономично создавать невероятно детализированные модели на основе базовых изображений. Это также облегчает создание динамических анимаций с участием виртуальных персонажей, которые убедительно двигаются и ведут себя.
Эта технология имеет множество практических применений в различных отраслях. Например, в сфере развлечений кинематографисты и игровые дизайнеры могут использовать Neural 3D Model Generation, чтобы воплощать в жизнь вымышленные миры и персонажей с большей легкостью и эффективностью, чем раньше. Между тем, преподаватели могут использовать его, чтобы предоставить учащимся интерактивную и увлекательную среду обучения, выходящую далеко за рамки простых учебников и слайд-шоу. Архитекторы и инженеры могут использовать его для виртуального тестирования проектов перед созданием физических прототипов, тем самым экономя ценные ресурсы и сводя к минимуму ошибки. Медицинские работники потенциально могут применять его для моделирования операций, помогая им в подготовке процедур и снижая риски во время реальных операций. Кроме того, розничные предприятия могут извлечь из этого выгоду, предлагая клиентам персонализированную демонстрацию продуктов удаленно через приложения дополненной реальности.
Несмотря на огромные перспективы, существует ряд проблем, которые необходимо преодолеть, прежде чем генерация нейронных 3D-моделей получит широкое распространение. Некоторые эксперты утверждают, что нынешний уровень точности все еще может не соответствовать определенным стандартам в конкретных областях. Более того, вычислительные требования для запуска алгоритмов могут существенно повлиять на производительность системы и энергопотребление, что требует мощной аппаратной настройки. Тем не менее, исследователи продолжают добиваться успехов в решении этих проблем, поэтому вполне вероятно, что в ближайшем будущем нас ждут дальнейшие улучшения.
В заключение отметим, что создание нейронных 3D-моделей — это инновационная и преобразующая технология, которая обещает изменить многие аспекты нашей жизни. По мере развития этой технологии мы ожидаем увидеть все более сложные и универсальные реализации, которые откроют множество новых приложений.
Приветствую. Или точнее так: вас приветствует всеми ненавидимый псевдообзорщик фильмов Акатош. Да-да, понимаю, но вот сегодня не будет подборок. Да и надеюсь что тема поста многим понравится.
Речь пойдёт о фильме "Идиократия". "Оо, ясно ТС только посмотрел фильм и бежит рассказать своё мнение".
Не-а, не угадали. Я посмотрел фильм трижды, а сегодня и четвёртый раз. Первый раз, для меня, он показался смешным. Второй снова смешным. А вот уже третий и четвёртый раз, как то не до смеха. Смотря на то что творится в мире...
Кхм, я умолкаю, никакой политики. Итак, предлагаю просто оценить фильм, а также узнать интересные факты о нём. Возможно кто-то его не смотрел, а другие просто знают "мемы" в интернете.
В любом случае, как всегда, приглашаю лишь ЖЕЛАЮЩИХ.
*Сюжет можно отнести к двум видам: фантастика и...реальность*
Прежде всего, давайте начнём с того, что такое "Идиократия"? Если бы вы спросили меня, то я бы ответил: Идиократия это фильм, сюжет которого зависит от вашего возраста. Например подросток рассмотрит его как "гыыыы посмеялся и забыл". А вот взрослый, посмотрит, немного улыбнётся, а потом начнёт грустить. Ибо понимает, что некоторые вещи, возможно, в теории, это то что нас ждёт.
Но не будем о грустном. Если не меня спрашивать, то вот есть выдержка из Википедии
«Идиократия» (англ. Idiocracy; от «идиот» + др.греч. κράτος «власть») — американская комедия 2006 года режиссёра и сценариста Майка Джаджа
В начале фильма рассказывается о влиянии естественного отбора на умственные способности и о причине численного превосходства глупых людей над умными.
Вместе с отупением человечества произошла деградация страны в целом — промышленность, инфраструктура были разрушены, по всей территории США выросли огромные мусорные кучи, нет ни одного живого растения, основным развлечением населения является просмотр порнофильмов, а из кранов вместо воды течёт энергетический напиток Brawndo. Также в стране произошла гиперинфляция — так типичной долларовой банкнотой является банкнота номиналом 10 млн долларов, обыкновенный кофе латте в Starbucks 2505 года стоит 200 долларов, а стоимость одного разговора по телефону составляет 2000.
Итак, дело в том что это комедия, но она рассматривается многими как пропаганда. Не-не ТС, не нужно "в лес идти". Вы правы, так что поговорим о другом.
С точки зрения сюжета, она рассказывает о солдате, которого заморозили, а затем он оказался в будущем. Вместо того, чтобы видеть космопорты, как в том же Mass Effect, он наблюдает лишь деградацию, деградацию, и ещё раз деградацию.
Кроме того, главный герой, оказывается единственным с высоким IQ, а также помнит многие вещи, которые даже забыли министры и президент США.
Но всё же это комедия. Местами это были отсылки, но чаще всего: стёб над тем, что может ждать планету в будущем.
Для примера вот вам фрагмент из фильма
Правда топовым этот фильм стал, благодаря всё же этой сцене. Ну наслаждайтесь, хотя тем кто сейчас ест и читает пост, мои соболезнования
Всё же вы пришли не за этим конечно же. Что же, тогда переходим ко второй части и поговорим об интересных фактах фильма
*Интересные факты фильма Идиократия*
1.Майк Дадж анонсировал выход фильма 5 августа 2005 года, но дата постоянно сдвигалась. В апреле 2006 года датой выхода было объявлено 1 сентября 2006 года, и несмотря на то, что в августе снова сообщалось о сдвиге, фильм вышел на экраны кинотеатров вовремя, но в результате давления Голливуда и угроз запретить показ релиз ограничился только шестью городами. (135 кинотеатров, тогда как обычные фильмы выходят на экраны 2500—3000 кинотеатров США). 20th Century Fox никак не продвигал фильм: не было ни постеров, ни телевизионной рекламы, ни анонсов. Возможно, сказались множество резких критических публикаций, обвиняющих фильм в фашизме и сексизме.
2. Кассовые сборы составили 444 093 доллара в 135 кинотеатрах в США.
3.«Одним из самых больших достижений был Crocs, - вспоминал Коэн. «Наш художник-постановщик [Даррен Гилфорд] заставил всех в фильме носить Crocs. Мы даже не знали, что это такое. Майк сказал: «Чтобы надеть это, надо быть идиотом!» К моменту выхода фильма все были в них
4.По словам Дакса Шепарда, сыгравшего Фрито Пендехо, кинозрители, которые хотели посмотреть фильм, могли с трудом его найти. «Даже в кинотеатрах, в которых он выходил, они не указали его правильно в Moviefone», - сказала Шепард корреспонденту The A.V. Клуб. «Я помню, что это была большая проблема. Они указали это как «Комедию Майка Джаджа без названия» с Фанданго, так что даже люди, которые хотели пойти посмотреть Идиократия не могли найти ».
5. Идея фильма «Идиократия» пришла в голову режиссеру Майку Джаджу после того, как он стал случайным свидетелем драки двух молодых мамочек в «Диснейленде». Режиссер подумал, что будет просто ужасно и печально, если мир ждет такое будущее
Добавлю от себя ещё один факт. В этом фильме "предсказали" появление интерфейса Windows 8. Не верите? Вот доказательство
Ну и конечно же, если говорить о рекламе, то и тут режиссёр попал в точку. Я правда телевизор не смотрю уже года как 3, но вот в ютубе стал замечать рекламу ДАЖЕ С ВКЛЮЧЁННЫМ Ад ГУАРД, а бесит!
*Общий итог*
Идиократия - фильм, который может поднять настроение благодаря актуальным шуткам, так и заставить впасть в депрессию. Но это уже другая история, и каждый расскажет её по-своему в комментариях. Или напишет что "ТС ты задолбал".
Жаль, но я надеюсь всё же, кому-то этот пост будет полезным.
Спасибо за внимание!
Поездка в Америку.
Вот уже неделя как вернулась домой на родину в Москву. Смена климата, джетлаг, всё это я на себе испытала. Но путешествие получилось удивительным. Я знаю, что в нынешней обстановке многие сочтут это крайне не патриотичным, но я так не считаю. Люблю Россию, но путешествия расширяют наш кругозор и я не могу без них жить.
Беверли-хиллс
Итак, я посетила Лос-Анджелес, Палм Спринг и Лас-Вегас.
Лос-Анджелес - город мечтателей, голливудских звёзд, бизнесменов, финансистов, творческих людей и многих других.
Я жила в Беверли-хиллс, да это самый дорогой район и самый безопасный. Проблема бездомных у них очень серьёзная, поэтому жить в Downtown многие не хотят - опасно. К примеру, я хотела посетить Hollywood boulevard, но мне объяснили, что лучше не рисковать и не ехать туда, максимум посмотреть из машины и не выходить. Я, прямо сказать, была шокирована.
Но климат в ЛА конечно потрясающий, ходила в лёгком свитере или кожанке в январе, но и тут не обошлось без сюрпризов. В первые за 20, а может даже 30 лет в ЛА был шторм. Дождь лил неделю, местные к такой погоде не привыкли. Крыши потекли, цокольные этажи затоплены, машины встали, деревья попадали, а потом ещё и свет отключили. Но было весело. Такая погода длилась почти неделю, но не испортила мне каникулы. После нашей зимы, меня дождем не напугать.
ЛА - дорогой город. На мой взгляд, даже дороже Лондона. К примеру, снять 1-комнатную квартиру с новым, но достояно простым ремонтом в Downtown стоит 3-4 тысячи долларов. Но я видела дома, где есть не только зал, но и караоке, шикарный домашний кинотеатр, переговорная, винная комната, баскетбольная площадка, даже стена для скалолазания. Но для детей я не видела ни одной детской площадки. Вообще у меня сложилось впечатление, что Лос-Анджелес - город не для семьи. По крайней мере, люди с этим там не спешат. Это уж точно.
Еда…конечно у нас лучше. В 1000 раз. Полезнее и вкуснее. Да, много ресторанов итальянских, азиатских, даже как-то попробовала заказать русскую кухню. Вкусно, но не так как у нас. А на гамбургерах и куриных крылышках я набрала три килограмма.
Палм-Спринг - чудесный город в пустыне, который меня очаровал. Это город для выходных. От ЛА примерно 2-3 часа на машине. Сюда приезжают играть в гольф, стрелять в пустыне и конечно же смотреть и играть (те, кто могут себе это позволить) в Поло. Да, это спорт аристократов. Дорогой, травмоопасный, сложный, но невероятный. Я влюбилась с первого взгляда. Всё как в кино. Идеальные зелёные поля, красивые ухоженные лошади, люди со своим собаками приходят смотреть эту красивую, эффектную игру. Чтобы играть в Поло и содержать собственную команду нужно примерно 1 миллион долларов в год.
Интересно, что игра это зародилась в Аргентине, там практически все играют в Поло, а поэтому лошадей и игроков покупают именно там. Да, владелец команды может купить игрока. Их зарплаты варьируется: игрок, который забивает один гол в игру получат 10 000$, соответственно 2-20$, 3-30$. Думаю, принцип вы поняли.
Самое интересное, что даже если команда выиграла турнир, они получают только статуэтку лошади, фото с награждения и конечно же аплодисменты. Да это все.
Но это не касается, профессиональных игроков, такие играют только во Флориде.
Лас-Вегас. Меня не впечатлил, да как в фильмах, но это не мой город. Я не играю в казино, а потому для меня этот город как огромный Торговый центр с автоматами, рулетками, магазинами, отелями, ресторанами, барами. Вообщем если вы не знаете как потратить деньги быстро, то посетите Лас-Вегас.
На этом всё, Америка - интересная страна, со своим колоритом, особенностями и энергетикой. У них правда другая энергетика, они верят в успех и американскую мечту. Надеюсь, однажды посетить Нью-Йорк, Вашингтон и Сан-Франциско, а также вернуться в ЛА, увидеть Малибу в солнечную погоду и покорить волны океана на доске для Сёрфинга.
Спасибо всем
Хорошего дня !
Дай бог здоровья всем и мне
✪ Спасибо за просмотр. Если вам понравилось видео, пожалуйста, «Подпишитесь» — «Мне нравится» — «Поделиться» — «Комментировать».
Исходное видео в режиме реального времени:
Оборудование:
-телескоп Coronado PST H-alpha 40 mm
-монтировка Sky-Watcher AZ-GTi
-светофильтр Deepsky IR-cut
-камера QHY5III178m.
Место съёмки: Анапа, двор.
Справились? Тогда попробуйте пройти нашу новую игру на внимательность. Приз — награда в профиль на Пикабу: https://pikabu.ru/link/-oD8sjtmAi
Это странное плоское здание в городе Александрия (Египет) по праву получило прозвище LCD (Liquid Crystal Display -жидкокристаллический дисплей).
Возможно, это один из самых узких жилых домов в мире. 17-этажное здание расположено на крошечном кусочке земли и всем своим видом будто противоречит здравому смыслу. Если верить информации из интернета, его ширина не превышает и пяти метров.
Дом построен примерно в 2002 году с нарушением строительных норм во время кризиса нелегальной недвижимости в Александрии. В этом городе вообще очень много страшных многоэтажек, которые расположены слишком близко друг другу и выглядят очень плохо и неухоженно.
Конечно, в мире полно и других плоских (узких зданий), как жилых, так и не жилых. Но те красивые здания, что вы можете легко найти в интернете по запросам типа «самые узкие здания в мире» не так сильно шокировали меня.
Александрийский дом же своим видом пугает и напоминает ошибку проектировщика или жертву распила бюджета на строительство. Эта обшарпанная многоэтажка из серых бетонных блоков почти без окон выглядит как часть постапокалиптического пейзажа.
Еще одной странностью александрийского плоского дома является то, что окна на узкой боковой части –разного размера и формы. Как будто жители сделали их сами.
На боковых поверхностях здания окон вообще очень мало. К сожалению, фото задней части дома мне найти не удалось. (Картинка на 9 секунде последнего видео в посте -это не тот дом)
В ночи он еще более жуткий.
В одном источнике написано, что на каждом этаже находится одна длинная квартира, примерно из 5 комнат. А в другом - что каждый этаж разделен на две квартиры. Я больше склоняюсь к версии с одной квартирой, потому что в ином случае каким-то жильцам досталось бы всего одно окно в узком торце здания.
Схема этажа
Пишут, что несмотря на слишком узкую форму дома, внутри него имеется лифт
Дом расположен прямо на набережной Средиземного моря. Как показал снимок со спутника, он все же не совсем плоский. Вот скриншоты с Google карт.
Скриншот с карты
Фото со спутника
Адрес здания: 124 Khaled Ibn Al Walid, Sidi Beshr Bahri, Montaza 2, Alexandria Governorate 5517186, Египет.
Пикабушники, кто разбирается в конструктивных особенностях зданий, как вам такая форма дома?
Видео: