Three.js: FBX ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 10์›” 14์ผ  ยท  100์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

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

qq 20161014151051

FBXLoader๋Š” FBX ํ…์ŠคํŠธ ํ˜•์‹๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

Three.js ๋ฒ„์ „
  • [ ] ๊ฐœ๋ฐœ
  • [x] r81
  • [ ] ...

    ๋ธŒ๋ผ์šฐ์ €
  • [x] ๋ชจ๋‘

  • [ ] ํฌ๋กฌ
  • [ ] ํŒŒ์ด์–ดํญ์Šค
  • [ ] ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ

    OS
  • [x] ๋ชจ๋‘

  • [ ] ์œˆ๋„์šฐ
  • [ ] ๋ฆฌ๋ˆ…์Šค
  • [ ] ์•ˆ๋“œ๋กœ์ด๋“œ
  • [ ] iOS
    ํ•˜๋“œ์›จ์–ด ์š”๊ตฌ ์‚ฌํ•ญ(๊ทธ๋ž˜ํ”ฝ ์นด๋“œ, VR ์žฅ์น˜, ...)
Enhancement

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

4์›”๋ถ€ํ„ฐ FBX ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์„œ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ์„œ๋‘๋ฅด๋ฉด LMK.

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

์˜ˆ. ํ˜„์žฌ FBXLoader ๋Š” ๋ฒ„์ „ 7์˜ ASCII ํ˜•์‹๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Three.js ๋ฒ„์ „ : r77

qq 20161014175807

์™œ์š”?

/ping @์•ผ๋งˆํžˆ๊ฐ€์‹œ

์™œ์š”?

์ฐธ์กฐ ์˜คํ”ˆ ์†Œ์Šค ๊ตฌํ˜„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—? ๋‹น์‹ ์ด ํ•˜๋‚˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„๋ณด๊ณ  ๊ถ๊ธˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„, ์ž ๊น, ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. v7 ๋ฏธ๋งŒ์˜ ASCII FBX์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ ์— ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ  ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ ์–ด๋”˜๊ฐ€์— ํ…Œ์ŠคํŠธ ๋ชจ๋ธ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ FBX ํŒŒ์„œ๋ฅผ ๋งŒ๋“ค์—ˆ๊ฑฐ๋‚˜ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์•ˆ๊ทธ๋Ÿฌ๋ฉด ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š”๊ฑฐ ๊ฐ™์•„์„œ...

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

์กฐ์–ธ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ ์ด ์‚ฌ์ดํŠธ๋ฅผ ๋ณด๊ณ  FBX ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

https://code.blender.org/2013/08/fbx-binary-file-format-specification/

๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ObjectParser๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์„œ์˜ ๊ฒฐ๊ณผ์—์„œ.

์˜ค ์™€์šฐ,) ์‚ฌ๋žŒ์€ ์ด๋ฏธ ์ง€์˜ฅ ๊ฐ€๊ณ , ์‚ฌ์–‘์ด์žˆ๋‹ค

https://banexdevblog.wordpress.com/2014/06/23/a-quick-tutorial-about-the-fbx-ascii-format/
์ด ๋งํฌ๋„ ๊ทธ๋Ÿฐ ์ผ์„ ํ•˜๊ธฐ์— ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”.

@takahirox ์ƒˆ ํŒŒ์„œ๊ฐ€ THREE.PLYLoader ์™€ ๊ฐ™์€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌํ˜„์€ ASCII ๋˜๋Š” ์ด์ง„ ์ž…๋ ฅ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ํ›„ THREE.BufferGeometry ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ท ์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค( handleElement ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋ฒ• ์ฐธ์กฐ).

๊ทธ๋ž˜ ์‹œ๋„ํ•ด ๋ณผ๊ป˜. ๊ทธ๋ฆฌ๊ณ  MMDLoader ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BTW FBX ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์ด ๋ฒ„์ „ 7 ์ดํ•˜์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์•„๋ฌด ์ƒ๊ฐ์ด ์—†๋‹ค.

@mrdoob์ด ์•Œ๊ณ  ์žˆ์„๊นŒ์š”?

@takahirox ๋ฐ”์ด๋„ˆ๋ฆฌ fbx ํŒŒ์„œ๋ฅผ ์–ด๋””์—์„œ๋‚˜ ๊ณต์œ  ํ–ˆ์Šต๋‹ˆ๊นŒ?

