本日はMRMT枠です。
〇MRMTとは?
MixedRealityModelingToolsは筆者が開発しているBlenderのアドオンと、UnityやUE5などMixedRealityアプリケーション内で連携させることができるパッケージで構成されるソリューションです。
〇データ形式と判別
前回はBlenderからUnityに対してイメージデータを送信しました。
今回はここで送信されてUnity側で受信したデータをもとにイメージデータにデコードしていきます。
Blender側では次のようなバイナリが送信されています。
\x83\xa6header\xa4IMGE\xa9imagename\xd9!istockphoto-610545962-170667a.jpg\xa9imagedata\xdb\x00\x01F\xac/9j/4AAQSkZJRgABAQEBLAEsAAD・・・f//Z
Headerとして埋め込んだIMGEによって画像データと識別させistockphoto-610545962-170667a.jpgで画像名、そして画像本体データを送信しています。
Unity側で受け取ったデータはヘッダー情報を読み解いて、そのデータに合わせてデシリアライズを実行しています。
private void ProcessReceivedData(byte[] data, int length)
{
// Get the header from the received data
string header = Encoding.ASCII.GetString(data, 9, 4);
Debug.Log(header);
if (header == "MESH")
{
// Mesh data received
・・・
}
else if (header == "MATE")
{
・・・
}
else if (header == "IMGE")
{
Debug.Log("IMGE");
var imageData = DeserializeImageData(data, length);
_objectBuilder._ImageData = imageData;
_objectBuilder._isGetImageData = true;
Debug.Log($"Received image data: {imageData.imagename}");
}
else
{
Debug.Log($"Received unknown data with header: {header}");
}
}
イメージデータとして処理をする際のフォーマットは次のように定義しています。
これはBlender側でシリアライズするのと同様になっています。
[DataContract]
public class ImageData
{
[DataMember] public string header;
[DataMember] public string imagename;
[DataMember] public string imagedata; // Base64 encoded image data
// Add a property to convert Base64 string to byte[]
public byte[] ImageBytes => System.Convert.FromBase64String(imagedata);
}
画像データ自体はBase64のバイトなので、string型で定義し実態としてImageBytesとしてコンバートしています。
〇データをテクスチャに変換するメソッド
今回はMRMTでオブジェクトを構築するObjectBuilderコンポーネントに次の関数を実装しています。
public void CreateTexture()
{
Texture2D texture = new Texture2D(1, 1); // 仮のサイズを指定
byte[] decodedBinaryData = _ImageData.ImageBytes;
texture.LoadImage(decodedBinaryData); // バイト配列をTexture2Dに読み込む
texture.name = _ImageData.imagename;
// テクスチャをミップマップを含まないように設定(オプション)
texture.filterMode = FilterMode.Bilinear;
texture.wrapMode = TextureWrapMode.Clamp;
_debugMaterial.mainTexture = texture;
_blenderTexture.Add(texture);
if (_blenderMat.Count > 0)
{
//Debug
_blenderMat[0].mainTexture = texture;
}
}
Unityではテクスチャを扱う場合Texture2D型を使用します。
初期化したTexture2Dにバイナリを読み込ませるためにはTexture2D.LoadImage()メソッドを使用します。
texture.LoadImage(decodedBinaryData);
これによってUnity側で画像を取得することができました。


本日は以上です。