FBXLoader๋ FBX ํ ์คํธ ํ์๋ง ์ง์ํฉ๋๊น?
[ ] ...
[x] ๋ชจ๋
[ ] ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ
[x] ๋ชจ๋
์. ํ์ฌ FBXLoader
๋ ๋ฒ์ 7์ ASCII ํ์๋ง ์ง์ํฉ๋๋ค.
Three.js ๋ฒ์ : r77
์์?
/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์ ํ
์คํธ ํ์ผ ๋ฒ์ ์ด ์์ต๋๊น?
๋น๊ตํ๊ณ ์ถ์ต๋๋ค.
๋ฐ์ด๋๋ฆฌ ํ์ ์งํ...
@adam-clarey
๋ชจ๋ธ์ ์คํฌ๋ฆฐ์ท์ ๊ณต์ ํ ์ ์์ต๋๊น?
ํ
์คํธ ํ์ผ๋ Three.js์ ๋ก๋ํ ์ ์์์ต๋๋ค.
๋ค๋ฅธ ๋ชจ๋ธ์ ์คํฌ๋ฆฐ์ท....
์ข์ ๋ณด์ฌ! ๐
๋ค๋ค ๊ฐ์ฌ ํด์!
์กฐ๋ง๊ฐ ์คํฌ๋ฆฐ์ท์ ์ฌ๋ ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋ด ์ฌ์ฉ ์ฌ๋ก๋ ์ฌ๋ฃ ์ด๋ฏธ์ง์ ๋ชจ๋ธ์ ๋จ์ผ ํ์ผ๋ก ๋ฌถ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์์ ๋ธ๋ ๋์์ ๋ณด์ด๋ ์ด๋ฏธ์ง์ ํจ๊ป 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์ ์คํฌ๋ฆฐ์ท:
๋ธ๋ ๋์์ ์ด๋ฆผ(๋ค๋ฅธ ๊ธฐ๊ณ์์):
๋ธ๋ ๋์์๋ ์ง๊ธ๊น์ง ๊ตฌ์ด ์ด๋ฏธ์ง๋ก FBX๋ฅผ ๋ด๋ณด๋ด๋ ์ต์ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ์๋ง๋ ์์ถํ๊ธฐ ์ ์ ๋ฒ ์ดํน์ ํด์ผ ํ์ง ์์๊น์? - ๋ฏน์๊ธฐ์ ๋ํ ๊ฒฝํ์ด ์์ต๋๋ค.
@takahirox 3ds max์์๋ ์์ฑ๋์์ง๋ง "๋ฏธ๋์ด ํฌํจ" ์ต์ ์์ด ๋ด๋ณด๋ธ ๋์ผํ ํ์ผ์ด ์์ต๋๋ค.
๋น๊ต ๋ชฉ์ ์ผ๋ก ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค.
ํ ์คํธ๋ฅผ ์ํด ๋ค๋ฅธ ํ์ผ์ด ํ์ํ๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ์ญ์์ค.
TestcubeWithImage.fbx์ Video.ID.properties.Content ์์ฑ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ฒ๋ผ ๋ณด์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ต๋๋ค.
์ด๊ฒ์ ์ด ์ค๋ ๋์ ๊ฒ์๋ ๋ค๋ฅธ ๋ฐ์ด๋๋ฆฌ ํ์ผ์๋ ์กด์ฌํ์ง ์์ต๋๋ค.
์์ธํ ๋ณผ๊ฒ์...
์งํ... ๐
์ด์ ํฌํจ๋ ํ
์ค์ฒ๊ฐ ๊ด์ฐฎ์ ๋ณด์
๋๋ค.
์ ๋๋ฉ์ด์
์ด ํฌํจ๋ ๋ฐ์ด๋๋ฆฌ fbx๋ฅผ ๊ณต์ ํ ์ ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋ค์์ ๋ค์ํ ์ข ๋ฅ์ ํคํ๋ ์ ์ ๋๋ฉ์ด์ ์ด ํฌํจ๋ 3๊ฐ์ ํ ์คํธ ํ์ผ์ ๋๋ค.
์ ๋๋ฉ์ด์
๋ฒ์ญ.zip
AnimationMorph.zip
์ ๋๋ฉ์ด์
๋ณธ์ฆ.zip
๊ทธ๋ฌ๋ ๋ถํํ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ํ์ผ์ ์์ฑํ์ง ๋ชปํ์ต๋๋ค.
๋ชจ๋ 3ds max๋ก ์ ์๋์์ต๋๋ค.
@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๊ฐ ํ์๋ฉ๋๋ค. ์ฌ์ ํ ์ ๋ ํ์ผ ๊ฒฝ๋ก์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ ํ ์คํธํ๋๋ฐ(์๋ 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์์ ํ ์คํธํ์ต๋๋ค.
์ง์ ...
์ด์ ์ ๋๋ฉ์ด์
์ด ์ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค ๐
๋ชจ๋ธ์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ ์ ์์ต๋๊น? ์ด๋ค ์ด์ ๋ก ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด๋ก๋๋์ง ์์ต๋๋ค.
Testcube ํ์ผ์ webgl_loader_fbx.html ์์ ๋ก ๋์ฒดํ๋ ค๊ณ ์๋ํ์ง๋ง(FBXLoader2.js ํ์ผ๋ ๊ต์ฒด) ์ฌ์ ํ ๋ชจ๋ธ์ ๋ ๋๋งํ์ง ์์ต๋๋ค.
@adam-clarey ๊ทธ๊ฒ ๋ฐ๋ก ๋ด๊ฐ ํ ์ผ์ด๋ฉฐ(๋ฌผ๋ก ์ ๋๋ฉ์ด์ ๋นํ์ฑํ) ๋ค๋ฅธ ๋ณ๊ฒฝ ์์ด ์๋ํ์ต๋๋ค.
์ผ๋ง๋ ๊ธฐ๊ดดํ...
๊ทธ๋ฆฌ๊ณ ๋น์ ์ด 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
์ค๋ฅ๊ฐ ๋ฐ์
webgl_loader_fbx.example์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
THREE.FBXLoader
( ๋ฒ์ ๋ฒํธ 2 ! ์์ด )๋ฅผ ์ฌ์ฉํ๊ณ ,์๋ํด์ผ ํฉ๋๋ค.
@jostschmithals ๋๋ ๋น์ ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๊ณ ์๋ก์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค Zlib is not defined
๋ชจ๋ธ ํ์ผ์ด ์์ถ๋ ๊ฒ ๊ฐ์ต๋๊น?
๋ด๊ฐ ์ป๋ ์ ์ฒด ์ค๋ฅ
์์ ์ ์ด ์ค์ ์ถ๊ฐํ์ญ์์ค.
<script src="js/libs/zlib_and_gzip.min.js"></script>
์๋ฃํ๊ณ ๋ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ํ๋ฌ์ต๋๋ค.... :(
์์์ ์ด ๊ฒ์ฒ๋ผ ์ ๋๋ฉ์ด์ ์ด ํฌํจ๋์ง ์์ ๋ชจ๋ธ ํ์ผ๊ณผ ํจ๊ป ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๋๋ฉ์ด์ ์ฝ๋(๋ก๋ฉ ์น์ ๋ฐ ๋ ๋ ๋ฃจํ์์)๋ฅผ ๋นํ์ฑํํด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ์คํ ์ฌ๋ฃ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ด ๋ฌธ์ ๋ ํน์ ์กฐ๊ฑด์์ ์ผ๋ถ 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 ํ์ผ ์ฌ์ฉ)
์ด๊ฒ์ ๋ด ์์ ์ฝ๋์
๋๋ค.
`
<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;
}
์ฌ๋ฌ๋ถ, ์๋
ํ์ธ์,
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์ ๋ก๋ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค) ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
4์๋ถํฐ FBX ๋ฐ์ด๋๋ฆฌ ํ์ ์์ ์ ๋ค์ ์์ํ๊ฒ ์ต๋๋ค.
๋๊ตฐ๊ฐ ์๋๋ฅด๋ฉด LMK.