์•„์ง... ๊ณง ํ• ๊ฒŒ์š”!

@takahirox ๋ชจ๋“  ์—…๋ฐ์ดํŠธ :) ? ๊ฐ์‚ฌ ํ•ด์š”!

์ตœ๊ทผ์— ๋ฐ”๋น ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ๊ณง!

@takahirox ๊ต‰์žฅ \ o/

4์›”๋ถ€ํ„ฐ FBX ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์„œ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ์„œ๋‘๋ฅด๋ฉด LMK.

@takahirox ๊ณต์œ ํ•  ๊ฑฐ์นœ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ด๋ฒˆ ์ฃผ ๋ง์— ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐ๋ชจ๋ฅผ ์œ„ํ•ด FBX ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๋”ฉ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @takahirox ์ €๋Š” ์‚ฌ์‹ค

์ด์ œ ๋ง‰ ๋‹ค์‹œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ ์–ด๋„ ๊ทธ๊ฒƒ์„ ๊ณต์œ ํ•˜๋ ค๋ฉด ๋ช‡ ์ฃผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡์ฃผ๋ผ๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”?

ํ , ์•„๋งˆ 2~3์ฃผ?

๊ทธ๋ƒฅ ํ˜ธ๊ธฐ์‹ฌ์—์„œ, ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ ์ž‘์—…์˜ ์ผ๋ถ€๋ฅผ ํ›„์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ผ์ฃผ์ผ ์ •๋„์— ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„์š”, ์žฅ๋‹ด์€ ๋ชปํ•˜์ง€๋งŒ ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
์ฐธ๊ณ ๋กœ ์ž‘์—…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํŒŒ์ผ.fbx.zip
์ด๊ฒƒ์€ ๋„์›€์ด๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ...

https://with.in/watch/under-neon-lights/์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ํ…์ŠคํŠธ FBX๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์„œ๋ฒ„์—์„œ gzip์œผ๋กœ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™•์žฅ์ž๋ฅผ .fbx.txt๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ FBXLoader2 ์ƒ๋‹นํžˆ ๋งŽ์ด ์ตœ์ ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ๊ดœ์ฐฎ์€ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

FBXLoader2 ๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ด๋ฏธ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” FBXLoader ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค...

@kyle-larson?

์ฐธ๊ณ : FBX ์˜ˆ์ œ ์—์„œ๋Š” ์ด๋ฏธ FBXLoader2 ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@mrdoob FBXLoader์™€

์•„! ๊ทธ๋Ÿผ ๊ต์ฒด์‹œ๊ธฐ ๐Ÿ‘Œ

์ด ๋…€์„๋“ค์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ๋„์™€๋“œ๋ฆฌ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

testfile.fbx.zip์˜ ํ…์ŠคํŠธ ํŒŒ์ผ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋น„๊ตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์„œ ์ง„ํ–‰...

image

@adam-clarey

๋ชจ๋ธ์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
ํ…์ŠคํŠธ ํŒŒ์ผ๋„ Three.js์— ๋กœ๋“œํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋ธ์˜ ์Šคํฌ๋ฆฐ์ƒท....

image

๋ชจ๋ธ: https://free3d.com/3d-model/robot-2162.html

์ข‹์•„ ๋ณด์—ฌ! ๐Ÿ˜€

๋‹ค๋“ค ๊ฐ์‚ฌ ํ•ด์š”!

์กฐ๋งŒ๊ฐ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์˜ฌ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์žฌ๋ฃŒ ์ด๋ฏธ์ง€์™€ ๋ชจ๋ธ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธ”๋ก.fbx.zip
screen shot 2017-05-05 at 15 19 12

๋‹ค์Œ์€ ๋ธ”๋ Œ๋”์—์„œ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ fbx์— ๊ตฌ์šด ์ด๋ฏธ์ง€ ์žฌ๋ฃŒ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ fbx ํŒŒ์ผ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”?

์˜ˆ. ํ•ด๋‹น ๋ชจ๋ธ์„ ์ž˜๋ชป ๋‚ด๋ณด๋ƒˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fbx ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์—์„œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...
๊ตฌ์šด ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์‚ฌ์–‘์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค
block2.fbx.zip

