2ca9d772abc236a14e81d2b628f1766e594ab307


2ca9d773abc236a14e81d2b628f1766f93d5fd0210

이 λ¬Έμ„œμ—μ„œλŠ” 2D μ½˜ν…μΈ μ— λŒ€ν•œ Unity의 ν”„λ‘œμ μ…˜ μˆ˜μ •μ— λŒ€ν•΄ μ„€λͺ…ν•˜μ§€λ§Œ, 3D μ½˜ν…μΈ μ—μ„œλ„ λΉ„μŠ·ν•œ 이유둜 μ‚¬μš©λ©λ‹ˆλ‹€.

μ‹€μ œλ‘œ 링크 이와 λ™μΌν•œ 기법을 μ‚¬μš©ν•˜μ—¬

κ΅¬μž‘μΈ 2D μ €λ‹€μ˜ μ „μ„€:μ‹ λ“€μ˜ 트라이포슀2 κ²Œμž„μ˜ λͺ¨μ–‘κ³Ό 더 κ°€κΉκ²Œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

심지어 이 κ²Œμž„μ€ μ‹œμ²­μžμ—κ²Œ λͺ…λ°±ν•œ μ™œκ³‘μ„ μΌμœΌν‚€μ§€ μ•Šκ³ λ„ μŠ€ν…Œλ ˆμ˜€μŠ€μ½”ν”½ 3D둜 λ Œλ”λ§λ˜μ—ˆμŠ΅λ‹ˆλ‹€.



2ca9d770abd828a14e81d2b628f1726a8c5517

Unityμ—μ„œ μ»€μŠ€ν…€ νˆ¬μ˜μ‚¬μš©

기본적으둜 λͺ¨λ“  3D μ—”μ§„μ—μ„œλŠ” 맀트릭슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›”λ“œμ˜ 였브젝트λ₯Ό ν™”λ©΄μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

이 행렬을 λͺ¨λΈ-λ·°-투영 행렬이라고 ν•˜λ©°, μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

첫째, λͺ¨λΈ λ§€νŠΈλ¦­μŠ€λŠ” λͺ¨λΈ μ’Œν‘œμ—μ„œ μ›”λ“œ μ’Œν‘œλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€(Transform.localToWorldMatrix).

각 κ°μ²΄λŠ” λ³€ν™˜μ— 따라 λ‹€λ₯Έ 객체에 λŒ€ν•΄ μƒλŒ€μ μΈ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜λŠ” 자체 λͺ¨λΈ 행렬을 μ–»μŠ΅λ‹ˆλ‹€.
λ‹€μŒμœΌλ‘œ, λ·° λ§€νŠΈλ¦­μŠ€λŠ” μ›”λ“œ μ’Œν‘œλ₯Ό 카메라에 μƒλŒ€μ μΈ μ’Œν‘œλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€(Camera.worldToCameraMatrix).
λ§ˆμ§€λ§‰μœΌλ‘œ 투영 λ§€νŠΈλ¦­μŠ€λŠ” 카메라 μƒλŒ€ μ’Œν‘œλ₯Ό ν™”λ©΄ μ’Œν‘œλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€(Camera.projectionMatrix).
뷰와 투영 행렬은 μ”¬μ˜ λͺ¨λ“  μ˜€λΈŒμ νŠΈμ— μ˜ν•΄ 곡유되며 화면에 λŒ€ν•œ 전체 νˆ¬μ˜μ„ κ²°μ •ν•©λ‹ˆλ‹€.
일반적으둜 투영 행렬은 카메라가 λ Œλ”λ§ν•˜λŠ” μž₯면의 직ꡐ 투영 λ˜λŠ” 원근 투영과 전체 μŠ€μΌ€μΌ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜λŠ” μ—­ν• λ§Œ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
μΉ΄λ©”λΌμ˜ 렌즈λ₯Ό μƒκ°ν•˜λ©΄ μ‰½μŠ΅λ‹ˆλ‹€.

