[일단 박죠] NVDIA의 GET3D를 활용한 아바타 자동 생성 #7

jeyong·2023년 8월 8일
0
post-custom-banner

1. 데이터 찾아보기

여러사이트를 돌아다니며 사람이 T자로 서있는 데이터를 찾으려고 노력해보았다.
그 결과 24개의 데이터를 더 구할 수 있었다.

하지만 해당 데이터는 아래와 같이 mtl 파일이 아닌 jpg 파일에 색상정보를 저장하고 있었다.
그래서 obj + mtl 파일을 렌더링 하는 코드로 렌더링 할 시 색상 정보가 나오지 않는 문제가 발생한다. 그래서 코드를 obj + jpg 형식으로 수정해야한다.

2. obj + mlt -> obj + jpg

전체 코드를 다 담기엔 너무 크니, 핵심 코드만 기록하겠다.

1. 파일명 저장

jpg 파일의 형식이 "tex-폴더명.jpg" 인 것을 이용하여 해당 jpg 파일명을 저장한다.

folder_name = os.path.basename(os.path.dirname(args.obj))
texture_file_name = 'tex-' + folder_name + '.jpg'
texture_filepath = os.path.join(os.path.dirname(args.obj), texture_file_name)

2. 텍스처 이미지 로드

bpy.data.images.load(texture_filepath)를 사용하여 텍스처 파일을 Blender에 로드한다.
이렇게 로드된 이미지는 img 변수에 저장한다.

img = bpy.data.images.load(texture_filepath)

3. 머티리얼 생성:

bpy.data.materials.new('TexMat')를 사용하여 새로운 머티리얼을 생성한다. 이 머티리얼은 mat 변수에 저장한다.

mat = bpy.data.materials.new('TexMat')

4. 노드 사용 활성화:

Blender의 머티리얼 시스템은 "노드" 기반이다. 각 머티리얼은 여러 노드로 구성될 수 있으며, 이 노드들은 서로 연결되어 복잡한 텍스처나 쉐이더 효과를 만든다.
mat.use_nodes = True를 설정하여 이 머티리얼에서 노드 사용을 활성화한다.

mat.use_nodes = True
bsdf = mat.node_tree.nodes["Principled BSDF"]

5. 텍스처 노드 생성 및 연결:

ShaderNodeTexImage 노드를 생성하여 머티리얼에 텍스처 이미지를 연결한다. 그런 다음, 이 텍스처 노드의 출력을 머티리얼의 'Base Color' 입력에 연결하여 텍스처가 머티리얼에 표시되도록 한다.

texImage = mat.node_tree.nodes.new('ShaderNodeTexImage')
texImage.image = img
mat.node_tree.links.new(bsdf.inputs['Base Color'], texImage.outputs['Color'])

6. 머티리얼 오브젝트에 할당:

마지막으로, 이 머티리얼을 오브젝트에 적용한다. 오브젝트에 이미 머티리얼 슬롯이 있으면 해당 슬롯에 머티리얼을 할당하고, 없으면 새로운 슬롯을 생성하여 머티리얼을 할당한다.

if obj.data.materials:
    obj.data.materials[0] = mat
else:
    obj.data.materials.append(mat)

나머지 부분은 fbx 변환 코드와 같다.

3. 렌더링 된 결과

아래 사진처럼 기존 모델과 추가된 모델이 잘 렌더링 된 모습을 볼 수 있다.

아래는 추가된 모델의 렌더링 결과이다.

조금 더 자세히 보자

렌더링이 잘 된 모습을 볼 수 있다.

이제 렌더링된 사진들을 가지고 학습을 시켜보겠다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글