最初に
点群データを扱う研究をしてたので,3Dキャラクターの点群データもほしいと思ってやりました.
Unityも久しぶりに使うのであまり詳しくないです.
最終的には頂点数*次元数の行列を得ます.
参考にした記事 : http://backbone-studio.com/brog-unity01/
Unityちゃん
Asset StoreからUnityちゃんをダウンロードし,unitychan.prefabをHierarchyビューにドラッグ&ドロップします.
unitychan.prefabの構造を眺めてみると以下のようになっています.
mesh_rootという空オブジェクトの子オブジェクトにそれぞれのパーツが入っており,それぞれにSkinned Mesh Rendererという頂点情報が乗ったメッシュがアタッチされています.
ここから取得するとよさそうです.
コード
以下のコードを書きます.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChildAccess : MonoBehaviour {
public string filename = "test";
void Start () {
// 頂点数を数える
int vtx_num = 0;
foreach(Transform child in gameObject.transform){
SkinnedMeshRenderer skin = child.GetComponent<SkinnedMeshRenderer>();
vtx_num += skin.sharedMesh.vertices.Length;
}
Vector3[] vtx_posi_array = new Vector3[vtx_num];
// 頂点座標を取得
int count = 0;
foreach(Transform child in gameObject.transform){
SkinnedMeshRenderer skin = child.GetComponent<SkinnedMeshRenderer>();
Mesh child_mesh = skin.sharedMesh;
for(int i = 0; i < child_mesh.vertices.Length; i++){
float x = child_mesh.vertices[i].x;
float y = child_mesh.vertices[i].y;
float z = child_mesh.vertices[i].z;
vtx_posi_array[count] = new Vector3(x, y, z);
count++;
}
}
// csvファイルに書き込む
try{
filename = filename + ".csv";
bool append = false;
using(var sw = new System.IO.StreamWriter(@filename, append))
{
for(int i = 0; i < vtx_posi_array.Length; ++i){
sw.WriteLine("{0},{1},{2}", vtx_posi_array[i].x, vtx_posi_array[i].y, vtx_posi_array[i].z);
}
}
}
catch(System.Exception e)
{
Debug.Log(e.Message);
}
}
void Update () {
}
}
簡単に説明すると,mesh_rootの子オブジェクトを順番に走査しつつ頂点座標を取得.座標の配列に格納して,最後csvファイルで出力します.
このファイルをmesh_rootにアタッチして実行するだけです.最終的には11407*3の行列が取得できます.
おわりに
本当は頂点の色情報も加えて頂点数*(次元数+3色)の行列を得たかったんですが,上手くできませんでした.
なにか別の方法を試してもよさそうです.
あと他の3Dモデルもこのような構造だとこのファイル使い回せるんですがどうなんでしょう.
© UTJ/UCL