μ»€μŠ€ν…€ νˆ¬μ˜μ„ μ„€μ •ν•˜λ €λ©΄ λ¨Όμ € 직ꡐ λ˜λŠ” νˆ¬μ‹œ λ·°λ₯Ό μ›ν•˜λŠ”μ§€ μ„ νƒν•©λ‹ˆλ‹€.
ν”„λ‘œμ μ…˜ λ§€νŠΈλ¦­μŠ€κ°€ ν•΄λ‹Ή 뢀뢄을 μ²˜λ¦¬ν•˜λ©°, Unity의 일반 카메라 μΈμŠ€νŽ™ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
그런 λ‹€μŒ 각 좕이 화면을 κΈ°μ€€μœΌλ‘œ κ°€λ¦¬ν‚€λŠ” λ°©ν–₯은 λ·° λ§€νŠΈλ¦­μŠ€κ°€ μ²˜λ¦¬ν•©λ‹ˆλ‹€. 일반적으둜 UnityλŠ” μΉ΄λ©”λΌμ˜ νŠΈλžœμŠ€νΌμ— 따라 λ§€ ν”„λ ˆμž„λ§ˆλ‹€ 이 맀트릭슀λ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€λ§Œ, Camera.worldToCameraMatrix ν”„λ‘œνΌν‹°μ— μ“°λ©΄ μ»€μŠ€ν…€ κ°’μœΌλ‘œ 이 맀트릭슀λ₯Ό μ˜€λ²„λΌμ΄λ“œν•©λ‹ˆλ‹€.
지면이 μ–΄λ–»κ²Œ λ³΄μ΄λŠ”μ§€μ— λ§Œμ‘±ν•˜λ―€λ‘œ xμΆ•μ΄λ‚˜ yμΆ•μ˜ 좜λ ₯은 λ³€κ²½ν•  ν•„μš”κ°€ μ—†κ³  zμΆ•λ§Œ λ³€κ²½ν•˜λ©΄ λ©λ‹ˆλ‹€.
ꡬ체적으둜, μ›”λ“œμ˜ μœ„μͺ½ λ°©ν–₯이 항상 μΉ΄λ©”λΌμ˜ μœ„μͺ½ λ°©ν–₯κ³Ό μΌμΉ˜ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€.
ν–‰λ ¬μ˜ 각 열은 좕에 ν•΄λ‹Ήν•˜λ―€λ‘œ z좕에 λŒ€ν•œ μ—΄λ§Œ λ³€κ²½ν•˜λ©΄ λ©λ‹ˆλ‹€.
이λ₯Ό μœ„ν•œ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


2ca9d77fabc236a14e81d2b628f17568255c89




.














λ·° 맀트릭슀λ₯Ό μ„€μ •ν•˜κΈ°μ— κ°€μž₯ 쒋은 μœ„μΉ˜λŠ” μΉ΄λ©”λΌμ˜ OnPreCull() 이벀트 λ©”μ„œλ“œμž…λ‹ˆλ‹€.

이 λ©”μ„œλ“œλŠ” λͺ¨λ“  μ—…λ°μ΄νŠΈ λ©”μ„œλ“œμ˜ λ³€ν˜•μ΄ λλ‚œ ν›„ λ Œλ”λ§ μž‘μ—…μ΄ μ‹œμž‘λ˜κΈ° 전에 ν˜ΈμΆœλ©λ‹ˆλ‹€.

μœ μ € μž…λ ₯ μ’Œν‘œ
λ§ˆμš°μŠ€λ‚˜ ν„°μΉ˜ μž…λ ₯을 μ‚¬μš©ν•˜λŠ” κ²Œμž„μ—μ„œλŠ” ν™”λ©΄ μ’Œν‘œλ₯Ό μ›”λ“œ μ’Œν‘œλ‘œ λ³€ν™˜ν•΄μ•Ό ν•  κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
기본적인 2D κ²Œμž„μ—μ„œλŠ” Camera.ScreenToWorldPoint()둜 μΆ©λΆ„ν•˜μ§€λ§Œ, μ»€μŠ€ν…€ νˆ¬μ˜μ„μ‚¬μš©ν•  λ•ŒλŠ” 더 λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€.
κΈ°μ‘΄ Unity APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 레이(Ray,κ΄‘μ„ )λ₯Ό μ‚¬μš©ν•˜μ—¬ μ”¬κ³Όμ˜ ꡐ차점을 확인할 수 μžˆμ§€λ§Œ, ν‰λ©΄λ§Œ μžˆλŠ” 경우 더 κ°„λ‹¨ν•œ 방법이 μžˆμŠ΅λ‹ˆλ‹€.
λͺ‡ μ€„μ˜ μ½”λ“œλ§Œ 더 μΆ”κ°€ν•˜λ©΄ μŠ€ν¬λ¦°νˆ¬μ›”λ“œν¬μΈνŠΈ()의 자체 버전을 μž‘μ„±ν•˜μ—¬ ν‰λ©΄μ˜ μ’Œν‘œμ™€ ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ μ•„μ΄λ””μ–΄λŠ” Unityκ°€ λ·° 투영 행렬을 μ‚¬μš©ν•˜μ—¬ μ›”λ“œ μ’Œν‘œλ₯Ό ν™”λ©΄μœΌλ‘œ λ³€ν™˜ν•˜λ―€λ‘œ ν•΄λ‹Ή ν–‰λ ¬μ˜ 역을 μ‚¬μš©ν•˜λ©΄ ν™”λ©΄ 포인트λ₯Ό μ›”λ“œμ— λ³€ν™˜ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. Z좕을 λ¬΄μ‹œν•˜λ„λ‘ 행렬을 λ³€κ²½ν•˜λ©΄ 씬 깊이λ₯Ό λ¬΄μ‹œν•˜κ³  지면에 μžˆλŠ” μ§€μ λ§Œ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€


2ca9d777b59c28a8699fe8b115ef046e05d37def