私は現在、Blender のエクスポート スクリプトに取り組んでいますが、私の質問は一般的に Python に基づいていると感じているので、ここに投稿しました。
友人が .obj ファイル用に Java で変換プログラムを作成しました。これにより、.obj ファイルはカスタム バイナリ ファイル形式に変換されます。ただし、そのプロセスをスキップして、バイナリ ファイルを Blender から直接エクスポートしたいと考えています。
このファイルには、utf-8、utf-16、および utf-32 形式を使用したテキスト、整数、浮動小数点数が含まれています。
これまでのところ、すべてのデータを標準のテキスト ファイルとしてエクスポートしているため、適切なエンコーディング/フォーマットで出力する必要があります。これは、さまざまなエンコーディングでファイルにデータを書き込むために Java で使用しているコードです。
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class StreamConverter {
//---------------------------------------------------
public static void buffer_write_string(DataOutputStream out,String text) throws IOException{
byte[] bytes = text.getBytes();
for(int i =0;i<text.length();i++){
buffer_write_u8(out,bytes[i]);
}
}
public static void buffer_write_u32(DataOutputStream out,int i) throws IOException{
ByteBuffer b = ByteBuffer.allocate(4);
b.order(ByteOrder.LITTLE_ENDIAN);
b.putInt(i);
out.write(b.array());
}
public static void buffer_write_u16(DataOutputStream out,int i) throws IOException{
out.write((byte) i);
out.write((byte) (i >> 8));
}
public static void buffer_write_s16(DataOutputStream out,int i) throws IOException{
out.write((byte) i);
out.write((byte) (i >> 8));
}
public static void buffer_write_s32(DataOutputStream out,int i) throws IOException{
ByteBuffer b = ByteBuffer.allocate(4);
b.order(ByteOrder.LITTLE_ENDIAN);
b.putInt(i);
out.write(b.array());
}
public static void buffer_write_u8(DataOutputStream out,int i) throws IOException{
out.writeByte((byte) i);
}
public static void buffer_write_s8(DataOutputStream out,int i) throws IOException{
out.writeByte((byte) i);
}
public static void buffer_write_f64(DataOutputStream out,double i) throws IOException{
ByteBuffer b = ByteBuffer.allocate(8);
b.order(ByteOrder.LITTLE_ENDIAN);
b.putDouble(i);
out.write(b.array());
}
public static void buffer_write_f32(DataOutputStream out,float i) throws IOException{
ByteBuffer b = ByteBuffer.allocate(4);
b.order(ByteOrder.LITTLE_ENDIAN);
b.putFloat(i);
out.write(b.array());
}
}
これを行う方法がPythonであるかどうかはわかりません。少なくとも整数を正しく出力できるかどうかを確認しようとしていますが、うまくいきません。
def write_u8(file, num):
enum = num.encode('utf-8')
file.write(enum)
def write_u16(file, num):
enum = num.encode('utf-16')
file.write(enum)
def write_u32(file, num):
enum = num.encode('utf-32')
file.write(enum)
使用例:
write_u32(file, u'%i' % (vertex_count))
これも試しました:
counts = bytes([vertex_count,tex_count,normal_count])
file.write(counts)
このバイナリ/エンコーディング全体で少し迷っています。Pythonのドキュメントを読みましたが、役に立ちませんでした。
チュートリアルや例へのリンクは素晴らしいでしょう!