Как определить угловой размер в компьютерных играх
Всем доброго времени суток
Когда возникает желание что-то посчитать в игре, то нередко приходится определять размеры объектов по их изображению, то есть иметь дело с угловыми размерами объектов. Например, есть за картой звездолет и хочется узнать, насколько он большой. Для этого как раз нужно в том числе и определять его угловой размер. Что это такое и как его найти и будет рассказано в этом посте
Что такое угловой размер
Угловой размер - это мера того, насколько большим мы видим объект. И пожалуй объясню это на примере
Представьте, что вы стоите напротив шара диаметром 3 метра и смотрите на него. Сперва вы смотрите на него с расстояния в 1 метр, затем отходите подальше и смотрите уже с 4 метров. Сам шар размеры свои не изменил, однако для вас он стал меньше, потому что вы удалились. И вот как раз то, насколько большим вы его видите, угловой размер и показывает:
Естественно, угловой размер связан не с самим шаром, а с диаметром круга, который мы видим (изображение шара для глаза - это круг). Ну то есть в общем случае он связан с отрезком, который видит человек, камера или персонаж в игре
Как строится изображение
Предупреждение: так как я не занимаюсь разработкой видеоигр, то могу не могу быть полностью уверен в данной математической модели. Если она ошибочна в общем случае, то прошу указать об этом в комментариях
Спроецируем все объекты, которые мы можем увидеть из некоторой точки на какую-то поверхность. Вот только на какую? Так как по любому направлению проецироваться объекты должны одинаково, то очевидным будет сделать проекцию на сферу, в центре которой находится наблюдатель. На этой сфере находятся все объекты, которые может увидеть наблюдатель, изменяя только направление своего взгляда. Естественно, из-за ограниченного угла обзора наблюдатель видит только часть этой сферы
Однако мониторы прямоугольные и, в основном, плоские, поэтому теперь видимый кусок сферы нужно спроецировать на прямоугольник. Отсечем от сферы те части, которые наблюдатель не видит, а из концов отрезанного куска проведем прямые, пересекающиеся в центре. На этих отрезках и будет лежать прямоугольник, и для удобства его можно построить прямо на концах куска сферы:
Зеленая плоскость - это как раз плоскость монитора
И теперь, чтобы спроецировать некоторую точку на плоскость монитора, проведем прямую от этой точки на сфере до центра сферы. Точка пересечения с плоскостью и будет проекцией точки на эту плоскость. Кстати, такой метод проецирования объясняет, почему по краям изображение растягивается
Находим угловые размеры
Пусть есть какой-то отрезок, который находится в поле зрения наблюдателя. Проведем прямые из концов этого отрезка в центр сферы. Угол между прямыми как раз и будет угловым размером этого отрезка. Теперь пересекаем эти прямые с плоскостью монитора и получаем концы отрезка уже на изображении. И теперь, если нам известны точки, которыми отрезок ограничен, то мы можем определить угловой размер. Как это сделать?
Сперва введем 2 системы координат: одна 3-мерная, из центра сферы, другая 2-мерная, связанная с плоскостью монитора:
Здесь L - длина изображения в пикселях, D - высота, что, впрочем, видно и по рисунку. Также здесь у нас появилась неизвестная H, которую надо бы найти. Рассекаем объекты с рисунка плоскостью xOy и, соединяя с началом координат края сечения монитора получим следующую картину:
Так как начало координат находится ровно над центром монитора, то мы получаем равнобедренный треугольник. Теперь можем из FOV-а (угла обзора) и длины изображения выразить неизвестную:
Изначально мы будем знать координаты точки в системе координат монитора (например, координата пикселя в Paint-е), поэтому из них определим координаты уже в системе Oxyz для некоторой точки:
Не забываем, что Oxyz находится над центром монитора
Теперь вернемся к исходной картинке, нанесем на плоскость точки A и B, которые будут границами нашего отрезка и проведем вектора из наблюдателя (нуля Oxyz) в эти точки:
Напомню, что эти векторы лежат на прямых, угол между которыми нужно найти. А значит нужно найти угол между векторами. Тут же напрашивается скалярное произведение этих векторов, поэтому не будем изобретать велосипед и воспользуемся им:
Вторая картинка - та же формула, но с записью обозначений, чтобы ее можно было сохранить и потом быстро ею воспользоваться
Ну и что ж, вот конечная формула. Определяем координаты пикселей, разрешение и угол обзора, подставляем в формулу и получаем угловой размер. Однако такая формула выглядит довольно громоздко, поэтому я решил написать небольшую консольную программу, которая сможет считать угловые размеры. Оставлю здесь ссылку для скачивания на Яндекс диск, а также код самой программы, вдруг кто захочет разобраться в ней:
Ну а на этом все, удачи вам в расчетах и вычислениях)
На какой широте расположен Сумеру? | Genshin Impact
Всем доброго дня
Сегодня решил глянуть синематики, посвященные уже вышедшему аль-Хайтаму. И тут мне на глаза попался один довольно интересный и, естественно, информативный кадр, вот он:
Здесь мы видим вращение звездного неба, а оно, как известно, вызвано вращением Земли вокруг своей оси. По положению точки, вокруг которой крутятся звезды, и по направлению вращения можно примерно определить широту точки наблюдения, то есть Сумеру (ну аль-Хайтам из Сумеру, и пейзажи сумерские, думаю, в синематике Сумеру показан). Что ж, приступим
Начнем с углового значения широты (хотя на этом мы и закончим). Чтобы понять, что и как должно вращаться, нарисуем вращение Земли Тейвата относительно небесной сферы, а затем небесной сферы относительно сферической поверхности Тейвата:
Оставлю небольшое замечание: Тейват таки является сферическим, об этом говорит один из ученых, который как раз вычислял его кривизну:
Точка, вокруг которой крутятся звезды, должна лежать на оси вращения звездного неба относительно поверхности (короче на оси вращения Земли Тейвата) и при этом она лежит на оси вращения звездного неба относительно наблюдателя. Вот картинка для наглядности:
Так как эта точка бесконечно удалена, то можно считать, что те две оси параллельны. Теперь разрезаем планету и видим, как связано угловое расстояние от той точки до горизонта и широта:
Доказательство построения: так как оси вращения пересекаются, то они образуют плоскость (этой плоскостью мы резали планету). В то же время радиус из центра к наблюдателю проходит через обе оси, значит он лежит в этой плоскости. Касательная плоскость перпендикулярна радиусу => она перпендикулярна первой плоскости => чтобы определить угол между осью наблюдателя и плоскостью нужно определить угол между осью и прямой пересечения плоскостей. Это как раз показано на рисунке
Как мы видим, угловое расстояние от точки до горизонта и есть широта
А теперь внимательно смотрим на картинку из начала поста и замечаем, что эта точка находится где-то рядом с горизонтом, значит, широта Сумеру близка к нулю. Ну а это значит, что Сумеру расположен близко к экватору. В южном полушарии или в северном - не имеет значения, ибо точное угловое расстояние не получить - и горизонт, и точка вращения спрятаны за горами
Разве что можно сказать, куда смотрит аль Хайтам. Вспоминаем один из чертежей, но теперь проводим касательную, лежащую в одной плоскости с осью вращения:
По картинке понятно, что если смотреть на юг, то звезды будут крутиться по часовой стрелке. Прям как на кадре из синематика. Значит, аль Хайтам смотрит куда-то на юг. К слову, вот похожее место:
Ну а на этом все. Надеюсь, пост получился интересным, а, может, кому-то даже помог чуть-чуть разобраться в геометрии и астрономии
Всем добра и выигранных 50/50)
Площадь государств в Genshin Impact
Во-первых, спасибо пользователю @Lemonkingsman за идею для данного поста
Во-вторых, в посте будут рассчитаны только площади государств на основной карте, то есть здесь не будет Энканомии (так как у меня нет возможности перевести пиксели с карты в метры), Разлома (так как в принципе глупо считать площадь шахты, которая находится под землями государства-владельца) и Архипелага Золотого Яблока (возможно выпущу пост конкретно о нем чуть попозже, на данный момент я не закончил ивент с этой локацией и толком не разобрался с заменой островов)
В-третьих, приятного прочтения :)
Для самых нетерпеливых или тех, кто не хочет погружаться в математику, результаты всех расчетов в конце поста
Итак, перед тем как начинать расчеты, нужно определиться, что будет считаться территорией государства. В моем случае это (помимо суши) будут различные заливы, проливы и бухты, а также острова и в некоторых случаях прибрежные к островам воды. Это сделает расчеты несколько проще (вернее сделает их менее долгими и нудными для меня), ну и помимо этого, подобные объекты в реальности также считаются территорией страны. Также я не буду учитывать территориальные воды, так как будет довольно проблематично отмерять от берегов по 12 миль (страны на карте в GI довольно маленькие)
С понятием площади разобрались. Теперь, перед тем как перейти к работе с картой, определим площадь одного пикселя карты в квадратных метрах. Это нам понадобится позже, чтобы площадь из пикселей перевести в метры. Для этого я воспользуюсь уже имеющейся у себя меткой на карте, до которой мне известно расстояние из конкретной точки:
Черный отрезок - отрезок между меткой и указанной выше точкой
Сразу понятно, что площадь пикселя будет равна квадрату длины пикселя. Длину же пикселя можно вычислить как отношение длин данного отрезка в метрах и в пикселях (уж простите за такое количество слов пиксели). Через Paint находим координаты обеих точек (если быть точнее, то находим длину отрезка по оси Ox и по оси Oy, Paint это показывает сам) (сразу добавлю, что все операции с картой делались при максимальном удалении/масштабировании (то есть так, чтобы как можно больше территорий было видно)). И затем через теорему Пифагора находим искомую длину отрезка в пикселях, затем находим длину самого пикселя, а затем и его площадь:
Теперь можем полноценно перейти к карте
И в первую очередь нам нужно ту территорию, которую мы видим на карте превратить из просто изображения в какой-то контур, то есть аппроксимировать. Я это буду делать с помощью отрезков: так гораздо проще, да и погрешность будет незначительной. Попутно с рисованием отрезков записываем координаты каждой точки, в которой заканчиваются отрезки (так как контур замкнутый, то точка, в которой заканчивается один отрезок, будет началом другого отрезка)
Вот так получилось упростить карту у меня. Также можно заметить, что некоторые очень малые острова я обозначил окружностями. С ними будет и результат точнее, и расчеты проще. А еще как же я теперь ненавижу Инадзуму, на которую ушло больше всего времени, бумаги, и получилась она хуже всех
Итак, теперь у нас есть более-менее простые контуры, как определить их площадь? В первую очередь скорее всего приходит идея разбить контур на прямоугольники и прямоугольные треугольники и считать площадь так. Да, так можно сделать, но лично я не готов тратить часов 10 на разбиение всех этих контуров, да и решение получится каким-то слишком топорным. Поэтому я использую 2 козыря у себя в рукаве, первый из которых - это интеграл:
"Занимательная математика. Производные и интегралы. Манга" с.92
Второй же козырь - программирование
В совокупности можно получить довольно простую программу, которая по точкам посчитает площадь контура
Начнем с математических основ программы, то есть выведем в общем виде и линейную функцию, описывающую данный отрезок, и интеграл этой функции в пределах существования отрезка (функции)
Начнем естественно с самой линейной функции. Нам известны 2 точки, которые принадлежат отрезку, а значит можно составить систему уравнений, из которой можно найти коэффициенты k и b для уравнения функции y = k*x + b
Коэффициент b можно было бы выразить и через координаты точек, а не через k, но в случае с программой будет проще правильней последний вариант
Теперь перейдем к интегралу. Но перед этим тем, кто с интегрированием не знаком, советую ознакомиться с формулами и свойствами, которые будут использованы:
В качестве пределов интегрирования берем точки x1 и x2, а затем находим определенный интеграл:
Теперь определимся как будем считать площадь контура (хотя по нормальному это нужно было бы описать перед переходом к интегралам, но да ладно). Мы будем суммировать полученные интегралы, в результате чего получим число равное площади этого контура. В данном случае получится так, что интегралы "нижней" части контура будет больше искомой площади на некоторое число S, а интегралы "верхней" части контура как раз таки вычтут это S и мы получим то, что ищем. Правда есть небольшой нюанс, в зависимости он направления обхода контура (с правилами Кирхгофа это никак не связано :) ) Площадь получится либо положительной, либо отрицательной, однако для обоих случаев модули будут равны и друг другу, и искомой площади
Приступим к программированию
Подробное описание работы кода в конце поста
Программа работает довольно просто. Сначала вводим количество точек в контуре, затем вводим x-овые и y-овые координаты этих точек через Enter. Вот например площадь треугольника (как наиболее простой вариант), заодно показан нюанс с положительной и отрицательной площадью
Вершины треугольника имеют координаты (1; 3); (-3; -2); (3; -3)
Затем считаем количество точек в каждом контуре и вводим эти точки в программу (каждый контур отдельно). По итогу получим площади контуров в пикселях, что можем легко перевести в квадратные метры (так как контуров много, то суммируем площади контуров, относящихся к одному региону плюс прибавляем площади островов, обозначенных окружностями). А также в качестве дополнения (чтобы результаты расчетов не были таким скудными) я решил посчитать площади государств с учетом масштабирования игровой карты, о чем писал в своем прошлом посте (для получения масштабированной площади, нужно обычную умножить на квадрат масштаба: поскольку и длина, и ширина пикселя увеличатся в M раз, то площадь одного пикселя увеличится в M^2 раз, а так как от перемены мест сомножителей произведение не меняется, то и умножать можно площадь в кв. метрах, а не в пикселях)
В верхней таблице площади в пикселях, в квадратных метрах, а также площади при усредненном значении масштаба для каждого варианта расчета, в нижней таблице площади при каждом из значений масштаба (в кв. км).
Что делать с этой информацией - не знаю) Можно сравнивать страны по площади, можно считать сколько квадратных километров вы уже закрыли на 100% или на сколько процентов закрыт вообще весь мир)
Описание работы кода
В первую очередь мы видим классы Point и line, это классы для точек и отрезков соответственно. Сам по себе класс - по сути шаблон для какой-либо переменной (объекта).
В нашем случае у точек будут встроены поля (это как переменная, только встроенная в шаблон объекта), в которых содержится информация об их координатах. Также у точек будет метод, которым мы задаем значения этим точкам (public void ex(...){...})
У отрезков будут также 2 поля: коэффициенты k и b, а также 2 метода: первый через координаты точек, лежащих на отрезке, определяет значения полей (public void ex(...){...}), а второй находит интеграл отрезка (public double integrate(...){...}). Также в первый метод встроена защита от случаев, когда отрезок вертикален, то есть k = , когда такое происходит, метод зануляет оба поля (все отрезки считаются обособленно друг от друга, поэтому ошибки не возникает) (интегралы вертикального отрезка и отрезка, лежащего на оси Ox (то есть с нулевыми полями) равны 0)
Надеюсь более-менее понятно для тех кто не разбирается в программировании) Впрочем ладно, дальше будет проще
Третий класс Program содержит в себе саму программу (это такая особенность языка C#). Начиная с 31 строки: создаем переменную, которая отвечает за количество точек и вводим ее значение; создаем массив точек и переменные для ввода координат; пишем цикл, при помощи которого вводим все значения координат точек; создаем массив отрезков и переменную, обозначающую площадь контура; пишем цикл, в котором при помощи методов класса line находим значения полей и значение интеграла, последнее прибавляем к прежде созданной переменной; производим операции из цикла над последним отрезком (его нет в цикле, так как для него нужно обращаться к первой вершине контура и к последней вершине контура, что проще сделать вне цикла); выводим в консоль значение площади. Console.ReadKey() нужно чтобы после выполнения программы она сразу же не закрылась
На этом все. Надеюсь пост был познавательным, интересным и привлек внимание читателей к математике и программированию. Спасибо за внимание, и побольше всем закрытых на 100% квадратных километров карты :)
Масштаб игровой карты | Genshin Impact
Пожалуй, не для кого не секрет, что игровая карта в Genshin Impact масштабирована. И сразу объясню, что понимается под масштабированием: игровая карта уменьшена относительно Лорной (то есть игровой Тейват меньше, скажем так, реалистичного Тейвата, я его называю Лорным). И если в игре ГГ бежит от Монштадта до Ли Юэ какие-нибудь 3 км, то по сюжету он(-а) проходит, скажем километров 50. И в принципе понятно почему карта так уменьшена: никто бы не хотел просто бежать несколько часов от одного города к другому. А что уж говорить про исследование мира на 100%
И сразу в начале скажу, что все расчеты и измерения - просто интересное применение математики. И, возможно, кому-то будет интересен результат расчетов, как небольшой фактик об игровом мире. Естественно авторами игры не задумывалось, какой будет масштаб у карт (игровой и лорной)
Для самых нетерпеливых или тех, кто не хочет погружаться в математику, результаты всех расчетов в конце поста
И так, с чего начнем? С положений конечно же:
1. Мир масштабирован неоднородно
2. Масштабируется карта в разных местах по разному
Что это значит?
1. На неоднородность намекает в первую очередь то, что на карте очень много антропогенных (созданных человеком) строений на квадратный метр. Действительно, немалую часть карты занимают различные деревни, города или заброшенные постройки. Природные объекты уменьшены сильнее, чем антропогенные.
2. Разные объекты масштабируются разными способами: какие-то просто уменьшаются в n раз (например, различные плоскогорья, равнины и пики), а какие-то уменьшаются путем превращения нескольких объектов в один (например, из горного массива мы получаем просто одну гору). Причина этого станет понятна, если обратить внимание на разного рода возвышенности (горы): при умножении их размеров в, допустим, 15 раз они окажутся слишком высокими (а Драконий хребет окажется вообще непригодным для нахождения на его вершине, где ГГ вообще-то не просто прогуливался(-алась), а еще и со всякими монстрами бился(-лась) (если считать его высоту в игре в 1 км, цифры определены очень приближенно, на глаз))
Что нам это дает? Ну второе положение - просто интересное дополнение к посту, а вот первое говорит о том, что вычислять масштаб природных и рукотворных объектов нужно отдельно друг от друга
Что ж, а теперь нужно найти какие-то зацепки
Можно попытаться посчитать масштаб исходя из реальных аналогов стан в игре (Германия, Китай, Япония), но тут возникает две серьезные проблемы: в разные времена размеры стран сильно менялись, за какое из них зацепиться мы не знаем (все таки средневековье - достаточно продолжительный период истории), а также слишком маленькие различия между странами в игре (Япония вообще нифига не такая же по площади как Китай или Германия, хотя в игре Инадзума несильно меньше остальных стран). Также не получится посчитать масштаб городов, например, через соотношение реального населения Берлина к населению Мондштадта, так как посчитать последнее будет сложно, не зная сколько человек может поместиться в одном доме (увы, такой инфы я не нашел)
Значит нужны какие-то другие локации, через которые можно уже что-то посчитать. И такие локации к счастью есть - подземелья (данжи). Но и тут все довольно плачевно, ибо из них не виден сам Тейват, а также на игровой карте нет ничего, что мы видим в данжах. Что же это получается, посчитать не получится? А вот и нет. Есть один данж, который поможет с зацепками - подземелье с Двалином (тут будет пониматься и локация с еженедельным боссом, и битва с Ужасом бури в воздухе, по идее это тоже считается за данж). Причем поможет он с масштабом и природных объектов и антропогенных.
Начнем с масштаба природных объектов. Для этого нам понадобится битва с Двалином в воздухе, а, соответственно и новый аккаунт. А еще несколько вагонов терпения. Запускаем битву и после этого начинаем искать все крупные объекты, которые мы можем увидеть на игровой карте. Разглядеть где там какие границы у Мондштадта (имеется ввиду города) я не смог, ибо его в принципе плохо видно, зато нашел пару других мест и точек
Естественно картинка очень мыльная и тусклая, поэтому найти еще что-то у меня не получилось. Единственное, что еще я нашел, это горный массив, расположенный в стороне Драконьего хребта, но увидеть какие-то более менее четки границы у него у меня не вышло. Ну и еще можно было обратить внимание на большое озеро (2 картинка), но оно уж сильно непохоже на озеро возле винокурни, поэтому обойдемся без него (ибо мне же еще нужно на игровой карте найти аналогичные точки). И кстати, цифры и точки рядом с ними обозначают точки замера, но о них позже
Итак, можно приступать к расчетам. И для начала найдем, на какой высоте находится Итэр. Для этого обратим внимание на облака, не на эти мыльные и прозрачные, что под нами, а на те, что находятся довольно далеко от нас. Судя по их виду это средние и мощные кучевые облака. Из интернета можно узнать, на каких высотах они расположены и какие имеют размеры, а потому через них мы можем посчитать и высоту полета ГГ
Начнем с углового размера облаков и углового расстояния от условного горизонта до основания облака
Красная линия - это горизонт, черный отрезок - угловое расстояние от горизонта до основания облака, а серый отрезок - угловой размер облака (выбран как наиболее усредненный для средних кучевых облаков на картинке)
В этом нам поможет линейка и немного геометрии
Построим прямоугольный треугольник ABC, в котором AB - половина размера монитора (не длины или ширины, так как линейка и изображение находятся под углом), AC - половина длины монитора (если непонятно, почему так, то справа снизу поясняющая картинка, где бОльшая гипотенуза - длина монитора), а также проведем отрезки CD и CE. В данном случае точки D и E - точки, между которыми мы считаем угловое расстояние
Затем линейкой измеряем все значения, что изображены на чертеже (l1, l2, lм). И после этого довольно простыми действиями вычисляем значение угла DCE
Теперь построим три треугольника: прямоугольные ABC и CBF (F на картинке не указана) и равнобедренный CDE. В данном случае: B - положение Итэра, F- точка, под которой находится облако, AD - само облако, DE - облако, каким его видит игрок (и Итэр). Пояснять чему равны обозначенные буквами углы, я думаю, не нужно, это и так понятно
В данной фигуре нам известны обозначенные буквами углы, а также длины h и hо. Найти нужно hи. Для этого мы сперва рассмотри треугольник BDE
Здесь довольно легко можно определить значение l через теорему синусов. Составляем формулу, упрощаем и переходим к треугольнику BDC
Так как нам уже известна l, то также легко мы можем найти значение CD, умножив гипотенузу на синус угла CBD
И теперь вернемся к нашему большому треугольнику. Можно заметить, что искомая величина не что иное, как разность h и CD. Поэтому мы можем вывести формулу этой самой hи. Почему формулу, а не число? Так будет проще, ибо мы не знаем точные значение h и hо, а знаем лишь на каких промежутках они лежат. Поэтому искомую величину проще выразить как функцию от двух переменных
Для дальнейших расчетов я решил взять 4 значения высоты: при усредненных значениях переменных, при максимальных, а также экстремумы (минимум и максимум) функции на заданном отрезке. Но получилось 3 значения, так как на глубине 450 м дракон летать не смог бы) Да и Итэр, он же все свои силы порастерял 500 лет назад на стартовом меню)
Теперь перейдем к расчету расстояния от ГГ до точек замера. Делать мы это будем довольно простым способом: высоту, которую мы нашли только что мы будем делить на тангенс углового расстояния от горизонта до точки замера. Чтоб было понятнее построим треугольник, где точки при острых углах - положения точки замера и Итэра
Остается дело за малым: посчитать углы ф для каждой точки замера. Делать мы это будем по такому же принципу, как и в случае с облаками. И вот что у меня получилось:
Теперь считаем расстояния до точек замера (стоит заметить, что под расстоянием понимается катет длиной hи/tgф (см. треугольник выше), а не гипотенуза, так как затем нам нужно будет их сравнивать с расстояниями до этих объектов внутри игры, а последние мы не можем посчитать с учетом высоты полета ГГ (да и незачем, ибо это либо усложнит расчеты, либо сделает их некорректными)). Считаем для всех вариантов высоты, а затем записываем в табличку (так удобнее)
Затем нужно вычислить расстояния до точек замера в игре. Для этого опять понадобится линейка: замеряем расстояние от примерного положения Итэра над землей до всех объектов (важно чтоб масштаб карты не менялся, ну речь про приближение/отдаление). А теперь... Надо найти от чего перевести эти сантиметры с монитора в метры в Тейвате. Заданий, в которых показывается расстояние до них у меня нет, зато осталась метка с прошлогоднего поста, ну и расстояние до нее. Измеряем линейкой сколько сантиметров от метки до положения ГГ из того поста и затем находим искомые значения
Точками и кругом обозначены точки замера, бордовой точкой в центре Монда - примерное положение Итэра в битве с Двалином, бордово-черной точкой (возле собора) - положение персонажа из прошлого поста, серый отрезок соединяет метку и положение персонажа из прошлого поста
Ну и теперь можем уже составить полноценную табличку со всеми данными:
Делим расстояния в столбцах (1), (2) и (3) на расстояния в игре и получаем уже таблицу масштабов:
Жёлтым выделены наибольшие значения масштаба для каждого случая, синим - наименьшие, зеленым - средние значения для каждого из случаев
Можно заметить, что полученные значения максимальные и минимальные значения различаются примерно в 1,3 раза. Почему так? Да потому что то изображение (скайбокс), которое мы видим в битве с Ужасом бури не перерисовывалось с доскональным соблюдением всех пропорций (из-за чего кстати некоторые объекты в игре и на скайбоксе отличаются внешне)
Каким данным верить? Тут уже выбор за вами, лично я придерживаюсь значения в ~27, что примерно равно значению масштаба в 3 случае (когда высота полета ГГ соответствует максимуму функции высоты на заданных отрезках). Почему так? Да во-первых, такое значение масштаба мне кажется более-менее правдоподобным; а во вторых при таком значении масштаба Итэр сражается с Двалином на максимально возможной высоте, думаю авторами игры задумано, что бой должен происходить довольно высоко
Ну а теперь перейдем к расчету масштаба рукотворных объектов. В этом нам опять поможет Двалин, а точнее его данж, который еженедельный. Честно говоря, я без понятия, что это за башня, на которой мы с ним сражаемся (да и игра сама нам этого не говорит), поэтому предположу, что действо происходит возле его логова (башня похожа на кольца (или что это, хз как еще назвать), по которым мы ходим возле входа в данжа). Ну и также предположу, что башня и кольца имеют одинаковый диаметр (например, потому что все подобные кольца и для центральной башни, и для остальных производились по одной схеме, чтобы сэкономить деньги). Ну а наличие пробелов между платформами - экономия цемента/камня, короче говоря так задумано (все же производство колец и с пробелами и без не слишком дорого, просто при заливке первых нужно устанавливать бортики внутри, чтоб цемент не вытек в эти пробелы, а если они их из камней собирали то тогда еще проще все, просто не выкладывать камень в пробелы).
Короче говоря, у нас есть один и тот же (по габаритам) объект и масштабированный и немасштабированный. Значение масштаба (простите за тавтологию) можно вычислить как соотношение длин этих колец (радиус зависит линейно от масштаба, а длина окружности зависит линейно от радиуса, проще говоря: M~R; L~R => L~M). Измерить длину будет сложновато, зато можно посчитать за какое время персонаж пробежит оба кольца, и так как скорость бега и в данже и вне одинакова, то соотношение времени будет равно масштабу
Кольцо в данже у меня персонаж пробежал за 1:41,27 или за 101,27 с, а в центральной башне за 19,31 с. Итого получаем: M = 101,27 / 19,31 ≈ 5,244
Подведем итог. Для городов, деревень, а также любых других достаточно крупных объектов, созданных людьми масштаб составляет ~5,2-5,3. Для всего Тейвата в целом масштаб находится в пределах от ~8,5 до ~31,5 (связано это с достаточно широким диапазоном входных данных), при этом лично мне его значение видится равным ~27
Также попрошу вас написать в комментарии, какие еще зацепки, через которые можно выйти на масштаб карты, вы знаете? Ими можно было бы дополнить информацию из поста
А каким вам видится масштаба карты?
Каких размеров Селестия и как далеко она находится | Genshin Impact
Пожалуй каждый, кто играл в Genshin Impact замечал парящий архипелаг на западе от Монштадта. Эти острова - Селестия, место где живут (или могут жить) архонты, боги истоков и обычные боги. И несмотря на то, что она находится за пределами карты, а также расположена выше любого объекта в Тейвате, её размеры, высоту над уровнем моря и расстояние до неё можно измерить, а точнее вычислить. Об этом и будет этот пост. Ну а для тех, кто хочет сразу же получить ответ - держите картинку со всем, что будет вычислено далее
Ну а теперь приступим к самим вычислениям. Для измерений будет использоваться 2 точки: одна в Монштадте, на голове статуи анемо-архонта, другая возле логова Ужаса Бури. Точки эти находятся приблизительно на одной с Селестией прямой, поэтому погрешность при измерении будет несущественная. Вот эти самые точки: маркер игрока - точка в Монштадте, метка возле логова Двалина - 2 точка
Для начала стоит определить, какие данные у нас есть. Во-первых, мы знаем расстояние между этими точками. Определить его легко: сначала при помощи метки задания определяем масштаб карты, а затем измеряем расстояние между точками замера. Я это делал линейкой (если точнее - рейсшиной) и калькулятором. Также мы можем измерить угол над горизонтом для Селестии (для простоты понимания такая аналогия: у нас есть 2 луча, начала которых образуют угол, мы можем крутить этот угол (т.е. менять его значения), и вот когда один луч будет смотреть ровно в горизонт, а второй - в Селестию, то это и будет угол над горизонтом). Измерить его можно по Солнцу. Так как угол падения солнечных лучей изменяется +- линейно, то, зная время, когда Солнце находится ровно за Селестией, можно определить, какой угол у Селестии над горизонтом. По картинке ниже вы можете понять, как я это делал (в Монштадте Солнце было позади Селестии в ~16:30, возле логова - ~16:00)
Еще можно измерить угловой размер Селестии, но об это позже
И так, у нас есть необходимые данные: расстояние между точками замера 1289,6 м, угол над горизонтом в Монштадте ~22,5°, возле логова Ужаса Бури ~30°.
Теперь можно начинать рассчитывать расстояние до этогих парящих островов. И в этом нам поможет тригонометрия. Итак построим треугольник ABC, где A - первая точка замера, B - вторая точка замера, C - Селестия
Пожалуй, объяснять, как были определены углы ACB и ABC нет смысла, это и так понятно. А теперь вспомним немного тригонометрии, а точнее - теорему синусов. Дальнейшие вычисления - картинка из ворда, к сожалению Пикабу не дает написать обыкновенную дробь
АС - расстояние от Монштадта до Селестии по прямой. Теперь мы можем определить, на какой высоте находится Селестия и сколько нужно идти по земле, чтобы оказаться ровно под нею. Для этого проведем высоту CH к прямой AB. Мы получим прямоугольный треугольник.
Так как нам известен один из углов при гипотенузе и длина гипотенузы, то используя синус и косинус можно найти оба катета. И сейчас вы могли заметить, что длина высоты CH не равна той высоте, которая была указана на картинке в начале поста. Но на самом деле к найденной высоте нужно прибавить высоту над уровнем воды для точки замера (значение этой высоты я определял на глаз, поэтому она имеет значительную погрешность, однако при таких относительно больших расстояниях эта погрешность не оказывает значительного на точность результата)
А теперь приступим к измерению размеров Селестии. Для этого нужно узнать ее угловой размер. А как его измерить? В Genshin Impact FOV равен 90°, при этом по краям изображение искажается не сильно, что нам на руку. Измерим длину монитора (длину изображения на мониторе) и длину изображения Селестии. Поскольку искажением изображения по краям можно пренебречь, построим треугольники VMS и VKS и составим уравнения (D - длина изображения Селестии, L - длина монитора)
И так, угловой размер Селестии (при взгляде из Монштадта) равен 2*∠SVK = 11,08°. Ну и теперь приступим к последнему построению за этот пост. Нам нужен прямоугольный треугольник ABC (D - размер Селестии, можно сказать ее диаметр, α - угловой размер Селестии)
Итак, теперь мы знаем как далеко находится Селестия и каких она размеров. И подытожить все проделанные вычисления можно картинкой из начала поста. Стоит отметить, что если она будет добавлена в игру как локация, то скорее всего будет схожа с подземельями: снаружи небольшие, внутри огромные. Но так или иначе Селестия - самый крупный населенный пункт (если так его можно назвать) из доступных, и при этом она не так уж сильно удалена от нас (например Инадзума находится в более чем 6 км от Монштадта)
Ну и на этом все, пишите свои способы вычислить расстояние до нее (если этим вообще кто-то занимается или занимался)