Більше

Як визначити CRS для вигаданої ігрової карти в QGIS?

Як визначити CRS для вигаданої ігрової карти в QGIS?


Я збираюся почати грати в рольову гру в стимпанк під назвою The Iron Realm, яка використовує вигадану карту світу. Нещодавно я почав використовувати QGIS v1.7 і не маю реального досвіду роботи з ГІС-системами. Я імпортував карту як растровий шар до нового проекту QGIS і створив з нього кілька векторних шарів, включаючи шар багатокутників для регіонів, точковий шар для міст та лінійний шар для деяких доданих залізничних колій та доріг.

Майстер гри щойно додав шкалу та деяку інформацію про ширину / довжину на ігрову карту:

З цього я припускаю, що тепер я можу додати CRS до свого проекту QGIS. Я не уявляю, як це зробити, і справді був би вдячний за допомогу, щоб я міг ефективно використовувати свій проект QGIS з грою. Я припускаю, що мені потрібно буде створити власну CRS, але я абсолютно не знаю, як це зробити. Я думаю, це має щось спільне з proj.4, але я не уявляю, як ним користуватися.


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

Однак, оскільки це ігровий світ, ви можете вільно пограти з ним до душі. Перше, що ви можете зробити, це вирішити, наскільки це великий світ, припустивши, що шкала представляє горизонтальні відстані на екваторі. Схоже, це близько 32 градусів на 1000 км, що дає вам екваторіальний окружність 11 250 000 м і радіус 1790493,11 м, що робить його приблизно розміром Місяця. Наступне, що земля є приблизно еліпсоїдом, будучи більш плоскою на полюсах. Для Землі обернене співвідношення радіуса полюса до полюса та екваторіального становить приблизно 298,25, Місяць майже сферичний у 800.

Озброївшись цією інформацією, ви можете створити своє визначення proj4:

+ proj = eqc + a = 1790493.11 + lat_ts = 0 + lon_0 = 0 + rf = 800 + одиниці = m + no_defs

+ lat_tsне є суворо необхідним, але корисний для довідки. Це «широта справжнього масштабу», на якій ми базували наш екваторіальний окружність.+ lon_0представляє довготу центру карти, яка в цьому випадку є первинним меридіаном.

Відкривши QGIS і вибравши користувацькі CRS ..., я ввів наші параметри в тестове поле і ввів північ 0, схід 32, що дає мені 1 000 000 м, що є нашими 1000 км, які ми очікували для стільки градусів на екваторі. Тож продовжуйте створювати власну CRS із запам'ятовуваною назвою.

Тепер вам просто потрібно здійснити географічне посилання на карту, використовуючи плагін геореференції та вибравши три відомі точки. Коли я це зробив, я поставив один на екваторі / первинному меридіані, один 32 градуси (іш) на схід на екваторі, один 32 градуси (іш) на північ на першому меридіані. Обидві ці останні точки мають значення x та y 1000000 відповідно.

І це все! Однак, як я вже говорив раніше, у цій проекції ваші відстані зі сходу на захід будуть дедалі неточнішими від екватора, тому, можливо, варто створити ще кілька "локальних" прогнозів для різних країн, а також CRS / lat / long, але що на цьому етапі стає трохи глибшим. Можливо, вам буде корисно читати на картографічних проекціях (просто погугліть) і читати запис Вікіпедії для картографічних проекцій, що має дати вам краще уявлення про те, як все це працює.

До речі, довгий / лат CRS для вашого світу просто буде таким:

+ proj = lonlat + a = 1790493.11 + rf = 800 + no_defs

Якби він дав вам довжину (залежно від формату), існує лише два місця, які можуть бути у всьому світі. Якщо у вас є - символ перед longitutde є лише одне місце.

Якщо подумати, можливо, у грі набагато менший еліпсоїд, ніж у нас. Зробіть весь світ навколосудноплавним за коротший час. Якщо так, ви можете просто змінити висоту еліпсоїда wgs84.


