Поэтому я думал о создании 2D-игры, в которой вы также можете перемещаться вдоль оси Z, изменяя, в каком слое вы находитесь. В зависимости от глубины я хочу масштабировать свои 2D спрайты.
Однажды кто-то показал мне демо, в котором у него было много 2D-спрайтов, и с помощью прокрутки он мог изменить глубину камеры. Таким образом, при увеличении объекты будут приближаться к игроку и казаться больше. Тогда я подумал, насколько большим должен быть объект, когда он приближается на 1 единицу. Как бы вы рассчитали это? Так парень сказал мне: есть одно основное правило, которое я использую: «объекты в два раза ближе, появляются в два раза больше».
Теперь, проверяя его сам, я знаю, что правило не применяется в реальном мире;) Но есть ли некоторая константа, которая используется в вычислениях реального мира для перспективы или что-то? Или формула?
Я знаю, что это не лучшее место, чтобы задавать такой вопрос, но так как это единственный сайт, который я использую для вопросов, связанных с игрой, а мой контекст - игра, я решил попробовать. Также я ожидаю, что здесь есть человек, который знает все о трехмерных перспективах и матрицах или о чем-то еще, поскольку это может относиться к 3D-играм;)
ТЛ; др:
«объект, который в два раза ближе, кажется в два раза большим». Это не так в реальном мире. Но какая константа или формула верна?
источник
Ответы:
Обычно это так, в зависимости от вашей точки обзора и направления движения, а также от угла обзора.
Обратите внимание, что на первом виде с камеры, поскольку красный блок перпендикулярен к виду с камеры, объект кажется в два раза больше в идеальном соотношении 1: 2 (обратите внимание на стрелку, указывающую, что он перемещается по краю вида после перемещения в два раза ближе)
Второй блок такого же размера повернут на 45 градусов. Когда он повернут, нижний край больше не находится на том же расстоянии от камеры, что и верхний край, поэтому он не SEEM правильно масштабируется до соотношения 1: 2, но на самом деле он в два раза больше (чем в такой же угол на дальнем синем блоке, как и в ближнем синем блоке.)
В заключение это фактически означает, что ваш друг был прав, и соотношение 1: 1 («объекты в два раза ближе, они выглядят в два раза больше») является хорошим выбором.
источник
Объект, находящийся в два раза ближе, кажется в два раза большим. Это является следствием Фалеса, и это верно в реальном мире.
Можно утверждать, что теорема Фалеса является основным математическим инструментом, лежащим в основе перспективного проецирования, и то, что в графическом конвейере (OpenGL или DirectX) известно как деление перспективы . Это теорема, которую вы должны обязательно знать и научиться распознавать, когда ее можно использовать.
источник
На самом деле это в значительной степени верно (если вы перемещаете объект вдвое дальше, он выглядит вдвое большим), но это затеняет то, как визуальный размер объектов должен изменяться при движении зрителей. В частности, объекты, кажется, становятся больше быстрее, чем ближе они. Это потому, что зритель преодолевает половину расстояния намного быстрее, когда объект находится близко, по сравнению с тем, когда объект находится дальше. Или, другими словами, когда скорость зрителя постоянна, значение «половины расстояния» изменяется с изменением расстояния до объекта.
источник
Поскольку вы на самом деле не работаете в трехмерном пространстве, мы можем предположить, что спрайты никогда не вращаются (вращение может быть смоделировано с перекосом и т. Д.). Это простое ограничение позволяет довольно легко получить несколько точные числа относительно того, каким должен быть размер в зависимости от расстояния. с камеры.
Во-первых, вам нужно понять, как визуализируются трехмерные объекты. Даже если камера сходится к одной точке, существует невидимая плоскость, которая выступает в качестве экрана для рисования объектов. Единственное, что вам нужно знать об экране, это то, как далеко он находится от камеры.
Вот схема того, как объект отображается на камере на двух разных расстояниях.
Как и следовало ожидать, высота объекта зависит от расстояния от камеры. НО, поскольку рендеринг происходит в ближней плоскости выбраковки, мы должны вычислить высоту спрайта в этой точке.
Некоторые основные триггерные вычисления приведут вас к следующей формуле:
ПРИМЕР:
Я бы посоветовал начать с того,
v=5
а потом отрегулировать в зависимости от того, как это выглядит. Я могу бросить скрипку вместе, что позволит вам увидеть изменения в режиме реального времени.TL; DR
РЕДАКТИРОВАТЬ: Когда вы говорите двигаться вдоль оси Z, я предполагаю, что вам понадобится перспективный вид (как большинство 3D-игр; шутеры и т. Д.). Математика для расчета размера объекта на основе расстояния также будет зависеть от местоположения в кадре, похож на периферическое зрение. Вместо этого я бы попробовал это с моей математикой, которая представляет собой орфографический взгляд (например, Марио, Angry Birds, Super Smash Bros и т. Д.). Я не знаю, как вы выглядите и чувствуете, но пока это кажется реальным, игроки никогда не узнают!
DEMO!
источник
Это не охватывалось, и я подумал, что это может быть полезно: стоит отметить, что когда вы уменьшите половину расстояния, удвоение размера в обоих измерениях X и Y увеличит в четыре раза общую площадь спрайта. Это потому что:
После увеличения:
Это может создать впечатление, что эффект увеличения происходит быстро или слишком интенсивно. Вы можете отрегулировать коэффициент, изменив 2 в приведенной выше формуле на значение с плавающей запятой, например 1,5 или 1,33.
В качестве альтернативы я сохранил глубину (расстояние) камеры до ваших плиток в байтовом значении вместе с трансляцией камеры (X и Y), а затем рассчитал размер проецируемой плитки таким образом:
Обратите внимание, что
CameraZ
это должно быть строго между 1-255, и это ограничение может быть выгодой или проклятием для вас в будущем.источник