Об'єкт вдвічі ближче виявляється вдвічі більшим?


16

Тож я думав над створенням 2D-гри, в якій також можна рухатись по осі Z, змінюючи, в якому шарі ви знаходитесь. Залежно від глибини я хочу масштабувати свої 2D спрайти.

Одного разу хтось показав мені демонстрацію, в якій у нього було багато 2d спрайтів, і, прокручуючи, він міг змінити глибину камери. Тож при збільшенні масштабів об'єкти наближаються до плеєра і здаються більшими. Тоді я задумався, наскільки більшим має бути предмет, коли він наблизиться до 1 одиниці. Як би ви це порахували? Тож хлопець сказав мені: Є одне основне правило, яке я використовую: "предмети вдвічі ближче, здаються вдвічі більшими".

Тепер, перевіряючи його, я знаю, що правило не застосовується в реальному світі;) Але чи є якась константа, яка використовується в розрахунках реального світу для перспективи чи щось таке? Або формула?

Я знаю, що це може бути не найкращим місцем, щоб задати таке питання, але оскільки це єдиний сайт, який я використовую для питань, пов’язаних з іграми, і мій контекст - це гра, я подумав, що спробую. Також я сподіваюся, що тут є ця людина, яка знає все про тривимірні перспективи та матриці чи щось таке, оскільки це може стосуватися 3D-ігор;)

tl; dr:

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


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

Мені цікаво, чому ніхто не згадував нічого про природні логарифми ...
Чад Гаррісон

4
Чому це неправда? Я думаю, що це правда.
Іван Кукір

@hydroparadise Що стосуються природних логарифмів із цим питанням?
Натан Рід

Я просто знаю педантичність тут, я знаю, але "Вдвічі ближче" - це дивна фраза. Чи не повинно бути "Половина далеко"? "Удвічі" більше, але якщо щось наближається, то відстань стає меншою.
MrVimes

Відповіді:


19

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

Приклад перспектив для об'єктів

Зауважте, як у першому поданні камери, оскільки Червоний блок перпендикулярний до подання камери, здається, об’єкт удвічі більший у ідеальному співвідношенні 1: 2 (Зверніть увагу, що стрілка вказує, що він потрапляє на край подання після переміщення вдвічі ближче)

Другий - той же розмір блоку, обернутий на 45 градусів. Коли він обертається, нижній край вже не знаходиться на тій же відстані від камери, як верхній край, тому він не СЕМЕ правильно масштабуватись у співвідношенні 1: 2, але насправді він удвічі більший (як на той самий кут на віддаленому блакитному блоці, як у близькому синьому блоці.)

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



Чудова відповідь! Зображення, безумовно, роблять це більш чітким. Насправді я відчуваю себе справді дурним, оскільки я спробував це, перш ніж ставити запитання, тримаючи руку перед обличчям і рухаючи ближче. І тоді я подумав: ні, це не здається вдвічі більшим .... я повинен був би це виміряти більш гостро;) Перспектива - це смішна річ! Також Ifeel, як я, мав би сам міг придумати знімки;) Але чудова відповідь! Спасибі!
Беррі

@Mason Wheeler - Сортовано: P
Том «Блакитний» Піддок

8

Об'єкт вдвічі ближче здається вдвічі більшим. Це наслідок теореми Фалеса і правда в реальному світі.

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


Чудові довідники! Я обов'язково перевіряю теорію Фалеса і спробую краще зрозуміти графічний конвеєр.
Беррі

7

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


2

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

Спочатку потрібно зрозуміти, як відображаються 3D-об’єкти. Незважаючи на те, що камера сходить в одну точку, є невидима площина, яка виконує функцію екрана, на якому можна малювати предмети. Єдине, що потрібно знати про екран - це відстань від камери.

Ось схема, як об’єкт відображається на камеру на двох різних відстанях.

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

Деякі основні обчислення тригерів приведуть вас до наступної формули:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

ПРИКЛАД:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

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

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

EDIT: Коли ви скажете рухатись по осі z, я припускаю, що ви захочете переглянути перспективу (як і більшість 3D-ігор; шутери тощо). Математика для обчислення розміру об'єкта на основі відстані також залежатиме від місця розташування в кадрі, подібний до периферичного зору. Натомість я спробував би це з математикою, яка є ортографічним видом (подумайте, Маріо, Сердиті птахи, Супер Smash Bros тощо). Я не знаю зовнішнього вигляду, якого ви намагаєтеся досягти, але поки це здається справжнім, тоді гравці ніколи не дізнаються!

DEMO!


Так, я фактично прагну до ортографічного виду. Гра, у якої я "запозичив" своє поточне натхнення, - це Rayman Origins. У деяких розділах гри ви можете стрибати на квіти, і тоді ви будете підстрибувати в інший шар з різною глибиною. Потім камера збільшує або зменшує розмір кордону на цю глибину. Axamples можна побачити у цьому відео , о 4:50 та 5:00.
Беррі

Крім того, чудова відповідь! Але оскільки достатньо лише підтвердження того, що правило "вдвічі ближче, вдвічі більше" було б достатньо, я вибрав відповідь Блю як найкращу.
Беррі

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

EDIT: Я помилився в своєму попередньому коментарі. "Вдвічі ближче, удвічі більше" є правильним, коли предмети залишаються досить близько один до одного щодо їх віддаленості від камери.
Джим Бак

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

0

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

Area = X * Y

Після збільшення масштабу:

NewArea = (x*2) * (y*2)

Це може створити враження, що ефект масштабування відбувається швидко або занадто інтенсивно. Ви можете скорегувати коефіцієнт, змінивши натомість 2 у наведеній вище формулі на значення з поплавком на зразок 1,5 або 1,33.

Крім того, що я зробив, це зберегти глибину (відстань) камери до ваших плиток у байтовому значенні разом з перекладом камери (X і Y), а потім розрахувати прогнозований розмір плитки таким чином:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

Зауважте, що CameraZце повинно бути суворо між 1-255, і це обмеження може бути користю чи користю для вас у майбутньому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.