[PYTHON] Rendu Blender et exportation FBX automatiquement par Git Hook

introduction

Cet article est le deuxième jour du Calendrier de l'Avent 2019 du Mie University Computational Research Institute.

Lors du développement de jeux en cercle, j'ai également géré la version des données de modèles 3D créées par Blender avec Git. Pour utiliser les fichiers Blender dans le développement de jeux, il est pratique d'utiliser celui exporté vers FBX.

Par conséquent, en utilisant une fonction appelée Git Hook cette fois, ** le rendu d'image pour les vignettes ** et ** l'exportation FBX ** sont automatiquement exécutés lorsque Git Push est exécuté.

Cela permettait non seulement d'automatiser le travail, mais présentait également l'avantage de ** éliminer les erreurs dans les paramètres d'export FBX ** et de ** ne pas oublier de mettre à jour le fichier FBX lors de l'édition du fichier Blend **.

Cette fois, je présenterai Git Hook et le travail pour effectuer une exportation automatique avec Blender.

Qu'est-ce que Git Hook

C'est une fonctionnalité standard de Git qui vous permet d'exécuter des scripts lorsque vous effectuez une tâche Git spécifique.

En tant que type

Etc.

Avec ces,

Peut être fait.

Il y a aussi un côté serveur, mais cette fois nous utiliserons ** pre-push ** côté client afin qu'il puisse être automatiquement rendu et exporté lorsque Git Push est exécuté.

Que réaliser cette fois

Dans la branche de développement, placez automatiquement le fichier Blend et Git Push

Sera fait.

La structure de répertoire attendue est la suivante.

<Développer une branche avant Push>

├─Scripts :Placez des scripts pour le rendu automatique et l'exportation FBX. Le contenu spécifique sera décrit plus loin.
└─ProjectName
    │
    ├─blend :Répertoire pour placer le fichier blend
    │  │ aaa.blend
    │  │ bbb.blend
    │  │ ccc.blend
    │
    └─Textures :Répertoire pour mettre de la texture

<Développer branche après push>

├─Scripts
└─ProjectName
    │  aaa.fbx : [Généré automatiquement]blend/aaa.Exportation FBX du mélange
    │  bbb.fbx : [Généré automatiquement]blend/bbb.Exportation FBX du mélange
    │  ccc.fbx : [Généré automatiquement]blend/ccc.Exportation FBX du mélange
    │
    ├─blend 
    │  │ aaa.blend
    │  │ bbb.blend
    │  │ ccc.blend
    │
    ├─image : [Généré automatiquement]Répertoire dans lequel l'image rendue est placée
    └─Textures :Répertoire pour mettre de la texture

<Branche principale après poussée>

└─ProjectName
    │  aaa.fbx 
    │  bbb.fbx 
    │  ccc.fbx 
    │
    └─Textures

Placez le fichier de fusion et le fichier de texture dans la branche de développement et poussez-le. Rendu automatiquement, généré par FBX, Découvrez les fichiers FBX et texture à maîtriser.

Environnement de développement

Cette fois sur Windows 10

Je l'ai fait à.

Procédure de travail

1. Passer le chemin à travers Blender

Commencez par passer le chemin via Blender.exe. Ajoutez le répertoire d'installation de Blender à la variable d'environnement Path. Si vous avez téléchargé le programme d'installation à partir du site officiel de Blender et que vous l'avez installé, "C:\Program Files\Blender Foundation\Blender" Sera le répertoire d'installation.

Comment modifier les variables d'environnement https://qiita.com/sta/items/6d29da0dc7069ffaae60 Je pense que ce sera utile.

2. Script pour le rendu

Ensuite, enregistrez le contenu suivant dans Scripts / render.py en tant que script pour le rendu.

import bpy

bpy.context.scene.render.resolution_x = 1920
bpy.context.scene.render.resolution_y = 1080
bpy.context.scene.render.resolution_percentage = 25

path = bpy.context.blend_data.filepath.rstrip(bpy.path.basename(bpy.context.blend_data.filepath)) + "../image/" +  bpy.path.basename(bpy.context.blend_data.filepath).split(".")[0] +".png "
bpy.data.scenes["Scene"].render.filepath = path

bpy.ops.render.render( write_still=True )

En conséquence, s'il s'agit de blend / aaa.blend, le résultat du rendu sera enregistré dans image / aaa.png.

Puisque cette fois, il est rendu pour les images miniatures, la résolution est spécifiée comme 25% de 1920x1080.

3. Script pour l'exportation FBX

Ensuite, en tant que script pour l'exportation FBX, enregistrez-le dans Scripts / ExportFBX.py avec le contenu suivant.

import bpy,sys

def fbx_export_geometry(arg_filepath='./export.fbx'):
  bpy.ops.export_scene.fbx(
    filepath=arg_filepath,
    object_types={'ARMATURE', 'MESH'},
    bake_anim=False,
  )
  #Type de cible de sortie
  #  'EMPTY': Vide
  #  'CAMERA':caméra
  #  'LAMP':lampe
  #  'ARMATURE': Armature
  #  'MESH':engrener
  #  'OTHER': Autre
  return

#Exécution de la fonction
path = bpy.context.blend_data.filepath.rstrip(bpy.path.basename(bpy.context.blend_data.filepath)) + "../" +  bpy.path.basename(bpy.context.blend_data.filepath).split(".")[0] +".fbx"
fbx_export_geometry(path)