์•„์ง๋„ ๋ชป์ฐพ์Œ...
ํ•ด๋‹น ํŒŒ์ผ์„ ๋‹ค๋ฅธ ๋ทฐ์–ด์—์„œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌ์šด ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์‚ฌ์–‘์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

๋ธ”๋ Œ๋”์™€ 3ds max๋กœ block2.fbx.zip ๋ฅผ ์—ด๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํŒŒ์ผ ์ด๋ฆ„๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์ด๋ฏธ์ง€๋Š” ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์— .../Users/adamclarey/Documents/burger-screen.jpg ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋‚ด ํŒŒ์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ ์ถ”์ถœํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋Š” ์ถ”์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธ. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒŒ ๋ถ„๋ช…ํ•ด. ๋ธ”๋ Œ๋”๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์•ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ์‹œ๋„ํ•  ๊ฒƒ์ด๋‹ค

์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ 3D ๋‚ด๋ณด๋‚ด๊ธฐ/๊ฐ€์ ธ์˜ค๊ธฐ ํ˜•์‹(๊ทธ๋Ÿฌ๋‚˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋งŒ)์œผ๋กœ ๊ตฌ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์€ ๋“ค์–ด๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ๋ฌผ๊ฑด์ž…๋‹ˆ๋‹ค.

์ด FBX๋Š” 3ds max์—์„œ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ "๋ฏธ๋””์–ด ํฌํ•จ" ์˜ต์…˜์œผ๋กœ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.
TestcubeWithImage.zip

3ds max์˜ ์Šคํฌ๋ฆฐ์ƒท:

testcubescreenshot

๋ธ”๋ Œ๋”์—์„œ ์—ด๋ฆผ(๋‹ค๋ฅธ ๊ธฐ๊ณ„์—์„œ):

screenshot_blender

๋ธ”๋ Œ๋”์—์„œ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๊ตฌ์šด ์ด๋ฏธ์ง€๋กœ FBX๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์˜ต์…˜์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ˆ˜์ถœํ•˜๊ธฐ ์ „์— ๋ฒ ์ดํ‚น์„ ํ•ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ์š”? - ๋ฏน์„œ๊ธฐ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค.

@takahirox 3ds max์—์„œ๋„ ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ "๋ฏธ๋””์–ด ํฌํ•จ" ์˜ต์…˜ ์—†์ด ๋‚ด๋ณด๋‚ธ ๋™์ผํ•œ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ๋ธŒ.zip

๋น„๊ต ๋ชฉ์ ์œผ๋กœ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋ฉด ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

TestcubeWithImage.fbx์˜ Video.ID.properties.Content ์†์„ฑ์—์„œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ด ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œ๋œ ๋‹ค๋ฅธ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ๋ณผ๊ฒŒ์š”...

image

์ง„ํ–‰... ๐Ÿ˜„

image

์ด์ œ ํฌํ•จ๋œ ํ…์Šค์ฒ˜๊ฐ€ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํฌํ•จ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ fbx๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ‚คํ”„๋ ˆ์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํฌํ•จ๋œ 3๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฒˆ์—ญ.zip
AnimationMorph.zip
์• ๋‹ˆ๋ฉ”์ด์…˜๋ณธ์ฆˆ.zip

๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ–‰ํžˆ๋„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘ 3ds max๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • 3ds max๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ชจ๋‘ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
  • AnimationTranslate ์˜ˆ์ œ๋Š” Blender ๋ฐ Clara.io์—์„œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
  • AnimationMorph ์˜ˆ์ œ๋Š” Blender์—์„œ ๊ดœ์ฐฎ์ง€๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Clara.io์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • AnimationBones ์˜ˆ์ œ๋Š” Clara.io์—์„œ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ๋ธ”๋ Œ๋”์—์„œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@takahirox ์šฐ๋ฆฌ ํŒ€์€ ์ž ์‹œ ๋™์•ˆ three.js ๋ฐ”์ด๋„ˆ๋ฆฌ FBX ํŒŒ์„œ๋ฅผ ์ฐพ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์ •๋ง ๋ฉ‹์ ธ ๋ณด์ž…๋‹ˆ๋‹ค! ์†Œ์Šค๋ฅผ ์•„์ง ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด FBX์—์„œ ๋ฉ”์‹œ, ๋ฒ•์„ , UV ๋ฐ ์‹œ๊ฐ์  ์žฅ๋ฉด์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ„์น˜๋ฅผ ์•Œ๋ ค ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

