Three.js: GLTF์ˆ˜์ถœ์ž

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

์ด ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GLTF2 ๋‚ด๋ณด๋‚ด๊ธฐ ๊ธฐ๋Šฅ์„ ์ถ”์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. PR https://github.com/mrdoob/three.js/pull/11917 ์—์„œ ๋…ผ์˜๋œ ๊ธฐ๋Šฅ์˜ ์ดˆ๊ธฐ ๋ชฉ๋ก์„ ๋ณต์‚ฌํ–ˆ์œผ๋ฉฐ ๊ตฌํ˜„์ด ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ ๋ชฉ๋ก์„ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ / ํ•  ์ผ

  • [x] ๋‚ด๋ณด๋‚ด๊ธฐ ์˜ต์…˜

    • [x] trs ํ–‰๋ ฌ ๋Œ€์‹  TRS ๋‚ด๋ณด๋‚ด๊ธฐ

    • [x] input :

    • [x] ๋‹จ์ผ ์žฅ๋ฉด

    • [x] ์žฅ๋ฉด ๋ฐฐ์—ด

    • [x] ๋‹จ์ผ ๊ฐœ์ฒด

    • [x] ๊ฐ์ฒด ๋ฐฐ์—ด

    • [x] truncateDrawRange : drawRange ์ •์˜๋œ ์†์„ฑ ๊ฐ’๋งŒ ๊ฐ•์ œ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

    • [x] ๋น„ ์ธ๋ฑ์Šค ๋ฒ„ํผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ

    • [x] ์ธ๋ฑ์‹ฑ๋œ ๋ฒ„ํผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ

  • [x] userData ์— extras ?
  • [x] ์žฅ๋ฉด

    • [x] ์—ฌ๋Ÿฌ ์žฅ๋ฉด ์ง€์›

  • [x] ๋…ธ๋“œ

    • [x] ๋ฉ”์‰ฌ

    • [x] ๊ธฐ๋ณธ ๋ชจ๋“œ:



      • [x] ์‚ผ๊ฐํ˜•


      • [x] TRIANGLE_STRIP


      • [x] TRIANGLE_SPAN


      • [x] ํฌ์ธํŠธ


      • [x] ๋ผ์ธ


      • [x] LINE_STRIP


      • [x] LINE_LOOP



    • [x] ๊ธฐํ•˜ํ•™ ์œ ํ˜•:



      • [x] ๋ฒ„ํผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ


      • [x] ๊ธฐํ•˜ํ•™



    • [x] ๊ธฐ๋ณธ ์†์„ฑ:



      • [x] ์œ„์น˜


      • [x] ์ •์ƒ


      • [x] TEXCOORD_0


      • [x] TEXCOORD_1


      • [x] ์ƒ‰์ƒ_0


      • [x] JOINTS_0


      • [x] WEIGHTS_0


      • [x] ํƒ„์  ํŠธ



    • [x] ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋กœ์„œ์˜ ๋‹ค์ค‘ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ฉ”์‹œ

    • [x] ์กฐ๋ช…

    • [x] ์นด๋ฉ”๋ผ

    • [x] ์Šคํ‚จ

  • [ ] ์žฌ๋ฃŒ :

    • [x] ๊ธฐ๋ณธ ์žฌ๋ฃŒ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ

    • [x] material.wireframe === true ๊ฒฝ์šฐ ํ–‰์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ

    • [x] pbrMetallicRoughness ๋Œ€ํ•œ MeshStandardMaterial

    • [x] ์†์„ฑ:



      • [x] baseColorFactor


      • [x] metallicFactor


      • [x] roughnessFactor


      • [x] baseColorTexture : ์ง€์›๋˜์ง€๋งŒ( material.map ) texCoord ๋Š” ํ•ญ์ƒ 0์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.



    • [x] doubleSided

    • [x] KHR_material_unlit

  • [x] ์ƒ˜ํ”Œ๋Ÿฌ
  • [ ] ์ด๋ฏธ์ง€

    • [x] uri map.image.src ์‚ฌ์šฉํ•˜๋Š”

    • [x] uri base64

    • [x] bufferView

    • [x] flipY ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

    • [ ] ์ฑ„๋„์„ ํ•˜๋‚˜์˜ ํ…์Šค์ฒ˜๋กœ ๋ณ‘ํ•ฉ

  • [] ์•ก์„ธ์„œ

    • [ ] ๊ฐ ์†์„ฑ์— ๋Œ€ํ•ด ์ƒˆ ํ•ญ๋ชฉ์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๋™์ผํ•œ componentType์— ๋Œ€ํ•ด ๋™์ผํ•œ bufferView ์‚ฌ์šฉ(WIP @takahirox)
    • [x] sparse ?
    • [ ] ์†์„ฑ :
    • [x] bufferView
    • [ ] byteOffset : ํ˜„์žฌ ๊ฐ ์ ‘๊ทผ์ž์— ๋Œ€ํ•ด ์ƒˆ bufferView๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ญ์ƒ 0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • [x] componentType
    • [x] count
    • [x] max
    • [x] min
    • [x] type :

      • [x] SCALAR

      • [x] VEC2

      • [x] VEC3

      • [x] VEC4

  • [ ] BufferViews : ํ˜„์žฌ ๊ฐ Accessor bufferView ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด componentType ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์— ๋Œ€ํ•ด ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • [x] ์†์„ฑ:
    • [x] buffer
    • [x] byteOffset
    • [x] byteLength
    • [x] byteStride
    • [x] target
  • [x] ๋ฒ„ํผ : ํ˜„์žฌ ๋ชจ๋“  ๊ฒƒ์„ ๋‹จ์ผ ๋ฒ„ํผ์— ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„ํผ ๋ฐฐ์—ด์˜ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

    • [x] ๋ฐ”์ดํŠธ ๊ธธ์ด

    • [x] ์šฐ๋ฆฌ

  • [x] ์• ๋‹ˆ๋ฉ”์ด์…˜
  • [ ] ๊ธฐํƒ€ :

    • [ ] ์ถœ๋ ฅ ํ™•์ธ (https://github.com/KhronosGroup/glTF-Validator)

    • [ ] ๋‚ด๋ณด๋‚ธ ํ•ญ๋ชฉ ์ˆ˜์™€ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋Š” stats ์˜ต์…˜์„ ํฌํ•จํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

  • [x] GLB

์˜ˆ์‹œ

ํ˜„์žฌ ๋ฐ๋ชจ:
image

์ˆ˜์ถœ gltf๋Š” @donmccurdy์˜ gltf ๋ทฐ์–ด์—๋กœ๋“œ
image

GLTF: https://gist.github.com/fernandojsg/0e86638d81839708bcbb78ab67142640

Enhancement

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

๋Œ€๋ถ€๋ถ„์˜ 3D ๋ชจ๋ธ์ด ๋‹ค์ค‘ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ค‘ ์žฌ๋ฃŒ ๋ฉ”์‰ฌ๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ์ •๋ง ์ข‹์•„ ๋ณด์ธ๋‹ค!

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์šฐ๋ฆฌ๋Š” ๊ณง THREE.GLTFLoader ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  GLTF2Loader โ†’ GLTFLoader ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค*. ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด r87์ด ์ถœ์‹œ๋˜๊ธฐ ์ „์— ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ์ด๋ฆ„์„ GLTFExporter๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆด๋ฆฌ์Šค ๊ฐ„์— ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•—, ์ด๋ฏธ ์ด๋ฆ„์„ ๊ทธ๋ ‡๊ฒŒ ์ง€์œผ์…จ๊ตฐ์š”.. ๊ณ„์†ํ•˜์„ธ์š”! ๐Ÿ˜†


* @mrdoob , ์–ธ์ œ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ ํ˜ธ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? IMO์—์„œ GLTFLoader ๋ฅผ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ r87์— ์œ ์ง€ํ•˜๊ณ  r88์—์„œ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ง€๊ธˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋น ๋ฅผ์ˆ˜๋ก ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด GLTFLoader ๊ฐ€ 1.0์„ ๊ฐ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ 2.0 ์ด์ƒ๋งŒ ์ง€์›ํ•œ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ.

IIRC๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด asset ๋ฅผ ๋ณด๊ณ  ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IIRC๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์ž์‚ฐ์„ ๋ณด๊ณ  ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋„ค! https://github.com/mrdoob/three.js/pull/11864

๋ฉ‹์žˆ๋Š”! ํ•˜์ง€๋งŒ ์‚ฌ์†Œํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ PR์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ธฐ ์ „์— ๋ณ‘ํ•ฉํ•ฉ์‹œ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@takahirox ํ™•์‹คํžˆ! ์‚ฌ๋žŒ๋“ค์€ ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ธ ์ผ์ด ์žˆ์œผ๋ฉด ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  PR์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ž‘์—…ํ•  ์ž‘์—…์€ url์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ…์Šค์ฒ˜๋ฅผ base64๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”! ๋‚˜๋Š” glTF ์ˆ˜์ถœ์—…์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฒดํฌ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฌด์—‡์„ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

BTW ์˜๋„์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜ WEBGL_CONSTANTS ๋ฐ THREE_TO_WEBGL ์ „์—ญ์„ ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๊นŒ?

@takahirox ๋ฉ‹์ง€๋‹ค!
๋‘ ๋ณ€์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์€ WebGLUtils ์ผ๋ถ€๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ PR์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์ˆ˜๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐ ์ƒ์ˆ˜๊ฐ€ ๋งค๋ฒˆ ๋‹ค์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ง์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@takahirox btw ๋ฌผ๋ก  ๋ชฉ๋ก์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ž์œ ๋กญ๊ฒŒ ์ œ์•ˆํ•˜์‹ญ์‹œ์˜ค! ;)