Як передати зовнішню змінну в пакетний Apex?

У мене є змінна map, яку я намагаюся передати в пакетний клас. Ця змінна була створена та заповнена в іншому пакетному класі (саме тому я не можу просто створити її в методі Start () другого пакетного класу).

Перший пакетний клас імплементує Database.Stateful, щоб зберегти значення, які я зберігаю у змінній map. Потім у методі Finish () я викликаю другий пакетний клас, передаючи змінну map, приблизно так:

Проблема, з якою я стикаюся, полягає в тому, що я не можу змусити другий пакетний клас визнати, що я передав йому цю карту. Я спробував використати призначення this.variable в класі конструктора, не маючи чіткої доцільності, безрезультатно. Ось уявлення про те, як виглядає цей другий пакетний клас зараз:

У цьому форматі пакетний клас не розпізнає mapVariable (каже, що він не існує). Я також спробував зробити цей пакетний клас станом, а також оголосити mapVariable окремо перед методом start (), подібно до змінної запиту, яка, на мою думку, може знадобитися для виконання призначення this.mapVariable.

Як я можу зробити так, щоб цей клас Batch міг використовувати змінну map, яку я намагаюся передати йому? Дякуємо за допомогу та щасливого Різдва / веселих свят!

Отже, я змусив його працювати (або принаймні зберегти без помилок), оголосивши змінну карти перед методом start (), а потім призначивши їй передану змінну, приблизно так:

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

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

По-перше, моє "рішення" з EDIT 1, здається, не працює (я думаю, що карта, яку я використовую у своєму другому пакетному класі, насправді є порожньою картою, а не тим, що я намагався передати з першого пакетного класу).

У будь-якому випадку, у відповідь на запит Crop1645, ось перша частина коду для мого пакетного класу без будь-яких спрощень або абстракції (що я зробив у своєму першому прикладі коду):

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


Я думаю, що замість використання gluLookAt вам слід просто перекласти камеру. Я не впевнений, як ви малюєте свої 2D-зображення, але, як правило, ви малюєте свої зображення з координатами X і Y і залишаєте Z на 0. Якщо ви йдете цим шляхом, я рекомендую використовувати gluOrtho замість glPerspective.

Я рекомендую знайти хорошу книгу про перетворення OpenGL. Хоча ця книга застаріла, концепції цієї глави залишаються корисними: http://www.glprogramming.com/red/chapter03.html

Спочатку зрозумійте різницю між стеками матриць GL_MODELVIEW та GL_PROJECTION.

Матриця GL_MODELVIEW призначена для позиціонування та орієнтації об’єктів у світі щодо камери. Це переміщує ваші об’єкти через такі координатні простори:

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

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

Ці два перетворення об'єднані в одне, перетворення моделі, оскільки вони насправді просто працюють разом, щоб переміщати об'єкти у світі щодо камери.

Матриця GL_PROJECTION перетворює ваші об'єкти через такі пробіли:

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

Перша проблема, яка виникає у вас, полягає в тому, що ви намагаєтесь застосувати вид перетворення в матрицю GL_PROJECTION. Це неправильно. вид перетворення повинно бути частиною матриці GL_MODELVIEW. Трансформаціями подання, які ви застосовуєте, є glTranslatef та gluLookAt. Вони повинні застосовуватися до матриці GL_MODELVIEW.

Ваша друга проблема полягає в тому, що ви неправильно розумієте gluLookAt - зокрема, аргументи з 4 по 6. Ви намагаєтесь надати йому напрямок, в якому камера повинна дивитись (0,0, -1), по від’ємній осі z. По-перше, якби це було те, що очікувалось від gluLookAt, це все одно було б неправильно, тому що ви хочете, щоб ваша камера дивилася вздовж осі y. Тим не менше, вона насправді очікує на позицію у світі. Куди б ви не поставили свою камеру, вона буде дивитись на точку (0,0, -1), яка знаходиться прямо біля кута вашої карти, яка знаходиться на (0,0,0).