https://github.com/takahirox/three.js/blob/FixLoaderBinaryParser/examples/js/loaders/FBXLoader2.js

์ด๊ฒƒ์€ ๋งค์šฐ ์ผ์‹œ์ ์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.
์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋‹น์žฅ์€ ๊ธฐ๋Šฅ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@takahirox ์ฐธ๊ณ : ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ํ›„ ์ด์ „ ์˜๊ฒฌ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

@jostschmithals

๊ฐ์‚ฌ ํ•ด์š”.
๋ฒˆ์—ญ๊ณผ ๋ผˆ๊ฐ€ ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
FBXLoader๋Š” ASCII ํŒŒ์ผ์—์„œ๋„ ์•„์ง Morph ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์ž‘ํ’ˆ์ด๊ฒ ์ง€....

three.js ํ”„๋กœ์ ํŠธ์—์„œ testcube ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
FBXTree ๊ฐœ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•œ ํ›„ ์ด๋ฏธ์ง€ ํŒŒ์ผ์— 404๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ ˆ๋Œ€ ํŒŒ์ผ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

screen shot 2017-05-07 at 15 01 23
screen shot 2017-05-07 at 14 59 00

๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ(์›๋ž˜ jpg๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ปดํ“จํ„ฐ์—์„œ) ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/takahirox/three.js/blob/FixLoaderBinaryParser/examples/js/loaders/FBXLoader2.js ,
๊ทธ๋Ÿฌ๋‚˜ ๋กœ๋”๋Š” ๋‹จ์ˆœํžˆ THREE.FBXLoader (๋ฒ„์ „ ๋ฒˆํ˜ธ 2 ์ œ์™ธ).

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

TestcubeWithImage.fbx ์‹œ๋„
Testcube.fbx์—๋Š” ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ 404๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ํ…Œ์ŠคํŠธ์—์„œ GET ... 404 ๋ฉ”์‹œ์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ  @adam-clarey์™€ ๊ฐ™์€ ์ฝ˜์†” ์ถœ๋ ฅ์„ ์–ป์Šต๋‹ˆ๋‹ค.

BTW: Windows 10์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง„์ „...
์ด์ œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

image

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

Testcube ํŒŒ์ผ์„ webgl_loader_fbx.html ์˜ˆ์ œ๋กœ ๋Œ€์ฒดํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ(FBXLoader2.js ํŒŒ์ผ๋„ ๊ต์ฒด) ์—ฌ์ „ํžˆ ๋ชจ๋ธ์„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@adam-clarey ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๋‚ด๊ฐ€ ํ•œ ์ผ์ด๋ฉฐ(๋ฌผ๋ก  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋น„ํ™œ์„ฑํ™”) ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์—†์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๊ธฐ๊ดดํ•œ...

screen shot 2017-05-08 at 09 50 40

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด TestcubeWithImage.fbx ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•ฉ๋‹ˆ๊นŒ ( @takahirox๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด)?
์ถ”๊ฐ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
์–ด๋–ค OS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ผํ•ฉ๋‹ˆ๊นŒ?

AAHHH, ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฉ์ฒญํ•œ๊ฐ€! ์ฒซ ๋ฒˆ์งธ testcube ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์Šคํฌ๋กค์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‹ค์ˆ˜

์•ˆ๋…•ํ•˜์„ธ์š”! Autodesk์—์„œ ๋‚ด๋ณด๋‚ธ ์™ธ๋ถ€ .fbx ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

https://github.com/takahirox/three.js/blob/FixLoaderBinaryParser/examples/js/loaders/FBXLoader2.js
์ด๊ฒƒ์€ ๋งค์šฐ ์ผ์‹œ์ ์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.
์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋‹น์žฅ์€ ๊ธฐ๋Šฅ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@hmtri1011

@RicoLiu ์ด๊ฒƒ์€

๊ทธ๋ฆฌ๊ณ  THREE.FBXLoader2๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ THREE.FBXLoader2 is not a constructor ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ

