Three.js: GLTFLoader : Normal-Tangent ํ…Œ์ŠคํŠธ ๋ชจ๋ธ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 06์›” 03์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…

Normal-Tangent Test ๋ชจ๋ธ ์„ ํ‘œ์‹œํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ‘œ์‹œ๋œ ๊ฒฐ๊ณผ๋Š” ํฌ๋กœ๋…ธ์Šค์˜ ์ƒ˜ํ”Œ๊ณผ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Three.js + Normal-Tangent ํ…Œ์ŠคํŠธ ๋ชจ๋ธ ๊ฒฐ๊ณผ :
image

Khronos ์ƒ˜ํ”Œ ๋กœ๋” + Normal-Tangent ํ…Œ์ŠคํŠธ ๋ชจ๋ธ ๊ฒฐ๊ณผ :
image

์ด ์ƒ˜ํ”Œ ๋ชจ๋ธ์€ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ : https://emackey.github.io/testing-pbr/normal-tangent-readme.html

/ cc @emackey

Three.js ๋ฒ„์ „
  • [x] ๊ฐœ๋ฐœ์ž
  • [] r85
  • [] ...
๋ธŒ๋ผ์šฐ์ €
  • [x] ๋ชจ๋‘
  • [] ํฌ๋กฌ
  • [] Firefox
  • [ ] ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ
OS
  • [x] ๋ชจ๋‘
  • [] Windows
  • [ ] ๋งฅ OS
  • [] Linux
  • [] Android
  • [] iOS
ํ•˜๋“œ์›จ์–ด ์š”๊ตฌ ์‚ฌํ•ญ (๊ทธ๋ž˜ํ”ฝ ์นด๋“œ, VR ์žฅ์น˜ ๋“ฑ)

ThinkPad X260 + Windows 10 + Intel HD ๊ทธ๋ž˜ํ”ฝ 520

Bug Loaders

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํŠนํžˆ ๋…ธ๋ฉ€ ๋งต ์˜

๋…ธ๋ฉ€ ๋ฒกํ„ฐ๋Š” + X๊ฐ€ ๋งž๊ณ  + Y๊ฐ€ ์œ„์ธ OpenGL ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + Z๋Š” ๋ทฐ์–ด๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.

์ด ๋ฌธ์žฅ์€ ๋ชจ๋ธ์„ ์ ‘์„  ๋ฒกํ„ฐ์—†์ด ๋ฐฐ์†กํ•˜์—ฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํ•ด ๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ํŽ˜์ธํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ผ๋ฃฉ์—์„œ ๋น„์ •์ƒ์ ์ธ ๋†’์ด ๋งต (๋ฒ”ํ”„ ๋งต)์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

TestHeightMap

