well i try to explain how i did it:
first i saw fatducks description on xantax.
than i took a language of my choice (i took python, but it does not matter..)
and read in the .o3d file like its said by fatduck..
eg.
Code:
--------------
Header section
--------------
byte uknCount1
struct uknData1 {
byte
} uknData1[uknCount1]
dword ?? //always 0x15
first you read 1 Byte to get uknCount1.
than you read ukCount1 times another byte..
dword = 4 bytes so you read next 4 bytes..
than you have to look what stuff you need..
to convert into OBJ you need only vertices, normals, UVs and Face index..
the other stuff gets just read into a variable, the needed stuff is also saved in a variable, but written to to file later..
of course it lots of work with hex editor to understand whats there, and if converting fails to see why it fails.. (there are some additions to fatducks description, i guess he only looked at those files he got sent, but respect to him, without his work i was not able to make a converter)
for converting back its a bit harder, because as i said OBJ only has some values, but o3d needs more..
i hope that helps, if something is not clear, please ask.