image

webgl_loader_fbx.example์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. https://github.com/takahirox/three.js/blob/FixLoaderBinaryParser/examples/js/loaders/FBXLoader2.js ๋กœ๋“œ
    ํ˜„์žฌ threejs ๋ธŒ๋žœ์น˜์˜ FBXLoader2.js ๋Œ€์‹ ,
  2. THREE.FBXLoader ( ๋ฒ„์ „ ๋ฒˆํ˜ธ 2 ! ์—†์ด )๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ,
  3. (๋ชจ๋ธ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์—†๋Š” ๊ฒฝ์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋น„ํ™œ์„ฑํ™”),

์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jostschmithals ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๊ณ  ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค Zlib is not defined

๋ชจ๋ธ ํŒŒ์ผ์ด ์••์ถ•๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

image
๋‚ด๊ฐ€ ์–ป๋Š” ์ „์ฒด ์˜ค๋ฅ˜

์˜ˆ์ œ์— ์ด ์ค„์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

    <script src="js/libs/zlib_and_gzip.min.js"></script>

image
์™„๋ฃŒํ•˜๊ณ  ๋˜ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.... :(

์œ„์—์„œ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ชจ๋ธ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฝ”๋“œ(๋กœ๋”ฉ ์„น์…˜ ๋ฐ ๋ Œ๋” ๋ฃจํ”„์—์„œ)๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์žฌ๋ฃŒ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ ์ผ๋ถ€ fbx ๋ชจ๋ธ์€ ๋ Œ๋”๋ง๋˜๊ณ  ์ผ๋ถ€๋Š” ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌํ˜„ํ•˜๋ ค๋ฉด:
webgl_loader_fbx.html ์˜ˆ์ œ ํŒŒ์ผ์—์„œ init() ๋ฐ”๋กœ ๋‚ด๋ถ€์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ํ™˜๊ฒฝ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 var loadSkyDomeAndGroundBowl = function(scene, onLoad, onProgress, onError) {
                var pathtop="path/to/top.jpg";
                var pathbot="path/to/bottom.jpg";
                var radius=40;
                var bottomtopfactor=0.1;
                var sinkin=0.05;

                var texturetop;
                var texturebot;

                var onTextureLoadTop=function(texture) {
                  console.log('onTextureLoadTop');
                  texturetop=texture;
                  onTextureLoaded();
                };
                var onTextureLoadBot=function(texture) {
                  console.log('onTextureLoadBot');
                  texturebot=texture;
                  onTextureLoaded();
                };

                var onTextureProgress=function(xhr) {
                  console.log('onTextureProgress');
                  if(onProgress)
                    onProgress('Loading sky dome / ground bowl texture');
                };
                var onTextureError=function(xhr) {
                  console.log('onTextureError');
                  if(onError)
                    onError('Error loading sky dome / ground bowl texture');
                };

                var onTextureLoaded=function() {
                  console.log('onTextureLoaded');
                  if(texturetop && texturebot) {
                    console.log('onTextureLoaded 2');
                    var geometrytop = new THREE.SphereGeometry( radius*10, 600, 400, 0, Math.PI*2, 0, Math.PI*0.5);
                    var materialtop = new THREE.MeshBasicMaterial();

                    materialtop.map = texturetop;
                    materialtop.side = THREE.BackSide;
                    var skydome = new THREE.Mesh( geometrytop, materialtop );
                    skydome.position.y=bottomtopfactor*radius+sinkin;
                    scene.add( skydome );

                    var geometrybot = new THREE.SphereGeometry( radius, 60, 40, 0, Math.PI*2, Math.PI*0.5, Math.PI*0.5);
                    var materialbot = new THREE.MeshBasicMaterial();
                    materialbot.map = texturebot;
                    materialbot.side = THREE.BackSide;
                    var groundbowl = new THREE.Mesh( geometrybot, materialbot );
                    groundbowl.scale.set(1,bottomtopfactor,1);
                    groundbowl.position.y=bottomtopfactor*radius+sinkin;
                    scene.add( groundbowl );

                    if(onLoad)
                      onLoad();
                  }
                };

                var loader=new THREE.TextureLoader();
                loader.load(pathtop, onTextureLoadTop, onTextureProgress, onTextureError);
                loader.load(pathbot, onTextureLoadBot, onTextureProgress, onTextureError);
              }

๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ์Šค์นด์ด๋”๊ณผ ์ง€์ƒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์žฅ๋ฉด์ด ์ดˆ๊ธฐํ™”๋œ ํ›„ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. loadSkyDomeAndGroundBowl(scene);

์ด ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ ๋‚ด์—์„œ 2๊ฐœ์˜ fbx ๋ชจ๋ธ์ด ์ œ๋Œ€๋กœ ๋กœ๋“œ๋˜๊ณ  ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ xsi_man_skinning.fbx ์ฐธ์กฐ๋ฅผ TestcudeWithImages.fbx๋กœ ๋ฐ”๊พธ๋ฉด(์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฝ”๋“œ๋„ ์ฃผ์„ ์ฒ˜๋ฆฌ) ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ fbx ํŒŒ์ผ์—์„œ๋„ ์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ fbx ํŒŒ์ผ์€ ํ™˜๊ฒฝ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š”๊ฑด์ง€...
(์˜ˆ, ์ตœ์‹  FBXLoader2 ํŒŒ์ผ ์‚ฌ์šฉ)

์ด๊ฒƒ์€ ๋‚ด ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
`



three.js - FBXLoader ํ…Œ์ŠคํŠธ
<script src="../build/three.js"></script>

<script src="js/controls/OrbitControls.js"></script>

<script src="js/curves/NURBSCurve.js"></script>
<script src="js/curves/NURBSUtils.js"></script>
<script src="js/loaders/FBXLoader2.js"></script>

<script src="js/Detector.js"></script>
<script src="js/libs/stats.min.js"></script>
<script src="js/libs/zlib_and_gzip.min.js"></script>
<script>
    if (!Detector.webgl) Detector.addGetWebGLMessage();

    var container, stats, controls;
    var camera, scene, renderer, light;

    var clock = new THREE.Clock();

    var mixers = [];

    init();

    function init() {

        container = document.createElement('div');
        document.body.appendChild(container);

        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);

        scene = new THREE.Scene();

        // grid
        var gridHelper = new THREE.GridHelper(28, 28, 0x303030, 0x303030);
        gridHelper.position.set(0, - 0.04, 0);
        scene.add(gridHelper);

        // stats
        stats = new Stats();
        container.appendChild(stats.dom);

        // model
        var manager = new THREE.LoadingManager();
        manager.onProgress = function (item, loaded, total) {

            console.log(item, loaded, total);

        };

        var onProgress = function (xhr) {

            if (xhr.lengthComputable) {

                var percentComplete = xhr.loaded / xhr.total * 100;
                console.log(Math.round(percentComplete, 2) + '% downloaded');

            }

        };

        var onError = function (xhr) {

            console.error(xhr);

        };

        var loader = new THREE.FBXLoader(manager);
        loader.load('models/fbx/accient_2_full.fbx', function (object) {

            //object.mixer = new THREE.AnimationMixer(object);
            //mixers.push(object.mixer);

            //var action = object.mixer.clipAction(object.animations[0]);
            //action.play();

            scene.add(object);


        }, onProgress, onError);

        loader.load('models/fbx/nurbs.fbx', function (object) {

            scene.add(object);

        }, onProgress, onError);

        renderer = new THREE.WebGLRenderer();
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0x000000);
        container.appendChild(renderer.domElement);

        // controls, camera
        controls = new THREE.OrbitControls(camera, renderer.domElement);
        controls.target.set(0, 12, 0);
        camera.position.set(2, 18, 28);
        controls.update();

        window.addEventListener('resize', onWindowResize, false);

        light = new THREE.HemisphereLight(0xffffff, 0x444444, 1.0);
        light.position.set(0, 1, 0);
        scene.add(light);

        light = new THREE.DirectionalLight(0xffffff, 1.0);
        light.position.set(0, 1, 0);
        scene.add(light);

        //animate();

    }

    function onWindowResize() {

        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();

        renderer.setSize(window.innerWidth, window.innerHeight);

    }

    //

    function animate() {

        requestAnimationFrame(animate);

        if (mixers.length > 0) {

            for (var i = 0; i < mixers.length; i++) {

                mixers[i].update(clock.getDelta());

            }

        }

        stats.update();

        render();

    }

    function render() {

        renderer.render(scene, camera);

    }
</script>

`

@jostschmithals ์ด์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋˜ํ•œ ๋น„ํ™œ์„ฑํ™” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค

@adam-clarey ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ํ๋ธŒ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ํ๋ธŒ๊ฐ€ ์ง€๋ฉด ์•„๋ž˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์นด๋ฉ”๋ผ๋กœ ๊ถค๋„๋ฅผ ๋Œ๋ฉด ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ). ์ด ์™ธ์—๋„ ๋ชจ๋“  ๊ฒƒ์ด ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@takahirox :