@fernandojsg ๋ฌผ๋ก ์ด์ฃ ! ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์˜๋„์ ์œผ๋กœ ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ๋ณ€์ˆ˜๋ฅผ ์–ด๋”˜๊ฐ€๋กœ ์ด๋™ํ•˜๋„๋ก ์ œ์•ˆํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ๋ฒ„ํผ ๋ณด๊ธฐ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

BufferViews: ํ˜„์žฌ ๊ฐ ์ ‘๊ทผ์ž์— ๋Œ€ํ•ด ์ƒˆ bufferView๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ componentType์„ ๊ณต์œ ํ•˜๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์— ๋Œ€ํ•ด ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์†์„ฑ์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์ผํ•œ componentType์„ ๊ณต์œ ํ•˜๋Š” ์†์„ฑ์— ๋Œ€ํ•œ ๊ฒƒ์ด ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์œ„ํ•œ ์ด์œ ๊ฐ€ ๋งž์Šต๋‹ˆ๊นŒ?

https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data -alignment

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

๋‹ค๋ฅธ componentType(์˜ˆ: float ๋ฐ short) ๊ฐ„์— ๋ฒ„ํผ ๋ณด๊ธฐ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์ข‹์€ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

target ๊ฐ™์€ normal (Vec3) , position (Vec3) ๋ฐ uv (Vec2) ๊ฐ™์€ ๋ฒ„ํผ ๋ทฐ์— ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ ์œ ํ˜•์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค target ๋™์ผํ•œ ๋ฒ„ํผ ๋ณด๊ธฐ์— ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ indices ์•„๋‹™๋‹ˆ๋‹ค. @donmccurdy ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด glTF ์‚ฌ์–‘์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด

https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data -alignment

bufferView์— ๋Œ€ํ•œ ์ ‘๊ทผ์ž์˜ ์˜คํ”„์…‹(์ฆ‰, accessor.byteOffset)๊ณผ ๋ฒ„ํผ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ž์˜ ์˜คํ”„์…‹(์ฆ‰, accessor.byteOffset + bufferView.byteOffset)์€ ์ ‘๊ทผ์ž์˜ ๊ตฌ์„ฑ ์š”์†Œ ์œ ํ˜• ํฌ๊ธฐ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•จ์„ ์œ„ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ componentType(= vec2 ๋˜๋Š” vec3์ด ์•„๋‹Œ float ๋ฐ short์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์œ ํ˜•) ๊ฐ„์— ๋ฒ„ํผ ๋ณด๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ธธ์ด componentType์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋” ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

BTW ํ˜„์žฌ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ accessor.componentType float, uint ๋ฐ ushort๋งŒ ์ง€์›ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? glTF 2.0์€ char, uchar ๋ฐ short๋ฅผ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#accessorcomponenttype -white_check_mark

@takahirox๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ์ง€์›ํ•˜๋Š” ์†์„ฑ ์œ ํ˜•(์œ„์น˜, ๋ฒ•์„ , ์ƒ‰์ƒ, UV, ์ธ๋ฑ์Šค ๋“ฑ)์— ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ๊นŒ์ง€ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํ…์Šค์ฒ˜์ด๋ฏ€๋กœ uchar ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋ฏธ impl์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋จผ์ € accessor.componentType ์— ๋Œ€ํ•ด ์ž‘์—…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฑฐ์˜ ์ค€๋น„๋˜์—ˆ์ง€๋งŒ ๋‚ด PR์ด #11978๊ณผ ์ถฉ๋Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ #11978์ด ๋ณ‘ํ•ฉ๋˜๋ฉด ๋‚ด ๊ฒƒ์„ ๋ณด๋‚ด๊ณ  ์ถฉ๋Œ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉ๋ก์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@takahirox ํ™•์‹คํžˆ, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ three.js์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ๋Šฅ์˜ ํ˜„์žฌ ์ƒํƒœ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ธ๊ณ„ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;)

BufferGeometry ๊ทธ๋ฃน์„ ์ง€์›ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?
GLTF ์‚ฌ์–‘์ด ์ด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋ชจ๋“  ๊ทธ๋ฃน์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๋ฉ”์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?
์ด๊ฒƒ์€ ๋˜ํ•œ ๋ฉ”์‹œ์˜ ๋จธํ‹ฐ๋ฆฌ์–ผ ์†์„ฑ์ด ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ฐฐ์—ด์ด๋ผ๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@marcatec glTF ์‚ฌ์–‘์—๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ์žฌ๋ฃŒ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” BufferGeometry ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” "๋ฉ”์‹œ" ๋Œ€ "๊ธฐ๋ณธ" ๊ตฌ๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ THREE.GLTFLoader๋Š” ๋กœ๋”ฉ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ๋ฉ”์‹œ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋™์˜ํ•ฉ๋‹ˆ๋‹ค, ํ›Œ๋ฅญํ•œ ์ผ์ž…๋‹ˆ๋‹ค!

StandardMaterial ์ด์™ธ์˜ ๋‹ค๋ฅธ ์žฌ๋ฃŒ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”!

