3ํธ์ ๊ฐ์ด๋ ํค์ด ์ ์์ ๋ํ ๋ด์ฉ์ ๋๋ค. ์ด๋ฒ ํธ์ Groom Exporter ์ ๋์จ์ ์ฝ๊ฐ์ ์ค๋ฅ๊ฐ ์์ด์ ์ง์ ์์ ์ ํด์ฃผ๋ ๋ถ๋ถ์ด ์์ด์ ์ฝ๊ฐ ๋์ด๋๊ฐ ์ฌ๋ผ๊ฐ ์ ์์ต๋๋ค. (v0.1.3 ๊ธฐ์ค/์ดํ์ ๋ฒ์ ์ ์ค๋ฅ๋ฅผ ์์ ํ ํจ์น ๋ฒ์ ์ผ ์ ์์ต๋๋ค.)
์ ๋์จ ์์ ํ๊ธฐ
๋ธ๋ ๋๋ฅผ ์คํํ๊ณ Scripting ์ํฌ์คํ์ด์ค๋ก ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ฐ ํ์๊ธฐ๋ฅผ ์ด๊ณ ์ฃผ์์ฐฝ์ %appdata%๋ฅผ ์ ๋ ฅํฉ๋๋ค. Blender Foundation\Blender\(๋ธ๋ ๋ ๋ฒ์ )\addons\GroomExporter ๊ฒฝ๋ก๋ก ์ด๋ํฉ๋๋ค.
AlembicGroomExporter.py ํ์ผ์ ๋ธ๋ ๋์ ํ
์คํธ ์๋ํฐ๋ก ๋๋๊ทธํ์ฌ ์ฝ๋๋ค. ๊ทธ๋ฆฌ๊ณ 140~155๋ฒ์งธ ์ค์ ์๋์ ์คํฌ๋ฆฝํธ๋ก ๋์ฒดํฉ๋๋ค. ์์ ํ ๋จ์ถํค Alt+S๋ฅผ ๋๋ฌ์ ํ์ผ์ ์ ์ฅํฉ๋๋ค. (๋ธ๋ ๋๋ ๋ซ์๋ ์ข์ต๋๋ค.)
att_guide_prop, att_guide_valid = op.getAttribute(attributes_dict, groomProperty.att_groom_guide, data_curves_attributes[0], ["INT", "INT8"])
att_id_prop, att_id_valid = op.getAttribute(attributes_dict, groomProperty.att_groom_id, data_curves_attributes[0], ["INT", "INT8"])
att_closest_guide_prop, att_closest_guide_valid = op.getAttribute(attributes_dict, groomProperty.att_groom_closest_guides, data_curves_attributes[0], ["BYTE_COLOR"])
att_guide_weights_prop, att_guide_weights_valid = op.getAttribute(attributes_dict, groomProperty.att_groom_guide_weights, data_curves_attributes[0], ["FLOAT_VECTOR"])
num_point = 0
for num_curveslice in range(num_data_curves):
data_curve_points = data_curves[num_curveslice].points # curveslices points
numVerts[ num_curveslice] = len( data_curve_points )
out_uvs[ num_curveslice] = op.getAttributeValue(att_surface_uv_valid, att_surface_uv_prop, num_curveslice, "FLOAT2", uv_flip=prop_uv_flip)
#specialized case
out_guide[ num_curveslice] = op.getAttributeValue(att_guide_valid, att_guide_prop, num_curveslice, "INT")
out_id[ num_curveslice] = op.getAttributeValue(att_id_valid, att_id_prop, num_curveslice, "INT")
out_closest_guide[ num_curveslice] = op.getAttributeValue(att_closest_guide_valid, att_closest_guide_prop, num_curveslice, "BYTE_COLOR")
out_guide_weights[ num_curveslice] = op.getAttributeValue(att_guide_weights_valid, att_guide_weights_prop, num_curveslice, "FLOAT_VECTOR")
์์ ํ๊ธฐ ๊ท์ฐฎ์ ๋ถ๋ค์ ์ํด ํ์ผ์ ์ฌ๋ ค๋์ต๋๋ค.(v0.1.3์์๋ง ์ฌ์ฉ ๊ถ์ฅ)
๊ฐ์ด๋ ํค์ด ๋ง๋ค๊ธฐ
๋ธ๋ ๋์์ ์ธ๋ฆฌ์ผ ์์ง ๊ทธ๋ฃธ์ ๊ฐ์ด๋ ํค์ด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ฌด๋ฐ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์๋ ฅ์ ๋ฐํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ์ต๋๋ค. ์ด ๋ฐฉ๋ฒ๋ง์ด ์ ๋ต์ ์๋๋, ์ด ๊ธ์ ์ฝ๊ณ ๊ณ์๋ ์ฌ๋ฌ๋ถ๋ค๋ ์์๋ ฅ์ ๋ฐํํด๋ณด์ธ์^^
์ฐ์ , ๊ฐ์ด๋ ํค์ด๋ ๋ณธ๋์ ํค์ด์ ๋ณ๊ฐ์ ์กด์ฌ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ธ๋ฆฌ์ผ ์์ง์์ ์๋ ๊ฐ์ด๋ ํค์ด ์์คํ ๋ ์๋ณธ ํค์ด์ ์ผ์ ํผ์ผํฐ์ง๋ฅผ ์ํ๋ก ๋ณต์ฌํ์ฌ ๊ฐ์ด๋ ํค์ด๋ก ์ง์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ธ๋ ๋์์๋ ํค์ด ์ค๋ธ์ ํธ๋ฅผ ๋ณต์ฌํ์ฌ ์ํ๋ ๊ฐ์ด๋ ํค์ด์ ๊ฐ๋ฅ๋ง ๋จ๊ฒจ ๋๊ณ ๋๋จธ์ง๋ ์ง์๋๋ค. ํน์ํ ๊ฒฝ์ฐ์๋ ๊ฐ์ด๋ ํค์ด๋ฅผ ์ง์ ์ ์ํด ์ค ์๋ ์์ต๋๋ค. (๋๊ธฐ๋จธ๋ฆฌ์ ๊ฐ์ ์คํ์ผ์ ์ ํฉ)
์๋ ์์ ๋ ์ผ๊ณฑ ๊ฐ๋ฅ์ ์๋ณธ ํค์ด์ ๋๋ค.
์ด ์ค๋ธ์ ํธ๋ฅผ ๋ณต์ฌํ๊ณ ๋ ๊ฐ๋ฅ๋ง ๋จ๊ธฐ๊ณ ์ง์ ์ต๋๋ค. ๊ฐ์ด๋๋ก ์ฌ์ฉํ ๋ณต์ฌํ ์ค๋ธ์ ํธ๋ ์๊ฐ์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํด ์ง์ค๋ฉํธ๋ฆฌ ๋
ธ๋๋ฅผ ์กฐ๊ธ ๋ง์ ธ์คฌ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ดํธ๋ฆฌ๋ทฐํธ ์ฐฝ์์ ์ถ๊ฐ ๋ฒํผ์ ๋๋ฅด๊ณ Spline/Integer ํ์์ ์ปค์คํ
์ดํธ๋ฆฌ ๋ทฐํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ฐ์ด๋๋ผ๋ ๊ฒ์ ํ๊ธฐํ๊ธฐ ์ํด ์ ๋ ์ด๋ฆ์ guide๋ก ์ค์ ํ์ต๋๋ค.
๊ทธ๋ค์ ์ง์ค๋ฉํธ๋ฆฌ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ณ ์๋ ์ด๋ฏธ์ง์ฒ๋ผ ๋
ธ๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์ธ๋ฆฌ์ผ ์์ง์ด ๊ฐ์ด๋๋ผ๋ ๊ฒ์ ํ์ธํ๊ธฐ ์ํด Value์ 1์ ์
๋ ฅํฉ๋๋ค.
์ด์ ์ต์คํฌํธ ์ธํ
์์
๋ง ๋จ์์ต๋๋ค. ์ต์คํฌํธ์ฉ์ผ๋ก ๋น ํค์ด ์ค๋ธ์ ํธ๋ฅผ ํ๋ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์ง์ค๋ฉํธ๋ฆฌ ๋
ธ๋๋ฅผ ์ถ๊ฐํ์ฌ ์๋ณธ ํค์ด์ ๊ฐ์ด๋ ํค์ด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (์์์์๋ ์๋ณธ ์ผ๊ณฑ ๊ฐ๋ฅ๊ณผ ๊ฐ์ด๋ ๋ ๊ฐ๋ฅ์ ํฉํ์ฌ ์ด ์ํ ๊ฐ๋ฅ์ด ๋ค์ด๊ฐ ์์ต๋๋ค.)
์ต์คํฌํธ์ฉ ์ค๋ธ์ ํธ์๋ ์๋ณธ ํค์ด ์ค๋ธ์ ํธ์ ๊ฐ์ด๋ ํค์ด ์ค๋ธ์ ํธ์์ ์ฌ์ฉํ๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋๊ฐ์ด ์ธํ
ํฉ๋๋ค. Groom Exporter ์ ๋์จ์์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํจ๊ป ๋ด๋ณด๋ผ ์ ์๊ฒ ๋ง๋๋ ์์
์
๋๋ค. ์์ ์์๋ ๊ฐ์ด๋ ํค์ด๋ฅผ ์ํ "guide" ์ดํธ๋ฆฌ๋ทฐํธ๋ง ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ต์คํฌํธ์ฉ ์ค๋ธ์ ํธ์๋ "guide" ์ดํธ๋ฆฌ๋ทฐํธ๋ง ๋ง๋ค์์ต๋๋ค.
์์
์ด ์๋ฃ๋์์ผ๋ฉด Groom Exporter ์ ๋์จ์ ์ด์ฉํ์ฌ Groom_guide์ "guide" ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ง์ ํ๊ณ ์๋ ๋น
(Alembic) ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
์ธ๋ฆฌ์ผ ์์ง์์ ์ํฌํธํ๋ฉด ๊ฐ์ด๋๊ฐ ์ ์์ ์ผ๋ก ๋ค์ด์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.