์ด ๋†’์ด ํ•„๋“œ๋ฅผ ๋ฐ”๊นฅ ์ชฝ ๋ฒ”ํ”„๋กœ ์ •์˜ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํฐ์ƒ‰ ํ”ฝ์…€์€ ๋ทฐ์–ด์— ๋” ๊ฐ€๊น๊ณ  ๊ฒ€์€ ์ƒ‰ ํ”ฝ์…€์€ ๋” ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜จ๋ผ์ธ ๋ณ€ํ™˜๊ธฐ (ํ’ˆ์งˆ์ด ์˜์‹ฌ ์Šค๋Ÿฝ์ง€๋งŒ ์ž ์‹œ ํ›„์— ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์ด ๋งต์—์„œ ๋…ธ๋ฉ€ ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” 3D ๋ชจ๋ธ, UV ์ขŒํ‘œ, mikktspace ๊ณ„์‚ฐ ๋˜๋Š” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋…ธ๋ฉ€ ๋งต์œผ๋กœ ๋ณ€ํ™˜ ๋œ ๋†’์ด ๋งต์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” glTF์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ์˜จ๋ผ์ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ–ˆ๋‹ค. X๋Š” ๋งž๊ณ  Y๋Š” ์œ„๋กœ, Z๋Š” ๋ทฐ์–ด๋ฅผ ํ–ฅํ•˜๋„๋กํ–ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TestNormalMap

๋‹ค์‹œ ํŽ˜์ธํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ฐ€์ ธ ์™€์„œ ์ƒ‰์ƒ ์ฑ„๋„์„ ์ œ๊ฑฐํ•˜์—ฌ์ด ๋ฒกํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ์ƒ‰์ƒ ์ฑ„๋„์€ ๊ณ ์œ  ํ•œ ํšŒ์ƒ‰์กฐ ์ด๋ฏธ์ง€๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ •์ƒ‰์€ -1.0 , ์ค‘๊ฐ„ ํšŒ์ƒ‰์€ 0.0 , ํฐ์ƒ‰์€ +1.0 ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

TestNormalMap-Decomposed

๊ทธ๋ž˜์„œ ์ ์–ด๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•œ ํ›„์—๋Š” ์˜จ๋ผ์ธ ๋ณ€ํ™˜๊ธฐ๊ฐ€ glTF๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋นจ๊ฐ„์ƒ‰ (X) ์ด๋ฏธ์ง€์—์„œ ์˜ค๋ฅธ์ชฝ์˜ ๊ธฐ์šธ๊ธฐ์— ํฐ์ƒ‰ ํ”ฝ์…€ (+1.0)์ด ์žˆ์œผ๋ฉฐ ์ด๋ฏธ์ง€์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์—์žˆ๋Š” X ๋ฒกํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋นจ๊ฐ„์ƒ‰ ์ด๋ฏธ์ง€์˜ ์™ผ์ชฝ์—์„œ ๊ฒ€์€ ์ƒ‰ ํ”ฝ์…€ (-1.0)์€ ์ด๋ฏธ์ง€ ์™ผ์ชฝ์—์žˆ๋Š” X ๋ฒกํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋…น์ƒ‰ (Y) ์ด๋ฏธ์ง€์—์„œ ๋ฒ”ํ”„์˜ ์ƒ๋‹จ ๊ฒฝ์‚ฌ๋ฅผ ๋”ฐ๋ผ์žˆ๋Š” ํฐ์ƒ‰ ํ”ฝ์…€์€ ์ด๋ฏธ์ง€ ์ƒ๋‹จ์˜ Y ๋ฒกํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. Z ๊ฐ’์€ ๊ฐ€์žฅ ์ง๊ด€์ ์ด์ง€ ์•Š์ง€๋งŒ ๋ฒ”ํ”„์˜ ๋๊ณผ ๋’ทํŒ ์ž์ฒด๋Š” ๋ชจ๋‘ ๋ทฐ์–ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋ชจ๋“  ์ธก๋ฉด์˜ ๊ฒฝ์‚ฌ๊ฐ€ ๋จผ ์ชฝ์„ ๊ฐ€๋ฆฌ ํ‚ค๋ฏ€๋กœ ๋ชจ๋‘ ๊ณ ๋ฅด๊ฒŒ ์–ด๋‘ก์Šต๋‹ˆ๋‹ค.

OpenGL ์Šคํƒ€์ผ ๋…ธ๋ฉ€ ๋งต์„ ๋ฐ›์•„๋“ค์ด๋Š” (glTF์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) Blender Eevee์— ์ด๊ฒƒ์„๋กœ๋“œํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? UV ๋งต์ด ํšŒ์ „๋˜๊ฑฐ๋‚˜ ๋ฐ˜์ „๋˜๋„๋ก ๋ฐฐ์œจ์ด ์กฐ์ •๋˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

NormalSpinTest

์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ ‘์„  ๊ณต๊ฐ„์„ ์ •์˜ํ•˜๋Š” ์š”์ ์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ฒกํ„ฐ์— ๋ฏธ์ณ ๊ฐ€๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๊ด€๊ณ„์—†์ด ๋…ธ๋ฉ€ ๋งต์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐฐ์น˜๋˜๋„๋กํ•˜์—ฌ ํ…์Šค์ฒ˜ ์•„ํ‹ฐ์ŠคํŠธ์—๊ฒŒ ์•ฝ๊ฐ„์˜ ์˜จ์ „ํ•จ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ OpenGL ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ๊ทœ์น™ (๋•Œ๋•Œ๋กœ DirectX ๊ทœ์น™์ด๋ผ๊ณ  ํ•จ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Y ๋ฒกํ„ฐ๋Š” ์ƒ๋‹จ์ด ์•„๋‹Œ ์ด๋ฏธ์ง€ ํ•˜๋‹จ์„ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋‹ค์Œ์€์ด ํ˜•์‹์˜ ๋‚ด ์ด๋ฏธ์ง€์˜ ๋ถ„ํ•ด ๋œ Y ์ฑ„๋„์ž…๋‹ˆ๋‹ค. ๋” ๋ฐ์€ ํ”ฝ์…€์€ ์ด๋ฏธ์ง€ ํ•˜๋‹จ์„ ํ–ฅํ•˜๋Š” ํ”ฝ์…€์ž…๋‹ˆ๋‹ค.

TestNormalMap_DirectX-Green

์ด๋Ÿฌํ•œ DirectX ์Šคํƒ€์ผ ๋…ธ๋ฉ€ ๋งต ์ค‘ ํ•˜๋‚˜๋ฅผ Blender Eevee์—๋กœ๋“œํ•ด๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

NormalSpinTest_DirectX_v3

์•„๋‹ˆ์š”. ๋ธ”๋ Œ๋”๋Š” + Y๋ฅผ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ•™์€ ํ‹€๋ ธ๊ณ  ๋ฐ˜์‚ฌ ๋œ ์ˆ˜ํ‰์„ ์ด ์‚ฌ๋ฐฉ์„ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
OpenGL ์Šคํƒ€์ผ์˜ ๋…ธ๋ฉ€ ๋งต์„ + Y ๋‹ค์šด์„ ์˜ˆ์ƒํ–ˆ๋˜ ์—”์ง„์—๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด NormalTangentTest ๋ชจ๋ธ์ด ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ–‰์€ UV ์ขŒํ‘œ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜์—ฌ ๋ฐ˜์‚ฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ์˜ค๋ฅธ์ชฝ ์œ„๋ฅผ ํ–ฅํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  30 ๋Œ“๊ธ€

@ cx20์„ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๋งฅ๋ฝ์„ ์œ„ํ•ด ๋‹ค์Œ์€ ๊ด€๋ จ ์ •๋ณด ๋ฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • @donmccurdy ์˜ ThreeJS glTF ๋ทฐ์–ด ์ธ donmccurdy / three-gltf-viewer # 10์—์„œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ทฐ์–ด๊ฐ€ ์•„๋‹Œ ThreeJS์˜ glTF ๋กœ๋”์˜ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋Š” ์ด์ „ ๋ฌธ์ œ๋ณด๋‹ค ๋” ์ž˜ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

  • ์œ„์˜ ์ด์ „ ํ˜ธ์—์„œ๋Š” ๋ชจ๋ธ์ด ํ•˜๋Š˜์„ ํ–ฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ ๋‚˜์ค‘์— ์ˆ˜ํ‰์„ ์„ ํ–ฅํ•˜๋„๋ก ํšŒ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์ˆ˜ํ‰์„ ์ด ๋ฏธ์นœ ๋“ฏ์ด ํšŒ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜์‚ฌ๊ฐ€ ๋งž์ง€ ์•Š์„ ๋•Œ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋ธ ์ž์ฒด์˜ ๋…ธ๋ฉ€ ๋งต ์‚ฌ์šฉ์€ KhronosGroup / glTF # 952์—์„œ ๋…ผ์˜ํ•œ ๊ฒฐ๊ณผ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ThreeJS์˜ ๋…ธ๋ฉ€ ๋งต ์ฒ˜๋ฆฌ๋Š” # 11315์—์„œ ์งˆ๋ฌธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • BabylonJS๋Š” ์ตœ๊ทผ์— ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์—ฌ๊ธฐ ์— ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๋‹ค์Œ ์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ ์šฉ๋œ BabylonJS์˜ glTF 2.0 ๋กœ๋”์˜ ๋ผ์ด๋ธŒ ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค .

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋ธ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

materialParams.normalScale = new THREE.Vector2(-1, 1);

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. # 11315๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@donmccurdy ๊ท€ํ•˜์˜ ์กฐ์–ธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
normalScale์„ ์กฐ์ •ํ•˜์—ฌ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ glTF ๋ชจ๋ธ์ด ๋งž๋‹ค๋ฉด glTF Loader๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ cx20 ๋™์˜,์ด ์ˆ˜์ •์€ ์ด์ œ THREE.GLTF2Loader์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ์ค‘์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

Three.js + Normal-Tangent ํ…Œ์ŠคํŠธ ๋ชจ๋ธ ๊ฒฐ๊ณผ :
image

์ด๊ฒƒ์€ r101๊ณผ r104 ์‚ฌ์ด์—์„œ ํ‡ด๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
Screenshot from 2019-06-11 16-38-27

https://github.com/mrdoob/three.js/pull/15749 ์ฐธ์กฐ โ€” ํšŒ๊ท€๋Š” ์˜๋„์  ์ธ ๊ฒƒ์ด๋ฉฐ ๋ชจ๋ธ์— ์ ‘์„ ์„ ํฌํ•จํ•˜์—ฌ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด mikktspace ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•œ JS ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ ์žˆ์„ ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ # 15749๋ฅผ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ์˜ํ•ด ๊ฒฝ๊ณ„๋ฅผ ์žƒ์—ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ ์–ด๋„ ๋Ÿฐํƒ€์ž„์— ๊ทผ์‚ฌ ํ•  ์ˆ˜์žˆ๋Š” glTF์˜ ํƒ„์  ํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ์ผ์„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋ธ”๋ Œ๋” ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ glTF ํƒ„์  ํŠธ๋ฅผ ๋‚ด ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด๋˜๋ฉฐ glTF์˜ ์ฃผ์š” ๊ตฌํ˜„์€ ๋ชจ๋‘ ํƒ„์  ํŠธ์—†์ด์ด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ThreeJS์˜ glTF ๋ชจ๋ธ ๋Œ€๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋…ธ๋ฉ€ ๋งคํ•‘์ด ์†์ƒ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด ์ผ์–ด ๋‚ฌ๊ณ  ์™œ ์ผ์–ด ๋‚ฌ๋Š”์ง€ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ๋ฅผ ์ฝ์–ด ๋ณผ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋ฒ”์ฃผ์— ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— glTF ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ ‘์„ ์—†๋Š” ๋ชจ๋ธ์„ ๋‹ค์‹œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด์ด ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ์—ฌ๋Š” ์ค‘ ๐Ÿ˜…

์ด ๋ณ€๊ฒฝ์œผ๋กœ ThreeJS์˜ glTF ๋ชจ๋ธ ๋Œ€๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋…ธ๋ฉ€ ๋งคํ•‘์ด ์†์ƒ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ์‹ฌ๊ฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ํŒŒ์ƒ๋ฌผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์…ฐ์ด๋”์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑ ํ•ด ์™”์œผ๋ฉฐ ์—ฌ์ „ํžˆ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ „์—์ด ํŠน์ • ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•œ ํ•ดํ‚น ( normalScale.y *= -1 )์„ ํฌํ•จํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์˜ˆ์ œ๋„ ๊นจ๋œจ ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ธ์ œ ๋„์›€์ด๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ ‡์ง€ ์•Š์•˜๋Š” ์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ๋œ ํƒ„์  ํŠธ๋ฅผ ์ง€์›ํ•˜๋ฉด ํ•ดํ‚น์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ ํ™•์‹คํžˆ ์ž˜๋ชป๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ํ•ดํ‚น์— ์˜์กดํ•˜๊ณ  ํƒ„์  ํŠธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ์ด ์†์ƒ๋˜๊ณ  ํ•ดํ‚น์— ์˜ํ•ด ํŒŒ์† ๋œ ๋ชจ๋ธ (ํƒ„์  ํŠธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ)์ด ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋ฒ”์ฃผ์— ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— glTF ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ ‘์„ ์—†๋Š” ๋ชจ๋ธ์„ ๋‹ค์‹œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด์ด ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์ฐธ์กฐ. ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘์„ ์—†์ด ๋ชจ๋ธ์„ ์ ์ ˆํ•˜๊ฒŒ ๋ Œ๋”๋งํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ glTF ์‚ฌ์–‘์— ๋”ฐ๋ผ mikktspace ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ JS ๊ตฌํ˜„์€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํŒŒ์ƒ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ๊ตฌํ˜„์€ ๋‹จ์ˆœํžˆ "๊ฑฐ์˜ ์ถฉ๋ถ„ํžˆ ์ข‹์€"๊ทผ์‚ฌ์น˜์ž…๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ ๋ชจ๋ธ์€ ๊ทผ์‚ฌ์น˜์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜๋„์ ์œผ๋กœ ๊ทน๋‹จ์  ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

JS mikktspace ํƒ„์  ํŠธ ์ƒ์„ฑ ๊ตฌํ˜„์„ ๊ฐ–๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ THREE.BufferGeometryUtils์— ์ข‹์€ ์ถ”๊ฐ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต์‹ (๋„ค์ดํ‹ฐ๋ธŒ) mikktspace ์ฝ”๋“œ๋Š” ์ƒ๋‹นํžˆ ๊ธธ๊ณ , ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ์•„์ง ์ถฉ๋ถ„ํžˆ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด์ „์—์ด ํŠน์ • ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•œ ํ•ดํ‚น ( normalScale.y *= -1 )์„ ํฌํ•จํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์˜ˆ์ œ๋„ ๊นจ๋œจ ๋ ธ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ glTF ๋ชจ๋ธ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊นจ๋œจ ๋ ธ๋‚˜์š”, ์•„๋‹ˆ๋ฉด ์ผ๋ฐ˜์ ์ธ ์˜ˆ์ผ๊นŒ์š”?

์•ผ์ƒ์—๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ ‘์„  ๊ณต๊ฐ„ ๋…ธ๋ฉ€ ๋งต์ด ์žˆ์Šต๋‹ˆ๋‹ค. Substance Painter๋Š” ์ด๊ฒƒ์„ "DirectX Normals"์™€ "OpenGL Normals"๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๊ฒƒ์˜ ๊ฐ€์žฅ ํฐ ์ด๋ฆ„์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ํŠนํžˆ y ์ฑ„๋„์ด ๋ฐ˜์ „๋˜์–ด ํ…์Šค์ฒ˜์˜ ๋ชจ๋“  ๋…น์ƒ‰ ์ฑ„๋„ ๊ฐ’์ด ๋ฐ˜์ „๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. y *= -1 ๊ณฑํ•˜๋Š” ๊ฒƒ์ด ํ•˜๋‚˜๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์†Œ์œ„ "DirectX Normals"๋Š” ์™ผ์† ์ขŒํ‘œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  glTF๋Š” ๋…ธ๋ฉ€ / ์ ‘์„  / ๋น„ํƒ• ์  ํŠธ์— ๋Œ€ํ•œ ์˜ค๋ฅธ์† ์ขŒํ‘œ๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ThreeJS๊ฐ€ ์ ‘์„ ์„ ์ž๋™ ๊ณ„์‚ฐํ•  ๋•Œ ๋…ธ๋ฉ€ ๋งต์ด ๋ฐ˜์ „ ๋œ Y (DirectX) ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  glTF์— ๋Œ€ํ•ด ํ•ด๋‹น ์ฑ„๋„์„ ๋’ค๋กœ ๊ฐ€์ ธ ์˜ค๋ฏ€๋กœ ๋ฐ˜์ „์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘์„ ์ด ์ œ๊ณต๋˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฐ˜์ „์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

mikktspace์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์ด๊ฒƒ๊ณผ ๋ณ„๊ฐœ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์–‘์ด mikktspace๋ฅผ ์š”๊ตฌํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌํ˜„์ด ํ™”๋ฉด ๊ณต๊ฐ„ ํŒŒ์ƒ๋ฌผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋žต์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น„์Šทํ•œ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ mikktspace์—์„œ ์ƒ์„ฑ ๋œ ๋…ธ๋ฉ€ ๋งต์€ ๋งต์˜ ์™ผ์† / ์˜ค๋ฅธ์†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š” ํ•œ ๊ทผ์‚ฌ๊ฐ’์œผ๋กœ ํ‘œ์‹œํ–ˆ์„ ๋•Œ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

(์ž‘๋…„ KhronosGroup / glTF-Sample-Models # 174์—์„œ๋„ ์ด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค)

ํŠนํžˆ ๋…ธ๋ฉ€ ๋งต ์˜

๋…ธ๋ฉ€ ๋ฒกํ„ฐ๋Š” + X๊ฐ€ ๋งž๊ณ  + Y๊ฐ€ ์œ„์ธ OpenGL ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + Z๋Š” ๋ทฐ์–ด๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.

์ด ๋ฌธ์žฅ์€ ๋ชจ๋ธ์„ ์ ‘์„  ๋ฒกํ„ฐ์—†์ด ๋ฐฐ์†กํ•˜์—ฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํ•ด ๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ํŽ˜์ธํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ผ๋ฃฉ์—์„œ ๋น„์ •์ƒ์ ์ธ ๋†’์ด ๋งต (๋ฒ”ํ”„ ๋งต)์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

TestHeightMap

์ด ๋†’์ด ํ•„๋“œ๋ฅผ ๋ฐ”๊นฅ ์ชฝ ๋ฒ”ํ”„๋กœ ์ •์˜ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํฐ์ƒ‰ ํ”ฝ์…€์€ ๋ทฐ์–ด์— ๋” ๊ฐ€๊น๊ณ  ๊ฒ€์€ ์ƒ‰ ํ”ฝ์…€์€ ๋” ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜จ๋ผ์ธ ๋ณ€ํ™˜๊ธฐ (ํ’ˆ์งˆ์ด ์˜์‹ฌ ์Šค๋Ÿฝ์ง€๋งŒ ์ž ์‹œ ํ›„์— ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์ด ๋งต์—์„œ ๋…ธ๋ฉ€ ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” 3D ๋ชจ๋ธ, UV ์ขŒํ‘œ, mikktspace ๊ณ„์‚ฐ ๋˜๋Š” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋…ธ๋ฉ€ ๋งต์œผ๋กœ ๋ณ€ํ™˜ ๋œ ๋†’์ด ๋งต์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” glTF์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ์˜จ๋ผ์ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ–ˆ๋‹ค. X๋Š” ๋งž๊ณ  Y๋Š” ์œ„๋กœ, Z๋Š” ๋ทฐ์–ด๋ฅผ ํ–ฅํ•˜๋„๋กํ–ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TestNormalMap

๋‹ค์‹œ ํŽ˜์ธํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ฐ€์ ธ ์™€์„œ ์ƒ‰์ƒ ์ฑ„๋„์„ ์ œ๊ฑฐํ•˜์—ฌ์ด ๋ฒกํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ์ƒ‰์ƒ ์ฑ„๋„์€ ๊ณ ์œ  ํ•œ ํšŒ์ƒ‰์กฐ ์ด๋ฏธ์ง€๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ •์ƒ‰์€ -1.0 , ์ค‘๊ฐ„ ํšŒ์ƒ‰์€ 0.0 , ํฐ์ƒ‰์€ +1.0 ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

TestNormalMap-Decomposed

๊ทธ๋ž˜์„œ ์ ์–ด๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•œ ํ›„์—๋Š” ์˜จ๋ผ์ธ ๋ณ€ํ™˜๊ธฐ๊ฐ€ glTF๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋นจ๊ฐ„์ƒ‰ (X) ์ด๋ฏธ์ง€์—์„œ ์˜ค๋ฅธ์ชฝ์˜ ๊ธฐ์šธ๊ธฐ์— ํฐ์ƒ‰ ํ”ฝ์…€ (+1.0)์ด ์žˆ์œผ๋ฉฐ ์ด๋ฏธ์ง€์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์—์žˆ๋Š” X ๋ฒกํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋นจ๊ฐ„์ƒ‰ ์ด๋ฏธ์ง€์˜ ์™ผ์ชฝ์—์„œ ๊ฒ€์€ ์ƒ‰ ํ”ฝ์…€ (-1.0)์€ ์ด๋ฏธ์ง€ ์™ผ์ชฝ์—์žˆ๋Š” X ๋ฒกํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋…น์ƒ‰ (Y) ์ด๋ฏธ์ง€์—์„œ ๋ฒ”ํ”„์˜ ์ƒ๋‹จ ๊ฒฝ์‚ฌ๋ฅผ ๋”ฐ๋ผ์žˆ๋Š” ํฐ์ƒ‰ ํ”ฝ์…€์€ ์ด๋ฏธ์ง€ ์ƒ๋‹จ์˜ Y ๋ฒกํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. Z ๊ฐ’์€ ๊ฐ€์žฅ ์ง๊ด€์ ์ด์ง€ ์•Š์ง€๋งŒ ๋ฒ”ํ”„์˜ ๋๊ณผ ๋’ทํŒ ์ž์ฒด๋Š” ๋ชจ๋‘ ๋ทฐ์–ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋ชจ๋“  ์ธก๋ฉด์˜ ๊ฒฝ์‚ฌ๊ฐ€ ๋จผ ์ชฝ์„ ๊ฐ€๋ฆฌ ํ‚ค๋ฏ€๋กœ ๋ชจ๋‘ ๊ณ ๋ฅด๊ฒŒ ์–ด๋‘ก์Šต๋‹ˆ๋‹ค.

OpenGL ์Šคํƒ€์ผ ๋…ธ๋ฉ€ ๋งต์„ ๋ฐ›์•„๋“ค์ด๋Š” (glTF์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) Blender Eevee์— ์ด๊ฒƒ์„๋กœ๋“œํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? UV ๋งต์ด ํšŒ์ „๋˜๊ฑฐ๋‚˜ ๋ฐ˜์ „๋˜๋„๋ก ๋ฐฐ์œจ์ด ์กฐ์ •๋˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

NormalSpinTest

์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ ‘์„  ๊ณต๊ฐ„์„ ์ •์˜ํ•˜๋Š” ์š”์ ์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ฒกํ„ฐ์— ๋ฏธ์ณ ๊ฐ€๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๊ด€๊ณ„์—†์ด ๋…ธ๋ฉ€ ๋งต์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐฐ์น˜๋˜๋„๋กํ•˜์—ฌ ํ…์Šค์ฒ˜ ์•„ํ‹ฐ์ŠคํŠธ์—๊ฒŒ ์•ฝ๊ฐ„์˜ ์˜จ์ „ํ•จ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ OpenGL ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ๊ทœ์น™ (๋•Œ๋•Œ๋กœ DirectX ๊ทœ์น™์ด๋ผ๊ณ  ํ•จ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Y ๋ฒกํ„ฐ๋Š” ์ƒ๋‹จ์ด ์•„๋‹Œ ์ด๋ฏธ์ง€ ํ•˜๋‹จ์„ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋‹ค์Œ์€์ด ํ˜•์‹์˜ ๋‚ด ์ด๋ฏธ์ง€์˜ ๋ถ„ํ•ด ๋œ Y ์ฑ„๋„์ž…๋‹ˆ๋‹ค. ๋” ๋ฐ์€ ํ”ฝ์…€์€ ์ด๋ฏธ์ง€ ํ•˜๋‹จ์„ ํ–ฅํ•˜๋Š” ํ”ฝ์…€์ž…๋‹ˆ๋‹ค.

TestNormalMap_DirectX-Green

์ด๋Ÿฌํ•œ DirectX ์Šคํƒ€์ผ ๋…ธ๋ฉ€ ๋งต ์ค‘ ํ•˜๋‚˜๋ฅผ Blender Eevee์—๋กœ๋“œํ•ด๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

NormalSpinTest_DirectX_v3

์•„๋‹ˆ์š”. ๋ธ”๋ Œ๋”๋Š” + Y๋ฅผ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ•™์€ ํ‹€๋ ธ๊ณ  ๋ฐ˜์‚ฌ ๋œ ์ˆ˜ํ‰์„ ์ด ์‚ฌ๋ฐฉ์„ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
OpenGL ์Šคํƒ€์ผ์˜ ๋…ธ๋ฉ€ ๋งต์„ + Y ๋‹ค์šด์„ ์˜ˆ์ƒํ–ˆ๋˜ ์—”์ง„์—๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด NormalTangentTest ๋ชจ๋ธ์ด ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ–‰์€ UV ์ขŒํ‘œ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜์—ฌ ๋ฐ˜์‚ฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ์˜ค๋ฅธ์ชฝ ์œ„๋ฅผ ํ–ฅํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์™€ UV ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด ์กŒ์„ ๋•Œ ๊ณ ๋…ํ•œ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์— ๋Œ€ํ•œ ํƒ„์  ํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฐ”์ด ์•ต ์  ํŠธ์— ์‚ฌ์šฉํ•  W ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ณต์‹์ด ์ŠคํŽ™์— ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. "OpenGL ๋ฒ•์„ "๋ฐ "DX ๋ฒ•์„ "์€ ๊ณต์‹์„ ๋„์ถœ ํ• ๋งŒํผ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ด€์Šต์„ ์–ธ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตฌํ˜„ ์ž๋กœ์„œ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ˜„์žฌํ•˜๋Š” ์ผ์€์ด ํŠน์ • ์ƒ˜ํ”Œ๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด MikkTSpace์—์„œ ๋’ค์ง‘ํžŒ TangentW๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ glTF ๋ชจ๋ธ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊นจ๋œจ ๋ ธ๋‚˜์š”, ์•„๋‹ˆ๋ฉด ์ผ๋ฐ˜์ ์ธ ์˜ˆ์ผ๊นŒ์š”?

๋ณด๊ณ  ๋œ ๋ฒ„๊ทธ๋Š” ํŠนํžˆ glTF ๋ชจ๋ธ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, FBX ๋˜๋Š” COLLADA๋ฅผ ํ†ตํ•œ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ํ™•์‹ ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•„ ์ด๋Ÿฌํ•œ ๋…ธ๋ฉ€ ๋งต ๊ทœ์น™์ด ์™„์ „ํžˆ ์ดํ•ด๋˜๊ณ  ํ…Œ์ŠคํŠธ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐจ์ด์ ์€ ํŠนํžˆ y ์ฑ„๋„์ด ๋ฐ˜์ „๋˜์–ด ํ…์Šค์ฒ˜์˜ ๋ชจ๋“  ๋…น์ƒ‰ ์ฑ„๋„ ๊ฐ’์ด ๋ฐ˜์ „๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. y * = -1์„ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ํ•˜๋‚˜๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋ณด ๋‹ค ์šฐ๋ฆฌ์˜ "ํ•ดํ‚น"์— ๋Œ€ํ•œ ํ›จ์”ฌ ๋” ๋‚˜์€ ์ •๋‹นํ™”์ž…๋‹ˆ๋‹ค. ๐Ÿ˜‡

์‚ฌ์–‘์ด mikktspace๋ฅผ ์š”๊ตฌํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌํ˜„์ด ํ™”๋ฉด ๊ณต๊ฐ„ ํŒŒ์ƒ๋ฌผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋žต์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค.

MikkTSpace๊ฐ€ ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์‚ฌ์–‘์€ ๋งž์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—์ด๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ €๋ ดํ•œ ๋Œ€์•ˆ์ด ํŠน์ • ๋ชจ๋ธ์— ๋งž์•„ ๋ณด์ธ๋‹ค๋ฉด, ๋” ์ข‹์•„ ๋ณด์ด์ง€ ์•Š๋Š” ๋” ๋น„์‹ผ ๊ฒƒ์„ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทผ์‚ฌ์น˜๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์–‘ ์–ธ์–ด๋ฅผ ๋Š์Šจํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Š๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์™€ UV ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด ์กŒ์„ ๋•Œ ๊ณ ๋…ํ•œ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์— ๋Œ€ํ•œ ํƒ„์  ํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฐ”์ด ์•ต ์  ํŠธ์— ์‚ฌ์šฉํ•  W ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ณต์‹์ด ์ŠคํŽ™์— ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

MikkTSpace ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ด์‚ฐ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์‰ฌ์šด ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ... ํ‘œ์ค€ MikkTSpace ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด MikkTSpace ์‚ฌ์šฉ ์ง€์นจ ์™ธ์— ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ—‰ํ—‰


์›๋ž˜ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ normal.y *= -1 ๋ฐฐ์œจ์„ ์–ด๋”˜๊ฐ€์— ๋ณต์›ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ์œ„์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • (a) GLTFLoader์—์„œ ์ ‘์„ ์ด์—†๋Š” ๋ฉ”์‹œ์˜ ๊ฒฝ์šฐ
  • (b) GLTFLoader์—์„œ ๋ชจ๋“  ๋ฉ”์‹œ์— ๋Œ€ํ•ด
  • (c) WebGLRenderer์—์„œ ๋ชจ๋“  ๋ฉ”์‹œ์— ๋Œ€ํ•ด

threejs๊ฐ€ ์‹ค์ œ๋กœ DirectX ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด Blender๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ (c)์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•œ ์†”๋ฃจ์…˜์„ ์œ„ํ•ด (a)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ThreeJS๊ฐ€ ์ ‘์„ ์„ ์ž๋™ ๊ณ„์‚ฐํ•  ๋•Œ ๋…ธ๋ฉ€ ๋งต์ด ๋’ค์ง‘ํžŒ Y (DirectX) ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ, three.js๋Š” ...

three.js๋Š” + Y๊ฐ€ ์ ‘์„  ๊ณต๊ฐ„์— ๋Œ€ํ•ด "์œ„์ชฝ"์ด๊ณ  ์ฆ๊ฐ€ํ•˜๋Š” V๋Š” uv ๊ณต๊ฐ„์— "์œ„์ชฝ"์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, three.js๋Š” uv (0, 0)๊ฐ€ ํ…์Šค์ฒ˜์˜ ์™ผ์ชฝ ํ•˜๋‹จ ๋ชจ์„œ๋ฆฌ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  glTF ์‚ฌ์–‘์€ ์™ผ์ชฝ ์ƒ๋‹จ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด GLTFLoader ๊ฐ€ texture.flipY ์„ false ์„ค์ •ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. (three.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ texture.flipY ๋ฅผ true ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.)

ํƒ„์  ํŠธ๊ฐ€ ์—†์œผ๋ฉด three.js๋Š” ํ™”๋ฉด ๊ณต๊ฐ„ ํŒŒ์ƒ๋ฌผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ„์  ํŠธ๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒด์ธ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ ‡๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์‚ฐ์˜ ๊ฐ€์ •์€ ์ ‘์„  ๊ณต๊ฐ„๊ณผ uv ๊ณต๊ฐ„์ด ๋™์ผํ•œ ๋ฐฉํ–ฅ์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ ์ ˆํ•˜๊ฒŒ ์ž‘์„ฑ๋œ glTF ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ์ด ๊ฐ€์ •์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ glTF spec_์„ _ ์ ์ ˆํ•˜๊ฒŒ ์ค€์ˆ˜ํ•˜๋Š” ๋ชจ๋ธ์— ๋Œ€ํ•ด normalScale.y = - 1 ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ณด์ƒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์…ฐ์ด๋”์—์„œ flipY ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

normalScale.y ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ด ์„ค๋ช…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์…ฐ์ด๋”์—์„œ flipY ํ”Œ๋ž˜๊ทธ๋ฅผ ์ ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, glTF๊ฐ€ ์ž์ฒด ํƒ„์  ํŠธ ๋ฒกํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ž๋™ ๊ณ„์‚ฐ ํƒ„์  ํŠธ์—๋งŒ flipY ํ…Œ์ŠคํŠธ์™€ y ์˜ ํ•ด๋‹น ๋ถ€์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ... ๋‚ด NormalTangentMirrorTest ๋ชจ๋ธ์— ์ž˜๋ชป๋œ ์ ‘์„ ์ด ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Blender glTF ๋‚ด๋ณด๋‚ด๊ธฐ ์ž์ฒด๊ฐ€ glTF ๋ชจ๋ธ์— ์ž˜๋ชป๋œ ์ ‘์„ ์„ ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋‚ด ๋ณด๋‚ธ ์ ‘์„  ๋ฒกํ„ฐ์˜ ์ •ํ™•์„ฑ์„ ํ™•์ธํ–ˆ์œผ๋ฉฐ Y ๋ฐ˜์ „์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ฌ๋ฐ”๋ฅธ ์กฐ์น˜๋Š” ์ž๋™ ์ƒ์„ฑ ๋œ ์ ‘์„  (์ œ๊ณต๋œ ์ ‘์„ ์ด ์•„๋‹˜)์ด flipY ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ normalScale.y ์„ ๋’ค์ง‘๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐ?

์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์†์„ฑ ํƒ„์  ํŠธ๊ฐ€ ์—†์„ ๋•Œ ๋ฐ˜์ „ ๋œ ๋ฒ•์„ ์„ ์ˆ˜๋™์œผ๋กœ ๋ณด์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ๊ณต๊ฐ„ ํŒŒ์ƒ๋ฌผ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ‘์„ ์ด ์กด์žฌํ•  ๋•Œ ๋ณด์ƒ ํ•  ๊ฒƒ์ด ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์…ฐ์ด๋”์—์„œ flipY ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ normalScale.y ๋’ค์ง‘์–ด์„œ ์ž๋™์œผ๋กœ ๊ณ ์น  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๊ธธ์„ ๊ฐ€๊ธฐ ์ „์—์ด ๊ฐ€์„ค์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

glTF ์‚ฌ์–‘์„ ์ œ๋Œ€๋กœ ์ค€์ˆ˜ํ•˜๋Š” ๋ชจ๋ธ์— ๋Œ€ํ•ด normalScale.y =-1์„ ์„ค์ •ํ•˜์—ฌ ๋ณด์ƒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ง€์‹œ ํ•  ์˜๋„๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ๊ณต๊ฐ„ ํƒ„์  ํŠธ ์ƒ์„ฑ์„ ์œ„ํ•ด _ flipY ํ”Œ๋ž˜๊ทธ๋ฅผ ์กด์ค‘ํ•˜๋Š” ๊ฒƒ _์ด ์ˆ˜ํ•™์ ์œผ๋กœ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์— ๋Œ€ํ•œ ์˜คํ•ด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ž ์žฌ์ ์œผ๋กœ ํฐ ์„ธํŠธ๊ฐ€ ๋  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ณต์‹ ํ…Œ์ŠคํŠธ ๋ชจ๋ธ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ์ด ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ glTF์—์„œ ๋…ธ๋ฉ€ ๋งต์˜ ์œ ํšจํ•œ ์‚ฌ์šฉ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์€ ์ •์  (๋ณ€ํ™˜๋˜์ง€ ์•Š์€) ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๋…ธ๋ฉ€ ๋งต์˜ ์œ ํšจํ•œ ์‚ฌ์šฉ์„ ๋‹ค๋ฃจ๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ทฐ์–ด ์ƒ์„ฑ ํƒ„์  ํŠธ ๋ฒกํ„ฐ์— ์˜์กดํ•˜์—ฌ ๋‹ค๋ฅธ ์ขŒํ‘œ๊ณ„์—์„œ ๋ชจ๋ธ์„ ๊ตฌ์„ฑํ•˜๋ฉด์„œ๋„ ์œ ํšจํ•œ glTF๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? https://github.com/KhronosGroup/glTF-Sample-Models/issues/174

@WestLangley ์ง€๊ธˆ๊นŒ์ง€ ์ฐพ์€ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ khronos-NormalTangentTest (ํƒ„์  ํŠธ ํฌํ•จ ์•ˆ ๋จ)๋Š” ์ž˜๋ชป ๋ณด์ž…๋‹ˆ๋‹ค.
NormalTangentTest
normalScale.y = -1๋กœ ์„ค์ •ํ•ด๋„ ์—ฌ์ „ํžˆ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
NormalTangentTestNegY
๋Œ€์‹  normalScale.x = -1๋กœ ์„ค์ •ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.
NormalTangentTestNegX
๋ Œ๋”๋ง์ด ์•ฝ๊ฐ„ ํ”ฝ์…€ ํ™”๋˜์–ด ๋ณด์ด๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ , ํŠนํžˆ ๊ธˆ์ƒ‰ ๋ฐ˜์‚ฌ๊ฒฝ์—์„œ๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™”๋ฉด ๊ณต๊ฐ„ ๊ทผ์‚ฌ์น˜ ๋˜๋Š” ๋‹ค๋ฅธ ๋ฒ„๊ทธ์˜ ํ‘œ์‹œ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๊นŒ?

์ ‘์„ ์ด์—†๋Š” ๋‹ค๋ฅธ ์ข‹์€ ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์ด ์žˆ์œผ๋ฉด ๋‚ด ๋ฐฉ์‹๋Œ€๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๋Œ€ํ‘œ ์ƒ˜ํ”Œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  glTF ์‚ฌ์–‘์— ๋งž์ง€ ์•Š๋Š” ์ƒ˜ํ”Œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@elalish ๊ทธ ํ…Œ์ŠคํŠธ ๋ฒ ๋“œ๋Š” ๋‚˜์—๊ฒŒ ๋ง์ด๋˜์ง€ ์•Š๊ณ , ๋‚˜์—๊ฒŒ ๊ฒฐ์ฝ” ๋ง์ด๋˜์ง€ ์•Š์•˜๊ณ , ์•„๋งˆ ๊ฒฐ์ฝ” ๊ทธ๋ ‡๊ฒŒ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ .. ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ๋Š” ๋„ˆ๋ฌด ๋‚œ๋… ํ™” ๋œ IMHO์ž…๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ์  ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

BTW, ์šฐ๋ฆฌ๋Š” ๋ฒ„ํผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€ํ™œ ํ•  ์ˆ˜์žˆ๋Š” VertexTangentHelper (# 3511)์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@WestLangley NormalTangentTest๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•˜ ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด์ƒํ•œ ์ผ์„ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ๊ฐ ์ƒ˜ํ”Œ์˜ ๋ฐฉํ–ฅ (UV ๊ณต๊ฐ„์—์„œ)์„ ํšŒ์ „์‹œํ‚ต๋‹ˆ๋‹ค. ์„ธ ๊ฐœ์˜ ์—ด์€ ๋‹ค๋ฅธ ์žฌ๋ฃŒ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ๊ธˆ์ƒ‰ ์—ด๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จ ํ•ด์ง€๊ณ  ์ด๋Ÿฌํ•œ ๋‹ค์–‘ํ•œ UV ๋ฐฉํ–ฅ์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UV ํšŒ์ „์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  2D ์ด๋ฏธ์ง€๋กœ ๋ณผ ๋•Œ ๋…ธ๋ฉ€ ๋งต์˜ ์ด๋ฏธ์ง€๋Š” ๋ฒกํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ์ผ๊ด€๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ 2D๋ณด๊ธฐ์—์„œ ๋ชจ๋“  ๋ฐ˜๊ตฌ์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” ๋†’์€ ๋นจ๊ฐ„์ƒ‰ ์ฑ„๋„ ๊ฐ’์ด ์žˆ๊ณ  ๋ชจ๋“  ๋ฐ˜๊ตฌ์˜ ์œ„์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” UV ์ขŒํ‘œ์— ๊ด€๊ณ„์—†์ด ๋†’์€ ๋…น์ƒ‰ ์ฑ„๋„ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” UV ๊ณต๊ฐ„์—์„œ ๋นจ๊ฐ„์ƒ‰ (+ X)์ด ํ…์Šค์ฒ˜์˜ ์˜ค๋ฅธ์ชฝ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋…น์ƒ‰ (+ Y)์ด UV ๊ณต๊ฐ„์—์„œ ํ…์Šค์ฒ˜์˜ ์ƒ๋‹จ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” glTF ์‚ฌ์–‘์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋œ ํƒ„์  ํŠธ ๋ฒกํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์–ด์ง„ ์‚ผ๊ฐํ˜•์— ๋Œ€ํ•ด + U ์ถ•์ด ์–ด๋Š ๋ฐฉํ–ฅ์ธ์ง€์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ™”๋ฉด ๊ณต๊ฐ„ ์ถ”์ •์€ BabylonJS ๋ฐ CesiumJS๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํƒ„์  ํŠธ ๋ฐ ์ด์ค‘ ํƒ„์  ํŠธ ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ThreeJS๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€๋งŒ ์•„์ง ์„ค๋ช…๋˜์ง€ ์•Š์€ normalScale ์ถ• ๋ฐ˜์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.

glTF๊ฐ€ flipY ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UV ๊ณต๊ฐ„์—์„œ V ์ขŒํ‘œ๋ฅผ ๋ฐ˜์ „์‹œํ‚ค๋Š” ํ˜ผ๋™์˜ ์ง€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์„ค๋ช…๋˜์ง€ ์•Š์€ normalScale ํ”Œ๋ฆฝ์—์„œ ์—ญํ• ์„ํ•œ๋‹ค๊ณ  ์˜ค๋žซ๋™์•ˆ ์˜์‹ฌํ•ด ์™”์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์— ์ž‘์€ ๋ฒ ์ดํ‚น ์˜ค๋ฅ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์ œ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋ช‡ ๋…„ ์ „ Substance Painter๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค). ํŠนํžˆ ๊ธˆ ๋ฐ˜๊ตฌ์˜ ํ‰ํ‰ํ•œ ๋ถ€๋ถ„์—์„œ ์•ฝ๊ฐ„์˜ ๋Œ€๊ฐ์„  ์ด์Œ์ƒˆ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ „์ฒด์ ์ธ ํšจ๊ณผ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฒ ์ดํฌ์˜ ์ฃผ์š” ์›ํ˜• ๋ถ€๋ถ„์€ ์ž˜ ๋‚˜ ์™”์œผ๋ฉฐ 3D ๋˜๋Š” UV ์ขŒํ‘œ๊ฐ€ ๋ชจ๋“  ๋ฐฉํ–ฅ๊ณผ ์ ‘์„ ์œผ๋กœ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๊ณ„์—†์ด ์ผ๋ฐ˜ ํ…์Šค์ฒ˜์˜ ์ „์ฒด 2D ์ด๋ฏธ์ง€์—์„œ "์œ„์ชฝ"๊ณผ "์˜ค๋ฅธ์ชฝ"์ด ์ผ์ •ํ•œ ํšจ๊ณผ๋ฅผ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์•„ํ‹ฐ์ŠคํŠธ๊ฐ€ ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— UV ๋˜๋Š” ์ ‘์„  ์ขŒํ‘œ์— ์•ก์„ธ์Šค ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— 3D ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ๋ฐ˜๋ณต๋˜๋Š” ๋…ธ๋ฉ€ ๋งต ํ…์Šค์ฒ˜๋ฅผ ์ œ์ž‘ํ•˜๋Š” ์•„ํ‹ฐ์ŠคํŠธ์—๊ฒŒ ์ค‘์š”ํ•œ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค.

@WestLangley ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ ์ค‘ ์ตœ๊ณ ์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ํ…Œ์ŠคํŠธ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ง€์ ํ•œ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ”Œ๋กฏ์ด ๋‘๊บผ์›Œ์ง‘๋‹ˆ๋‹ค. ์›๋ž˜ ํ…Œ์ŠคํŠธ๋Š” ์–‘๋ฉด ์žฌ๋ฃŒ์ž…๋‹ˆ๋‹ค. # 17804 ๋•Œ๋ฌธ์— ๋‹จ๋ฉด์œผ๋กœ ์‹œ๋„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ์ „ํžˆ ์ž˜๋ชป๋˜์—ˆ์ง€๋งŒ ์ด์ œ normalScale.y = -1๋กœ ์„ค์ •ํ•˜๋ฉด ์ •๋‹ต์„ ์–ป์Šต๋‹ˆ๋‹ค.
NormalTangentTestFrontNegY
์ ์–ด๋„ ์–‘๋ฉด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ „๋ฉด์˜ ๋ Œ๋”์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐ ๋™์˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@emackey ๋„์›€์ด ๋  ์ˆ˜์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์€ ์šฉ์ ‘ ๋œ ๋ฒ•์„ ์ด์žˆ๋Š” ๋ฐ˜์ง์ด๋Š” ์ž…๋ฐฉ์ฒด์™€ ๋‘ฅ๊ทผ ๋Œ€์‹  ์ž…๋ฐฉ์ฒด ๋ชจ์–‘์œผ๋กœ ๋งŒ๋“ค๋„๋ก ์„ค๊ณ„๋œ ํ•ด๋‹น ๋ฒ•์„ 

@emackey ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•„ํ‹ฐ์ŠคํŠธ์™€ ํ•จ๊ป˜ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์™€ ๊ทน๋ณตํ•ด์•ผ ํ•  ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‹น์‹ ์€ @elalish ์™€ ํ•จ๊ป˜

@elalish ์ด์ „์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋•Œ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜๋‹ค. ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด bisect ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์œ„์น˜๋ฅผ ์‹๋ณ„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฉ์ ‘ ๋œ ๋…ธ๋ฉ€์ด์žˆ๋Š” ๋ฐ˜์ง์ด๋Š” ํ๋ธŒ์™€ ๋‘ฅ๊ธ€ ์ง€ ์•Š๊ณ  ํ๋ธŒ ๋ชจ์–‘์ด๋˜๋„๋ก ์„ค๊ณ„๋œ ํ•ด๋‹น ๋…ธ๋ฉ€ ๋งต.

์™„๋ฃŒ : normal_map_flat.zip . Draco ํŒ€์ด ์ž‘์„ฑํ•œ ํƒ„์  ํŠธ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ„์  ํŠธ ์†์„ฑ์ด์—†๋Š” ์ถ”๊ฐ€ ๋ฒ„์ „์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๋•Œ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜๋‹ค.

๋ชจ๋ธ์— ์ ‘์„ ์ด ํฌํ•จ ๋œ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ํŠนํžˆ UV ์ด์Œ์ƒˆ ์ฃผ๋ณ€์— ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ์ž๋ฆฌ ์ผ€์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ‘์„ ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” @emackey ๊ฐ€ https://github.com/mrdoob/three.js/issues/11438#issuecomment -507027586์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด GLTFLoader์—์„œ normalScale.y *= -1 ํ”Œ๋ฆฝ์„ ๋ณต์›ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ •์  ์ ‘์„ ์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

@donmccurdy ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋Š˜์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ํ‰ํ‰ํ•œ ํ๋ธŒ ์ธก๋ฉด์œผ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น›๋‚˜๋Š” ํ‘œ๋ฉด ( metallicFactor: 1, roughnessFactor: 0.1 )์„ ๊ฐ–๋„๋ก ๋ชจ๋ธ์„ ํŽธ์ง‘ํ•˜๋ฉด ํ๋ธŒ ์ธก๋ฉด์˜ ๋ฐ˜์‚ฌ๊ฐ€ ๊ฝค ๋งŽ์ด ํ—ค์—„ ์น˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์—์„œ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์œ ๊ฒƒ์€ Substance Painter์—์„œ ์ผ๋ฐ˜ ๋ฒ ์ดํ‚น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ Blender Cycles์—์„œ ๋ฒ ์ดํ‚นํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ๊ทธ๋žจ์€ ์ž์ฒด ๋ทฐํฌํŠธ์— ๋งž๊ฒŒ ๋ฒ ์ดํฌํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—๋กœ๋“œ ํ•  ๋•Œ ํ˜ผํ•ฉ์— glTF๊ฐ€ ์—†์–ด๋„ ์™„๋ฒฝํ•˜๊ฒŒ ํ‰ํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ€๊น์ง€๋งŒ ํ‰ํ‰ํ•œ ํ‘œ๋ฉด์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์ฐจ์ด๋กœ ์ธํ•ด ์ข‹์€ ๋ฐฉ์‹์ด ์•„๋‹Œ ํŽ€ ํ•˜์šฐ์Šค ๊ฑฐ์šธ์ด๋ฉ๋‹ˆ๋‹ค.

SP ๋Œ€ Blender ๋Œ€ ๋‹ค์–‘ํ•œ WebGL ์—”์ง„์—์„œ ์‚ผ๊ฐํ˜•์˜๋ฉด์„ ๊ฐ€๋กœ ์ง€๋ฅด๋Š” ์ •์  ์‚ฌ์ด์— ์ผ๋ฐ˜ ๋ฒกํ„ฐ (๋˜๋Š” TBN ๊ณต๊ฐ„)๊ฐ€ ๋ณด๊ฐ„๋˜๋Š” ๋ฐฉ์‹์— ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Gimp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SP ๋ฒ ์ดํฌ์™€ ๋ธ”๋ Œ๋” ๋ฒ ์ดํฌ์˜ "์ฐจ์ด"๋ฅผ ์‹คํ–‰ํ–ˆ๊ณ  ๊ฐ ๋ฒ„ํ…์Šค์—์„œ ๊ฒ€์€ ์ƒ‰ (๋™์ผํ•œ RGB ๊ฐ’)์ด ๋‚˜์™”์ง€๋งŒ ๋ฒ„ํ…์Šค ์‚ฌ์ด์˜ ๊ณต๊ฐ„์€ ๋งค์šฐ ํฌ๋ฏธํ•œ ๊ฐ•๋„์˜ ์†Œ์šฉ๋Œ์ด ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฏธ๋ฌ˜ํ•œ ํŽ€ ํ•˜์šฐ์Šค ํšจ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•  ๊ฒƒ์ด์ง€๋งŒ ํ˜„์žฌ ์–ป๊ณ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค (์ ‘์„  ์—†์Œ ๋ฒ„์ „).
image
with tangents ๋ฒ„์ „์€ ์‹ค์ œ๋กœ ๋” ์ข‹์ง€ ์•Š์•„ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์œ ํšจํ•œ glTF์ธ์ง€ ๊ถ๊ธˆํ•ดํ•ฉ๋‹ˆ๋‹ค.
image
@emackey @donmccurdy๊ฐ€ ์ œ๊ณต ํ•œ ์ด๋Ÿฌํ•œ ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋‘˜ ๋ชจ๋‘๊ฐ€ ์‹ค์ œ๋กœ ์œ ํšจํ•œ glTF์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•  ์ž๊ฒฉ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŠน์ • ํ๋ธŒ๋Š” ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋งํ•ด์•ผํ• ์ง€ ๋˜๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์‚ฌ์‹ค์ ์ธ ๋ฐ˜์‚ฌ๊ฐ€ ๊ณต์ •ํ•œ ๊ธฐ๋Œ€์ธ์ง€ ์•Œ ์ˆ˜์—†๋Š” ๊ทน๋‹จ์  ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋…ธ๋ฉ€ ๋งต์€ ๋ฉ”์‹œ์˜ ์ „์ฒด ํ‘œ๋ฉด์„ ๋ณ€ํ˜•์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฒ”ํ”„ ๋ฐ ์›€ํ‘น ๋“ค์–ด๊ฐ„ ๋ถ€๋ถ„๊ณผ ๊ฐ™์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ‘์„ ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝํžˆ๊ฑฐ๋‚˜ ์ƒ์„ฑ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋งค์šฐ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” normalScale.y *= -1 ๋ณ€๊ฒฝ์ด ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์— ์ €์žฅ๋œ ์ ‘์„ ์„ ์ง€์›ํ•˜๋„๋ก ์œ ๋„ ํ•œ ์˜ˆ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‚ฌ๋Š” BabylonJS์—์„œ๋„ ๊ฑฐ์น ์–ด ๋ณด์ž…๋‹ˆ๋‹ค.
Screen Shot 2019-10-23 at 4 00 02 PM

ํ™•์ธ ๋œ ์œ ์ผํ•œ ๋ฌธ์ œ๊ฐ€ NormalTangentTest์— ์žˆ๊ณ  ์‹ค์ œ๋กœ ์ž˜๋ชป ๋ Œ๋”๋ง๋˜๋Š” ๋ชจ๋ธ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์‹œํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์„œ ๋ณ€๊ฒฝ์„ ๋ณด๋ฅ˜ํ•ด์•ผํ• ๊นŒ์š”?

๋‚˜๋Š” ์—ฌ์ „ํžˆ normalScale.y *= -1 ์Šน์ˆ˜๋ฅผ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€ ๋งŒ, ๋ฌธ์ œ์˜ ์˜ˆ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋Ÿฌํ•œ ๊ทน๋‹จ์  ์ธ ์˜ˆ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๋Š” ํ‘œ์‹œ ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์‚ฌ์†Œํ•˜๋‹ค๋Š” ํ‘œ์‹œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ™•์ธ ๋œ ์œ ์ผํ•œ ๋ฌธ์ œ๊ฐ€ NormalTangentTest์— ์žˆ๊ณ  ์‹ค์ œ๋กœ ์ž˜๋ชป ๋ Œ๋”๋ง๋˜๋Š” ๋ชจ๋ธ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์‹œํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์„œ ๋ณ€๊ฒฝ์„ ๋ณด๋ฅ˜ํ•ด์•ผํ• ๊นŒ์š”?

์ˆ˜์ • : https://github.com/mrdoob/three.js/issues/17804 ๋Š” ์–‘๋ฉด ์žฌ์งˆ๋กœ ์ธํ•ด ์‹ค์ œ๋กœ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ‡ด๋ณดํ–ˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ์กฐ์‚ฌ ํ•  ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋‹จ์ˆœํ•จ๊ณผ ์˜จ์ „ํ•จ์„ ์œ„ํ•ด ์ง€๊ธˆ์€ ์ €์ฃผ๋ฐ›์€ ํ๋ธŒ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜‡

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