Cela exportera FBX vers aaa.fbx s'il s'agit de blend / aaa.blend.

Aussi, ici je suis FBX exportant uniquement des armatures et des maillages, à l'exclusion des caméras et des lampes.

4. Script pour appeler deux scripts Python

Maintenant, préparez un script pour appeler ces deux scripts Python.

Enregistrez-le dans Scripts / convert.sh avec le contenu suivant.

#!/bin/bash

log=$(pwd)/gitPush.sh.log

echo "[$(date)] start" >> $log

echo "[Messeage by convert.sh]cd git top level dir(" `git rev-parse --show-toplevel` ")"
cd  `git rev-parse --show-toplevel`

for raw in $(git log origin/develop..develop --stat | grep ".blend") ; do
	if [ ${raw##*.} = "blend" ]; then
		echo "[Messeage by convert.sh] blend file is ${raw}"
		echo "[Messeage by convert.sh] Start Render.py"
		blender --background ${raw} --python Scripts/Render.py
		echo "[Messeage by convert.sh] Start ExportFBX.py"
		blender --background ${raw} --python Scripts/ExportFBX.py
	fi	
done
echo '[Messeage by convert.sh] git commit -m "Auto Generate FBX/render image"'
git add *.fbx
git add *.png
git commit -am "Auto convert FBX and render image"

Il y a une ligne d'écho pour le journal, mais le contenu est

  1. Accédez au répertoire de niveau supérieur de Git
  2. Obtenez le nom du fichier de fusion modifié dans le journal git
  3. Exécutez le rendu d'image (Render.py) et l'exportation FBX (ExportFBX.py) sur le fichier de fusion avec les modifications.
  4. git add le fichier FBX et l'image PNG rendue
  5. git commit

Il est devenu.

Paramètres pré-push de Git Hook

Enfin, laissez Git Hook pré-pousser exécuter le script que vous avez créé jusqu'à présent.

Il y a un répertoire .git dans le dépôt Git, mais enregistrez le script shell dans .git / hooks / avec le nom de fichier "pre-push". Ensuite, ce script sera exécuté juste avant l'exécution de Git Push.

Vous pouvez mettre le fichier directement ici, mais comme .git / hooks / n'est pas sous surveillance Git, j'ai mis un lien symbolique et j'ai travaillé dessus.

À propos, comment coller un lien symbolique dans PowerShell de Windows est la commande ci-dessous.

New-Item -Type SymbolicLink .git/hooks/pre-push -Value Scripts/hooks/pre-push

Enregistrez le fichier pré-push avec le contenu suivant.

#!/bin/sh

remote="$1"
url="$2"
z40=0000000000000000000000000000000000000000
 
while read local_ref local_sha remote_ref remote_sha
do
	if [[ "${remote_ref##refs/heads/}" = "develop" ]]; then
		`git rev-parse --show-toplevel`/Scripts/convert.sh
		git checkout master
		git checkout develop `git rev-parse --show-toplevel`'/ProjectName/*.fbx'
		git checkout develop `git rev-parse --show-toplevel`'/ProjectName/Textures/*'
		git commit -m "[Auto commit] Add FBX from develop"

		git checkout develop
		git push origin master
	fi
done

  1. Découvrez si la branche sur laquelle vous travaillez est en développement
  2. Exécutez <répertoire de niveau supérieur de Git> / Scripts / convert.sh. (Le rendu automatique et l'exportation FBX sont effectués ici)
  3. Extrayez le fichier de texture et le fichier FBX généré automatiquement dans la branche Master
  4. maître git commit
  5. Maîtrisez git push

Ce sont les contenus tels que.

Avec ce qui précède, poussez simplement le fichier Blend et la texture dans la branche de développement, et cela se fera automatiquement.

Sera fait.

à la fin

Cette fois, j'ai essayé d'utiliser Git Hook pour créer un système qui met automatiquement à jour le FBX lorsque le fichier de fusion est mis à jour.

Au début, j'essayais des actions GitHub en pensant que j'avais besoin de CI / CD ... mais quand j'étais inquiet parce que j'avais besoin d'un GPU côté serveur lors du rendu avec Blender, j'étais inquiet pour Git Hook A été présenté.

En conséquence, je pense que nous avons réalisé ce que nous voulions faire, et maintenant nous avons un système compact qui est complété côté client.

J'ai également essayé d'utiliser le script Blender Python pour la première fois pour l'appeler avec Git Hook, mais cela élimine l'erreur de réglage du rendu et de l'exportation FBX, en particulier lorsque la lampe et la caméra sont incluses par erreur dans l'exportation FBX et qu'elles sont lues par Unity. Le problème de devenir fou est parti.

Jusqu'à présent, il n'y avait pas beaucoup de motivation pour l'automatisation, mais c'était une bonne occasion de tirer un certain nombre d'avantages de l'automatisation.

Git Hook a plusieurs autres synchronisations d'allumage, je voudrais donc l'utiliser de manière pratique.

Les références

Recommended Posts

Rendu Blender et exportation FBX automatiquement par Git Hook
Distribution HDA de Houdini pour exporter FBX avec hiérarchie et transformations
Rechercher et télécharger automatiquement des vidéos YouTube avec Python
Obtenez le nom de la branche git et le nom de la balise avec python