(์ด๋ฏธ์ง€๋Š” ์ƒ๋‹จ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜์ง€๋งŒ ...)

@hmtri1011 animate() ํ•จ์ˆ˜๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฅ๋ฉด์ด ์ „ํ˜€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰

(์ด ๊ฒฝ์šฐ ์ด๋ฏธ ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ ์ค„๋งŒ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.)

@jostschmithals tks :D ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

์ข‹์€ ์žฅ์†Œ @jostschmithals , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์ด ์–ด๋–ค ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฒ„์ „์ธ์ง€ ์ค‘์š”ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๋ฒ„์ „ 7400์˜ fbx ํŒŒ์ผ์ด ์žˆ์ง€๋งŒ ๋ฒ„์ „ 7500์˜ ํŒŒ์ผ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

"FBXLoader: ์•Œ ์ˆ˜ ์—†๋Š” ์†์„ฑ ์œ ํ˜•"
์—ฌ๊ธฐ์„œ 'type' ๋ณ€์ˆ˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

@adam-clarey fbx์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ง€์‹์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋ธ ํŒŒ์ผ์— ๊ตฌ์›Œ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€/๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์„ ๋ฐœ๊ฒฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์Šค๋ ˆ๋“œ์—๋งŒ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด ์งˆ๋ฌธ์„ @takahirox์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