@homerjam MeshStandardMaterial ๊ณผ ๊ณต์œ ๋˜๋Š” ๋ชจ๋“  ์žฌ์งˆ ์†์„ฑ์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map ๋ฐ normalMap ์‚ฌ์šฉํ•˜๋Š” MeshPhongMaterial์€ ํ•ด๋‹น ํ…์Šค์ฒ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ฑ„๋กœ ๋‚ด๋ณด๋‚ด์ง€๋งŒ three.js๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ๋•Œ MeshStandardMaterial์ด ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜์ถœ์—…์ฒด๋Š” ํ˜„์žฌ ์ด๋ฅผ ์œ„ํ•ด PBR๋กœ ์ˆœ์ง„ํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์™•๋ณต ์ง€์›(GLTFExporter์—์„œ Phong ๋‚ด๋ณด๋‚ด๊ธฐ, GLTFLoader์—์„œ Phong ๋กœ๋“œ)์—๋Š” glTF ํ˜•์‹์—์„œ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: https://github.com/KhronosGroup/glTF/pull/1150

baseColorTexture : ์ง€์›๋˜์ง€๋งŒ(material.map) texCoord๋Š” ํ•ญ์ƒ 0์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

@fernandojsg ์—ฌ๊ธฐ์— ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํžˆ .map ๋Š” ํ•ญ์ƒ three.js์˜ ์ฒซ ๋ฒˆ์งธ UV ์„ธํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— glTF์—์„œ ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๊นŒ?

๋˜ํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋ฉด์„œ ๋ชฉ๋ก์—์„œ ์„ธ ํ•ญ๋ชฉ์„ ์ง€์› ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ถ”๋ก :

  • ์ ‘์„ 

    • three.js๋Š” GPU์—์„œ๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ถœ์—…์ž๋งŒ์„ ์œ„ํ•œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํฌ์†Œ ์ ‘๊ทผ์ž
  • ์žฌ๋ฃŒ๊ฐ€ glTF ๊ธฐ๋ณธ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ƒ๋žตํ•˜์‹ญ์‹œ์˜ค.

    • ์—ฃ์ง€ ์ผ€์ด์Šค์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ฑฐ๋‚˜ ์–ด์ˆ˜์„ ํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚€๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

ํŽธ์ง‘๊ธฐ์—์„œ GLB๋กœ ๋‚ด๋ณด๋‚ด๋ฉด์„œ alphaMap , roughnessMap ๋ฐ metalnessMap ๊ฐ€ ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

#13397์—์„œ ๋‚˜๋Š” normalMap ๋‘˜ ๋‹ค ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ–ˆ์ง€๋งŒ ๋‚ด๊ฐ€ ํ‹€๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘๊ธฐ์—์„œ GLB๋กœ ๋‚ด๋ณด๋‚ด๋ฉด์„œ alphaMap, RoughnessMap ๋ฐ metalnessMap์ด ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ํ•œ ์˜ค๋Š˜ ์ž‘์—…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@donmccurdy

ํฌ์†Œ ์ ‘๊ทผ์ž
mattdesl์˜ ์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์ด ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„ ์ตœ์ ํ™”์— ๋งก๊ธฐ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ๋ชจํ”„์— ๋Œ€ํ•œ ํฌ์†Œ ์ ‘๊ทผ์ž๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์‹œ๋„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@takahirox ๋ฉ‹์ง€๋‹ค! ๊ฐ€์ž!

alphaMap ๊ฐ€ glTF 2.0์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#material

๋„ค, ๊ทธ๊ฒŒ ๋‘๋ ค์› ์–ด์š”.... metalnessMap ์™€ roughnessMap ์€์š”?

์ง€๊ธˆ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค!

13415

์ด๋ฏธ์ง€ ํ˜•์‹์— ๋Œ€ํ•ด. glTF 2.0์€ ์™ธ๋ถ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ .png ๋ฐ .jpg๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. embedImages ์•„๋‹Œ ๋ชจ๋“œ์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ํ˜•์‹ ํŒŒ์ผ(์˜ˆ: .bmp)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค.

  1. .png ๋˜๋Š” .jpg๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํฌํ•จ
  2. ์‹ ๊ฒฝ์“ฐ์ง€๋งˆ ์›๋ณธ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ
  3. ์ˆ˜์ถœํ•˜์ง€๋งˆ

๋‚˜๋Š” 1์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์™€์šฐ, ์ •๋ง ๋‹น์‹ ์˜ ์ž‘ํ’ˆ์„ ๊ฐ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ 3D ๋ชจ๋ธ์ด ๋‹ค์ค‘ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Multi-material meshes ์ด ๋นจ๋ฆฌ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  1. .png ๋˜๋Š” .jpg๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํฌํ•จ
  2. ์‹ ๊ฒฝ์“ฐ์ง€๋งˆ ์›๋ณธ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ
  3. ์ˆ˜์ถœํ•˜์ง€๋งˆ