Ви взагалі не повинні використовувати gluLookAt, оскільки ви не хочете дивитись на конкретну точку. Це набагато простіше зробити з обертанням, щоб камера виглядала вздовж від’ємної осі Y, у поєднанні з перекладом, щоб камера знаходилась на висоті від карти. Зауважте, вам слід застосовувати зворотні перетворення, ніж ви очікуєте, оскільки ви дійсно віддаляєте карту від камери, а не камеру від карти. Щось на зразок цього:

Переконайтеся, що це перші перетворення на матриці GL_MODELVIEW.


1 відповідь 1

У вашій схемі є кілька помилкових уявлень.

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

Відкритий ключ суб'єкта (у вашому випадку: заявника) включається дослівно до КСВ, як і інформація про суб'єкта. Це підписується за допомогою відкритого ключа суб'єкта та всього, що передається в ЦС.

Не у формі діаграми, але ось кроки для побудови КСВ та які дані включені: Правильними кроками для побудови КСВ (не у формі діаграми) є:

  • Створіть CertificationRequestInfo, використовуючи:
    • Ім'я предмета
    • Тема відкритого ключа
    • Інші атрибути
    • CertificationRequestInfo
    • Підпис
    • Алгоритм підпису

    Зверніть увагу, що CSR все ще містить відкритий текст CertificationRequestInfo та відкритий ключ теми .

    Отримавши КСВ, ЦС більш-менш зробить наступне:

    • проаналізуйте КСВ
    • переконайтеся, що підпис відповідає полям у CSR, використовуючи відкритий ключ теми
    • переконайтеся, що різні поля відповідають його вимогам (наприклад: ви не можете вимагати CN = google.com, не підтвердивши, що ви є власником домену)
    • створити сертифікат, використовуючи деякі поля з CSR, деякі з себе
    • підпишіть сертифікат, використовуючи його закритий ключ (видавця)

    Остаточний сертифікат все ще містить поля теми та відкритий ключ суб’єкта.

    Щоб більш конкретно відповісти на ваші два запитання:

    1. відкритий ключ суб'єкта - одне з полів у КСВ. Ніщо не зашифровано, просто підписано.
    2. поля теми копіюються в остаточний сертифікат, вони є там, щоб їх побачив будь-який клієнт.

    Ви можете побачити список полів сертифікатів у RFC5280. Немає хешу CSR оскільки в цьому немає необхідності, вся відповідна інформація була скопійована у власні поля сертифіката.


    1 відповідь 1

    Щоб підтримати малювання на основі плитки карти довільно великих меж, потрібно застосувати підхід не рендеринг кожна плитка весь час. Вам потрібно лише спробувати намалювати те, що бачив гравець, будь-які інші спроби розіграшу - це марна трата часу та ресурсів на обробку. Це API-агностичний підхід, і не має значення, чи використовуєте ви Pygame, cocos2d або будь-який інший API.

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

    • положення на глобальній карті плитки, яку дивиться гравець,
    • розмір (у плитках) видимого навколо, центрований навколо цієї позиції вигляду

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

    і намалюйте лише плитки, обмежені вищезазначеними чотирма змінними.

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

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

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


    2 відповіді 2

    Ви правильно записали запис у реєстрі. Вам навіть не потрібно перезавантажуватися.

    Якщо для LogLevel встановлено значення, що не відрізняється від нуля, то всі Kerberos помилки буде зареєстровано в Система журнал подій. "Успіхи" Kerberos не реєструються однаково. (Помилки Kerberos - це такі речі, як AP_ERR_MODIFIED, PRINCIPAL_UNKNOWN тощо)

    Налаштування LogLevel не впливає на те, що відображається в Безпека журнал подій, однак.

    Це завжди працювало так. Сервер 2012 R2 не відрізняється в цьому плані.

    З іншого боку, якщо ви очікуєте побачити детальніші події "Успіх аудиту" та "Неудача аудиту" щодо активності квитків Kerberos у вашому журналі подій безпеки, якого ви зараз не бачите, вам потрібно налаштувати розширену політику аудиту . але Я вважаю, що більшість із цих подій реєструються лише на KDC / контролерах домену. (Наприклад.)


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

    Це надає вам список допустимих розрахунків для встановлення лінії постачання з:

    На карті видно всі лінії подачі:

    Ви, мабуть, вирівняли харизму щонайменше до рівня 6, це можна зробити, перейшовши на пільги

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

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

    Якщо натиснути кнопку, з’явиться вікно із запитом вибрати населений пункт, куди потрібно переселитись.

    Щоб перевірити, які населені пункти пов’язані між собою, відкрийте свою карту та натисніть (Показати лінії постачання)


    Як правильно налаштувати правильний пункт меню GRUB 2 за замовчуванням?

    Я збираю власні ядра вручну, а потім встановлюю їх у / boot за допомогою make install. На даний момент я маю такі ядра в / boot:

    Запуск grub2-mkconfig призводить до таких результатів:

    Якщо я зараз прочитав отриманий файл /boot/grub2/grub.cfg, я помітив, що були створені такі записи:

    • Основний запис за замовчуванням, який запускається vmlinuz-3.7.4-gentoo-third
    • Підменю з усіма іншими записами (включаючи відновлення), у тому ж порядку, що і команда grub2-mkconfig

    Проблема полягає в тому, що під час завантаження я хотів би завантажити за замовчуванням п’яту версію мого ядра (vmlinuz-3.7.4-gentoo-5), а не третю (vmlinuz-3.7.4-gentoo-third). Я також вважаю за краще не отримувати доступ до підменю для вибору потрібного ядра для завантаження.

    Як я можу змінити цю поведінку? Як я можу сказати GRUB, що я хочу запустити п'яту версію мого ядра за замовчуванням, а не стару третю версію? Взагалі, як я можу змінити рядок введення за замовчуванням, щоб він відповідав ядру, якого я хочу, а не, здавалося б, випадковому, вибраному GRUB?

    Я також спробував розмістити наступні рядки в / etc / default / grub:

    Це не вирішує проблему так, як я бажаю. Але принаймні GRUB, здається, пам'ятає останнє ядро, з якого я завантажився, і автоматично вибирає його з підменю. Просто я не люблю отримувати доступ до підменю.


    Методи еволюції Ліафеона і Глацеона були змінені. Ліафеон тепер еволюціонує за допомогою Листового Каменя, а Глацеон - за допомогою Крижаного Каменя.

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

    Якщо ви хочете Сильвеона, йому потрібно принаймні 160 дружби / прихильності та знання казкового типу. Якщо ви хочете Espeon або Umbreon, він потребує принаймні 220 дружби / прихильності і не повинен знати казкового типу. Дивіться цю відповідь, щоб отримати додаткову інформацію про зміни, внесені у дружбу / прихильність.


    Як налаштувати IIS для надання доступу до мережевих ресурсів для PHP-скриптів?

    Зараз я працюю над інтерфейсом PHP, який об’єднує ряд програм, що працюють на окремих серверах, багато з цих програм генерують файли, до яких мені потрібен доступ, але ці файли (з різних причин) знаходяться на батьківських серверах.

    Якщо я, з командного рядка, видаю трохи сценарію, такого як:

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

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

    Відповідна статистика: Windows Server 2008 Standard SP2 IIS 7.0 PHP 5.2.9

    Я підключатимуся до двох типів серверів: до кількох інших майже однакових машин Server 2008 та до машини, що працює на вбудованій XP.

    Посилання, які не були особливо корисними, але, можливо, я просто неправильно читаю:


    6 Відповіді 6

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

    Світова структура - це не те, про що можна дізнатися зі 100% безпекою без інструменту. На роботі є математична функція, яка використовує насіння для обчислення того, як буде виглядати світ.

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

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


    Перегляньте відео: Heatmap Tutorial Using QGIS easy way