>=7500์˜ ์‚ฌ์–‘์ด <7500๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
>= 7500์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฒ„์ „ 7500์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„์— 7200๊ณผ 7500์ด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 6100 ๋ฐ 7300์€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
house_fs.fbx.zip
๋”์น˜ํ•˜์šฐ์Šค.FBX.zip

ASCII ๋ฒ„์ „ ํŒŒ์ผ์„ ๊ณต์œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋ฌธ์ œ๊ฐ€ ์ด์ง„ ๊ด€๋ จ ๋ฌธ์ œ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  FBXLoader ๊ฐ€ ์ด์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค(์•„์ง ์™„๋ฒฝํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ).
FBXLoader ๊ฐœ์„ ์„ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@takahirox ์ข‹์€ ์†Œ๋ฆฌ!

@adam-clarey
๋‚˜๋Š”์ด ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"FBXLoader: ์•Œ ์ˆ˜ ์—†๋Š” ์†์„ฑ ์œ ํ˜•"
์—ฌ๊ธฐ์„œ 'type' ๋ณ€์ˆ˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

FBXLoader.js์—์„œ
๋กœ ๋ณ€๊ฒฝ

            while ( ! this.endOfContent( reader ) ) {

                var node = this.parseNode( reader, version );
                if ( node !== null ) 
                    allNodes.add( node.name, node );
                else
                    break;

            }

11956

์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”,
FBXLoader๋Š” FBX ํŒŒ์ผ์ด >= 7.0์ด ๋˜๋„๋ก ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
์ด์ œ 7.0 ๋ฏธ๋งŒ์˜ fbx ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
์—ฌ๊ธฐ ๋‚ด fbx ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/nxhoang/Three.js-Fxb-and-Textures/tree/master/models/fbx
์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@nxhoang ์—ฌ๊ธฐ ์—์„œ ๋…ผ์˜ํ•œ ๋Œ€๋กœ 6100(๋ฐ”์ด๋„ˆ๋ฆฌ) ๋˜๋Š” 7000(ASCII) ์ด์ƒ์˜ FBX ๋ฒ„์ „๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ FBX ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜(์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด 3ds Max ๋˜๋Š” Maya์— ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค) ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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