๋‚˜๋Š” 3์— ํˆฌํ‘œํ•˜๊ณ  ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ 3D ๋ชจ๋ธ์ด ๋‹ค์ค‘ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ค‘ ์žฌ๋ฃŒ ๋ฉ”์‰ฌ๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆ˜์ถœ์—…์ฒด์˜ ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ 3D ๋ชจ๋ธ์ด ๋‹ค์ค‘ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ค‘ ์žฌ๋ฃŒ ๋ฉ”์‰ฌ๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

  1. .png ๋˜๋Š” .jpg๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํฌํ•จ
  2. ์‹ ๊ฒฝ์“ฐ์ง€๋งˆ ์›๋ณธ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ
  3. ์ˆ˜์ถœํ•˜์ง€๋งˆ

๋‚˜๋Š” 3์— ํˆฌํ‘œํ•˜๊ณ  ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, 3.์ด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. emedImages ์•„๋‹Œ ๋ชจ๋“œ์—์„œ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ 1์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค๋ฅธ ํ˜•์‹์—์„œ glTF๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€(๋˜๋Š” ๋งŽ์€) ๋‹ค๋ฅธ ํ˜•์‹์—๋Š” ์ด๋ฏธ์ง€ ํ˜•์‹ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ๋Š” embedImages ๋ชจ๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ˜์†” ๊ฒฝ๊ณ ์— "๋ณ€ํ™˜ํ•˜๋ ค๋ฉด embedImages ์˜ต์…˜ ์‚ฌ์šฉ"์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ 3๋ฒˆ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ˜•์‹์—์„œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ง€๋ฃจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์–ด์จŒ๋“  ๋‹ค๋ฅธ ํ˜•์‹์— ๋น„ํ•ด ์ผ๋ถ€ ํ˜•์‹์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ง€๊ธˆ ๋‹น์žฅ 3๋ฒˆ์„ ํ•˜๊ณ  gltf๊ฐ€ ktx์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ํ…์Šค์ฒ˜ ํ˜•์‹์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ตฌํ˜„์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/pull/13415#issuecomment -369022383์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ exporter๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ambientRoughnessMetalness ํ…์Šค์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ฝ”๋“œ๋ฅผ ImageUtils ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. multimaterial ํ•ญ๋ชฉ์— @takahirox ๋ฅผ ์ถ”๊ฐ€
๋‚˜๋Š” ๋˜ํ•œ material_unlit ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ์•„์ง ์ดˆ์•ˆ์ด์ง€๋งŒ ์ถœ์‹œ๊ฐ€ ์ž„๋ฐ•ํ–ˆ์œผ๋ฉฐ ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(/cc @donmccurdy).

๋Œ€๋ถ€๋ถ„์˜ 3D ๋ชจ๋ธ์ด ๋‹ค์ค‘ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ค‘ ์žฌ๋ฃŒ ๋ฉ”์‰ฌ๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

WIP... (Miku์—๋Š” ๋‹ค์ค‘ ์žฌ๋ฃŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค)

image

์ง€์›๋˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ํ˜•์‹์— ๋Œ€ํ•ด์„œ๋Š” 3์œผ๋กœ ๊ฐ€์ž.

@takahirox ์ž˜ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ‘

BTW, zip ์•„์นด์ด๋ธŒ ์ง€์›์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? .glTF + ์™ธ๋ถ€ .bin ๋ฐ ํ…์Šค์ฒ˜๋Š” ๋‹ค๋ฅธ ์ €์ž‘ ๋„๊ตฌ(์•„๋งˆ๋„)์— ์ ํ•ฉํ•˜์ง€๋งŒ ์•„์นด์ด๋ธŒ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ zip ์•„์นด์ด๋ธŒ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ธ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์›ํ•˜๊ณ  ์ „์— ๋‚ด ์ง€์—ญ ์ง€์ ์—์„œ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉด ๋‚˜์ค‘์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

glb๋ฅผ ์••์ถ•ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

.glTF + ์™ธ๋ถ€ .bin ๋ฐ ํ…์Šค์ฒ˜๋Š” ๋‹ค๋ฅธ ์ €์ž‘ ๋„๊ตฌ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค(์•„๋งˆ๋„).

