Page 1 of 1

CMOD structure

Posted: 25.09.2012, 14:50
by Chuft-Captain
I would like to rotate a single mesh (through 45 degrees) in a CMOD model.

Obviously, if I could convert the CMOD and make the modification in for example Anim8tor, that would be the easiest way to approach it.
But, as far as I know, there's no tools out there to convert CMOD's into 3ds or any other format that can be loaded into a modelling tool. (The only tool I'm aware of that loads CMOD's is Chris' cmodview utility).
(If anyone knows of a [ CMOD -> other modelling format ] conversion utility, then please let me know, and the remainder of this post will then become moot. :) )

Assuming there is no such tool, then that option's not available.
So, as it's such a simple transformation, I thought I would tackle it by editing the ascii CMOD directly and applying a little simple trigonometry to selected vertices.

There's quite a good Backus Naur description of the CMOD structure here: http://www.lns.cornell.edu/~seb/celestia/cmod_format.html, however, it doesn't document exactly what the eight values of each vertex represents.
All it has on this aspect is:

Code: Select all

              <vertex_pool>         ::= vertices <count>
                                         { <float> }

(I'm assuming that we're dealing with a -1 to +1 normalized 3D space and that the X,Y,Z coordinates of each vertex is represented by at least 3 of those values. )

The question I have though, is:
Which of the eight values represents the X, Y, and Z positions respectively? Here's the very simple example used in that WIKI page:

Code: Select all

mesh
vertexdesc
position f3
normal f3
texcoord0 f2
end_vertexdesc

vertices 6
0 0 0 0 0 1 0 0
1 1 0 0 0 1 1 1
0 1 0 0 0 1 0 1
0 1 0 0 0 -1 0 1
1 1 0 0 0 -1 1 1
0 0 0 0 0 -1 0 0

trilist 0 3
0 1 2
trilist 1 3
3 4 5

end_mesh


In order to do the transform, I need to know which values represent which axis.
If I want to rotate in the Z-axis (X-Y plane) then I only need to modify the X and Y values, if in the X-axis, then only the Y-Z values are modified,.. etc...
(I'm assuming that I won't have to make any changes to the trilists.)

Can anyone elaborate on the definitions of these 8 attributes? (and incidentally, why are there 8, rather than just 3?.. what do the other 5 represent?)

Cheers
CC

Re: CMOD structure

Posted: 25.09.2012, 19:23
by selden
Sorry: I dunno which coordinate is supposed to be which axis. I usually modify the rotation code in my CMOD generation programs until the object is oriented the way "it should be" in Celestia.

The uses of the values are specified by the vertexdesc block which is included in your example above. It specifies what values are being provided and their order.
vertexdesc
position f3 # position of vertex in 3-space [in the model's own coordinate system]
normal f3 # direction of vertex's surface normal
texcoord0 f2 # xy position within the surface texture image which is placed at this vertex
end_vertexdesc

Re: CMOD structure

Posted: 25.09.2012, 22:41
by Fenerit
The vertex semantic should be:
vertex position (xyz) | normals of (xyz) | texture coordinates (xy) | tangents of (xyz)

options are: ...| pointsize(float) | pointcolor(rgba)

The vertex orientation shifts y <-> z axis; that is, if a CMOD model is converted like it is, should be ready for Lightwave's axis orientation, while if you want the 3DStudio MAX or Blender orientation, you must shift the y <-> z axis in seat of conversion; or at least, does re-orient the model within the 3D modeler itself.

-

Re: CMOD structure

Posted: 26.09.2012, 00:05
by Fenerit
The rotation about the shift y <-> z axis is matter of -x vertex.

Re: CMOD structure

Posted: 27.09.2012, 00:36
by Chuft-Captain
selden wrote:Sorry: I dunno which coordinate is supposed to be which axis. I usually modify the rotation code in my CMOD generation programs until the object is oriented the way "it should be" in Celestia.

The uses of the values are specified by the vertexdesc block which is included in your example above. It specifies what values are being provided and their order.
vertexdesc
position f3 # position of vertex in 3-space [in the model's own coordinate system]
normal f3 # direction of vertex's surface normal
texcoord0 f2 # xy position within the surface texture image which is placed at this vertex
end_vertexdesc
Sorry guys, I should have been clearer in my original post. - I'm trying to rotate only a single mesh (one of many individual meshes in the CMOD), rather than rotate the entire model.
ie. I want to change the orientation of that single part of the model relative to it's other parts.
(This has nothing at all to do with the known issue regarding 3DS versus CMOD orientation in Celestia.)

However, your explanation is still helpful, because I now have clicked as to what those descriptions mean. (f3 means: 3 x floats, etc.. thus 8 floats altogether. :) )
I also found by experimentation that the first 3 represent X,Y,Z positions (where X is horizontal, Y is vertical, and Z is out of the screen, when the model is first opened with cmodviewer.), and I was able to rotate the simple triangle above thru 45 degrees.
Clearly though, I'll have to perform the equivalent transformation on the normals as well.
(Might get away with not rotating the texture coordinates, but I suspect I will probably have to reposition those as well.)

Incidentally, I couldn't work out why there were 6 vertices for a single triangle, then I realized it was double sided.
One side:

Code: Select all

0 0 0 0 0 1 0 0
1 1 0 0 0 1 1 1
0 1 0 0 0 1 0 1

... and the other side with it's normals reversed:

Code: Select all

0 1 0 0 0 -1 0 1
1 1 0 0 0 -1 1 1
0 0 0 0 0 -1 0 0


Getting there....

The key thing, for a more complicated mesh than this extremely simple test case, will be to make sure that the phase of the chosen TRIG function is correct so that all the vertices end up in the appropriate quadrant.

Cheers
CC

PS. FWIW, here's the example above, with the addition of a duplicate rotated thru 45 degrees in the Y-axis. - position and normals only.
(Save as a CMOD and open with cmodviewer)

Code: Select all

#celmodel__ascii

mesh
vertexdesc
position f3
normal f3
texcoord0 f2
end_vertexdesc

vertices 6
0 0 0 0 0 1 0 0
1 1 0 0 0 1 1 1
0 1 0 0 0 1 0 1
0 1 0 0 0 -1 0 1
1 1 0 0 0 -1 1 1
0 0 0 0 0 -1 0 0

trilist 0 3
0 1 2
trilist 1 3
3 4 5

end_mesh


mesh
vertexdesc
position f3
normal f3
texcoord0 f2
end_vertexdesc

vertices 6
0 0 0 -0.707 0 0.707 0 0
0.707 1 0.707 -0.707 0 0.707 1 1
0 1 0 -0.707 0 0.707 0 1
0 1 0 0.707 0 -0.707 0 1
0.707 1 0.707 0.707 0 -0.707 1 1
0 0 0 0.707 0 -0.707 0 0

trilist 0 3
0 1 2
trilist 1 3
3 4 5

end_mesh


triangle-test.JPG