์ €์ž‘ ๋„๊ตฌ์— ๋ณ„๋„์˜ ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ GLB๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๋ฅผ ์†์œผ๋กœ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ธฐ๋Šฅ์„ THREE.GLTFExporter ์ง์ ‘ ๋„ฃ์„ ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์˜๊ฒฌ์€ ์—†์ง€๋งŒ glTF์—์„œ ์‚ฌํ›„ ์ตœ์ ํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, Draco๋Š” ์ผ์ข…์˜ ๋ณต์žกํ•˜๊ณ  ์—ฌ๋Ÿฌ ์™ธ๋ถ€ ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํŠน์ˆ˜ glTF-to-glTF ๋„๊ตฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šฐ๋ฆฌ๋Š” glb-unpacker(http://glb-packer.glitch.me/ ๋ฐ˜๋Œ€)๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ๋žŒ๋“ค์ด ํ•„์š”๋กœ ํ•˜๋Š” ํŒŒ์ผ์„ GLB์—์„œ ZIP์œผ๋กœ ์••์ถ• ํ•ด์ œํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/KhronosGroup/glTF/issues/1256์—์„œ โ€”

... gltf-pipeline์˜ ์›๋ž˜ ์˜๋„์™€ ์ผ๋ฐ˜์ ์œผ๋กœ glTF๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ตœ์ ํ™”๋ฅผ ๊ณตํ†ต ๋„๊ตฌ๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹จํŽธํ™”์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‚ด๊ฐ€ ์•„๋Š” glb-unpacker๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...

@mrdoob

๋‚˜๋Š” ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€๊ฐ€ .glTF ๋Œ€ .glb๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€์— ์žˆ๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

@donmccurdy

๋‚˜๋Š” https://github.com/KhronosGroup/glTF/issues/1117 ํ† ๋ก ์„ ๋”ฐ๋ž๊ณ  ์ง€๊ธˆ .glb + ์ž„๋ฒ ๋””๋“œ ํŒŒ์ผ ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์žฅ๋ คํ•˜๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ .glb๋Š” ํŠนํžˆ ์›น์šฉ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ ํ•ฉํ•˜๋ฉฐ ํŒŒ์ดํ”„๋ผ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ๋„๊ตฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (์ €๋Š” UNIX/Linux ๋ช…๋ น ํŒŒ์ดํ”„๋ผ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค!)

๊ทธ๋ž˜์„œ ์ˆ˜์ถœ์—…์ž๊ฐ€ ์ง€๊ธˆ zip ์•„์นด์ด๋ธŒ ์ง€์›์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ™์€ ์ด์œ ๋กœ ํฌ์†Œ ์ ‘๊ทผ์ž์™€ draco ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

glb-unpacker์— ๊ด€ํ•ด์„œ๋Š” ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์•„ํ‹ฐ์ŠคํŠธ๋Š” glTF ํŠน์ • ๋„๊ตฌ ์—†์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— .glTF + ์™ธ๋ถ€ ํŒŒ์ผ์„ ์ข‹์•„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋” ์™ธ๋ถ€ ํŒŒ์ผ์€ ๋ณ‘๋ ฌ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์—ฌ ์ตœ์ ํ™” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ Three.js ๋ฐ ๊ธฐํƒ€ JavaScript ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์—”์ง„์˜ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” glTF ์ตœ์ ํ™” ๋„๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์ตœ์ ํ™”/์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๊ฐ€ ์—†์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋‚ด๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•œ ๋‹ค์Œ ๋ธŒ๋ผ์šฐ์ € ์ œํ•œ์œผ๋กœ ์ธํ•ด ํŒŒ์ดํ”„๋ผ์ธ ๋„๊ตฌ์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

GLTFLoader ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง€์›์€ ํ™•์žฅ์œผ๋กœ ๊ตฌํ˜„๋˜์ง€๋งŒ .glb๋Š” glTF 2.0์˜ ํ•ต์‹ฌ ์‚ฌ์–‘์— ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋งž์Šต๋‹ˆ๊นŒ?

GLTFLoader์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง€์›์€ ํ™•์žฅ์œผ๋กœ ๊ตฌํ˜„๋˜์ง€๋งŒ .glb๋Š” glTF 2.0์˜ ํ•ต์‹ฌ ์‚ฌ์–‘์— ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋งž์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๊ทธ๊ฒƒ์€ glTF 1.0์˜ ํ™•์žฅ์ด์—ˆ๊ณ  ํ•ต์‹ฌ glTF 2.0 ์‚ฌ์–‘์˜ ์ผ๋ถ€๊ฐ€ ๋œ ํ›„ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ [์ตœ์ ํ™” ๋„๊ตฌ]๊ฐ€ ๋ธŒ๋ผ์šฐ์ €, ์„œ๋ฒ„, CUI ๋“ฑ ์–ด๋””์—์„œ๋‚˜ ์‹คํ–‰๋˜์–ด ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ด๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด node.js ๊ธฐ๋ฐ˜ ๋„๊ตฌ๊ฐ€ ์ข‹์„๊นŒ์š”? glTF(ํŒŒ์ดํ”„๋ผ์ธ) ํŒ€์— ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (์ด ๋…ผ์˜๋Š” ์—ฌ๊ธฐ๊ฐ€ ์•„๋‹Œ glTF์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

glTF-Pipeline ๋กœ๋“œ๋งต ์— glTF-Pipeline์ด ์–ผ๋งˆ๋‚˜ ์ผ๋ฐ˜์ ์ด๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€, ์ฃผ๋กœ Cesium ์šฉ๋„์ธ์ง€ ๋˜๋Š” ์ œํ•œ๋œ ๊ฐœ๋ฐœ์ž ์‹œ๊ฐ„์˜ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ glTF-Toolkit ์€ ๊ด€๋ จ์„ฑ์ด ์žˆ์–ด ๋ณด์ด์ง€๋งŒ (ํ˜„์žฌ) Windows์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ Node.js๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ WASM์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด C++ ๋˜๋Š” Rust๊ฐ€ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„, WASM์— ๋Œ€ํ•œ ํŽธ์ง‘์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ถŒ์žฅ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ตœ์ ํ™” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ์— ์ œ์•ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๊ฐ€ three.js์™€ ๋‹ค๋ฅธ ์ €์žฅ์†Œ์— ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— @donmccurdy์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ gltf ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํˆดํ‚ท ๋„๊ตฌ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ํ™•์ธํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ WASM์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ ์†Œ์Šค ์–ธ์–ด๋Š” ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์ด node.js๋กœ ์ž‘์„ฑ๋œ๋‹ค๋ฉด ์•„๋งˆ๋„ 3d ์›น ์—”์ง„ ์ฃผ๋ณ€์˜ ๋งŽ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ๋˜ํ•œ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ง€๊ธˆ์€ ์ด ํŒŒ์ผ ํ˜•์‹์˜ ์ฃผ์š” ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.

"๋ณ€ํ™˜ ์ „ ์ตœ์ ํ™”"์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ชจ๋ธ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋ณ€ํ™˜์ด ์žˆ์œผ๋ฉฐ ์ตœ์ ํ™”๊ฐ€ ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ณ€ํ™˜ ์œ ํ˜•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์˜คํƒ€์ž…๋‹ˆ๋‹ค. ๋ณ€์‹ ์ด ์•„๋‹ˆ๋ผ ์ „์ด. ๋‚ด ๋ง์€, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ์ตœ์ ํ™”/์••์ถ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ์–˜๋“ค์•„

THREE.js GLTF ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด aframe ์žฅ๋ฉด์„ gltf ๊ฐœ์ฒด๋กœ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋ ˆ์ž„์— ์ •์˜๋œ a-animation ํƒœ๊ทธ๋ฅผ gltf ๊ฐœ์ฒด์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ผ๋ถ€๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@sunsun_sss @ssssssssss ใ…‹ใ…‹ใ…‹

์•ˆ๋…•ํ•˜์„ธ์š” @siddhartpai โ€” THREE.GLTFExporter ๋Š” THREE.AnimationClip ๊ฐœ์ฒด๋งŒ glTF ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด A-Frame์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์Šคํ…œ์€ TweenJS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. GLTFExporter ๋„ ์‚ฌ์šฉํ•˜๋Š” A-Frame ๋˜๋Š” A-Frame Inspector์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ํ–ฅํ›„ ๊ธฐ๋Šฅ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ ์žฌ๋ฃŒ ์ง€์› #13536

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ •๊ทœํ™”๋˜์ง€ ์•Š์€ ๋ฒ„ํผ ๋ทฐ์˜ ๋ชจ๋“  ์ผ๋ฐ˜ ์š”์†Œ์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋˜์ง„๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [0,0,0]๊ณผ ๊ฐ™์€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ๊ณ /ํ†ต์ง€๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜์ด๋ฏ€๋กœ ์ˆ˜์ •์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ bufferview ์š”์†Œ๊ฐ€ ์ •๊ทœํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  [0,0,0]๊ณผ ๊ฐ™์ด ์ •๊ทœํ™”ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์˜ ๊ฒฝ์šฐ ์œ ํšจํ•œ ๋‹จ์œ„ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? /cc @donmccurdy

NORMAL ์„ ์ •๊ทœํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#meshes

๋…ธ๋ฉ€ | "VEC3" | 5126(ํ”Œ๋กœํŠธ) | ์ •๊ทœํ™”๋œ XYZ ์ •์  ๋ฒ•์„ 

Three.js normal์—๋Š” ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์žฅ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ํ•˜์ง€๋งŒ [0,0,0]์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฐ’๊ณผ ๊ฐ™์ด ์‹ค์ œ ๋…ธ๋ฉ€์ด ์—†์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๊ทธ๋ƒฅ ์œ ํšจํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. [1,0,0]์ด๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค. ๋”ฐ๋ผ์„œ normal ์†์„ฑ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ณด๊ธฐ์— ์ €์žฅํ•˜๊ธฐ ์ „์— ๊ฐ ์†์„ฑ์„ ์ •๊ทœํ™”ํ•˜๊ณ  ์žˆ์Œ์„ ๊ฐ์ง€ํ•˜๋„๋ก bufferview ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[0,0,0]์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฐ’๊ณผ ๊ฐ™์ด ์‹ค์ œ ๋ฒ•์„ ์ด ์—†์„ ๋•Œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…

ํ .... ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ๊ต์ฒดํ•˜๊ณ  ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ normal ์†์„ฑ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ณด๊ธฐ์— ์ €์žฅํ•˜๊ธฐ ์ „์— ๊ฐ ์†์„ฑ์„ ์ •๊ทœํ™”ํ•˜๊ณ  ์žˆ์Œ์„ ๊ฐ์ง€ํ•˜๋„๋ก bufferview ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋” ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— processMesh() ์—์„œ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

var originalNormal = geometry.attributes.normal;

if ( hasNonNormalizedValues( originalNormal ) ) {

    geometry.attributes.normal = createNormalizedAttribute( originalNormal );

}

processAccessorHere();

geometry.attributes.normal = originalNormal;

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

์˜ˆ, ๋‚˜๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„์— ๋ฒ•์„ ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๋‘๋ ค์› ์ง€๋งŒ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•œ ํ›„ ์™„๋ฃŒํ•œ ํ›„ ๋‹ค์‹œ ์ €์žฅํ•˜๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :+1: ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ PR์„ ์ถ”์ง„ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฑธ ๊ณ ์น˜๋Š๋ผ ๊ธ‰ํ•˜์‹ ๊ฐ€์š”?)

@takahirox ๋ฉ‹์ง€๋„ค์š” , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์„œ๋‘๋ฅด์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์ˆ˜์ถœ์—…์ฒด ํ˜„ํ™ฉ์„ ๋ณด๊ณ  ์žˆ์—ˆ์–ด์š” ^_^

์ข‹์•„์š”, ๊ทธ๋Ÿผ ~๋‚ด์ผ~ ์ด๋ฒˆ์ฃผ์— ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค, glTF๋Š” ํŠน์ • ์ •์ ์— ๋Œ€ํ•œ ๋ฒ•์„  ์ƒ๋žต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹จ์ผ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์—์„œ ๋‹ค๋ฅธ ์ •์ ์€ ์ƒ๋žตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ์ •์ ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ผ์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋ฏ€๋กœ ๋‚ด ํˆฌํ‘œ๋Š” ์ •๊ทœํ™”ํ•˜๋Š” ์ƒˆ ๋ฒ•์„  ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ๋นˆ ๋ฐฐ์—ด์— (0,1,0) ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋„ค ์ €๋„ ๊ทธ๋ƒฅ ์“ฐ๋ ค๊ณ  ํ–ˆ์–ด์š”! :NS

๋Œ€ํ˜• ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋Š๋ฆฐ ๊ฒฝ์šฐ checkNormals ์˜ต์…˜์ด๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์›ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ์ •์ ์„ ์Šค์บ”ํ•˜๋Š” ๋Œ€์‹  ์„ ํƒ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๊ทธ ์˜ต์…˜ ์—†์ด PR์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ/ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€ํ•ฉ์‹œ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ด ๊ฒ€์‚ฌ๋Š” ๊ทธ๋‹ค์ง€ ๋Š๋ฆฌ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๊ทธ ์˜ต์…˜ ์—†์ด PR์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ/ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€ํ•ฉ์‹œ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ด ๊ฒ€์‚ฌ๋Š” ๊ทธ๋‹ค์ง€ ๋Š๋ฆฌ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ธํ„ฐ์—์„œ ๊ฐ ์ŠคํŠธ๋กœํฌ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ์ „์ฒด ๋ฒ„ํผ๋ฅผ ์ •๊ทœํ™”ํ–ˆ๋Š”๋ฐ ์ƒ๋‹นํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์ •์ƒํ™” ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ๋งŒ ํ•ด๋„?

@takahirox ์–ด์จŒ๋“  ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋ฏ€๋กœ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ , ์•Œ์•˜์–ด. PR๋กœ ํ‰๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋„์ž…ํ•œ ์ฒซ ๋ฒˆ์งธ GLTFExporter ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ ์ •์ ์œผ๋กœ ๋ชจ๋“  ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์ƒ๋Œ€/์ ˆ๋Œ€ ๋ชจํ”„ ๋Œ€์ƒ ๋ณ€ํ™˜ ์ œ์™ธ). ๊ทธ๋ž˜์„œ ์ž ์žฌ์ ์œผ๋กœ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ .

ํ›Œ๋ฅญํ•œ ์ผ! IMHO๋Š” "์˜ˆ์ œ"๊ฐ€ ์•„๋‹Œ ํ•ต์‹ฌ three.js์— ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
KHR_lights_punctual ์ง€์›์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

PR https://github.com/mrdoob/three.js/pull/15519๋Š” KHR_lights_punctual์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. :)

์ด ๋ฌธ์ œ๋Š” ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ํ•ญ๋ชฉ์€ ๋œ ์ค‘์š”ํ•œ ํŽธ์˜์„ฑ์ด๋‚˜ ์ตœ์ ํ™”์ด๋ฉฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • [ ] ๋ฒ„ํผ ๋ทฐ ์žฌ์‚ฌ์šฉ
  • [ ] ๊ธˆ์†/๊ฑฐ์นœ/ao ํ…์Šค์ฒ˜ ์ž๋™ ๋ณ‘ํ•ฉ

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ชจํ”„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ณ  ์ตœ์ข… ๊ฐœ์ฒด์—์„œ ์ œ๊ฑฐํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ชจ์–‘์˜ ๋ฉ”์‰ฌ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ด ์งˆ๋ฌธ์ฒ˜๋Ÿผ https://stackoverflow.com/questions/57423471/how-to-export-morph-changed-meshes-from-threejs-application
๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

@vini-guerrero GitHub ๋ฌธ์ œ๋ณด๋‹ค๋Š” ํฌ๋Ÿผ(https://discourse.threejs.org/)์ด๋‚˜ Stack Overflow๋ฅผ ์ด์šฉํ•ด ๋„์›€์„ ์ฃผ์„ธ์š”.

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