This topic is now archived and is closed to further replies.

OpenGL How do use 3DsMax to create objects that can be used in OpenGL

This topic is 6018 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Up to now Ive defined all my objects by using graph paper and alot of patience, but im sick and tired of doing it the hard way. So could somebody help me out and tell me how to export objects or get objects created in 3DsMax for use in OpenGL. BTW Im trying to write a starfox style 3D game... its just taking too long to make all those models without an editor..

Share this post

Link to post
Share on other sites
Well, there are two ways to go about it. The way most people get models into their programs is to write a loader for someone else's format (like *.3DS, *.ASC, etc.) If you're feeling ambitious, and have access to the MAX SDK (which is on the CD) and have alot of your favorite super-strength pain-killer, you can try writing a plugin to export geometry directly from MAX. You should take a look at the dejaview sample (you'll have to search around on the web; CFXWeb has a copy I believe) and the ASCIIExport sample which is included with the SDK in


In the DejaView source, you'll want to look at the function which converts a MAX matrix to an OpenGL-style matrix. You'll also need to fix the vertices, by swapping y and z, and then negating x.

If this turns out to be more work than you want to do, you might want to try something like Milkshape3D first.

Good luck.


Edited by - liquid on July 20, 2001 10:10:04 AM

Share this post

Link to post
Share on other sites
Sounds like alot of work.. and pain. Are there any loaders already written avalilable? If not do you think its more work trying to write an OpenGL modeller than writing a loader for the .3DS object format? (which do u think would require less ''tearing out your hair in anguish'' programming)
Thanks for the advice Liquid

Share this post

Link to post
Share on other sites
Writing a 3D studio ASE loader is pretty easy. All you need do is search the file for certain labels like "*MESH " and "*NUMFACES " and then load the data which follows into your model struct/class. The best way to figure out the file format is to export a simple object like a cube and then look at the file using wordpad.

The only potential problem is when exporting normals. The normals are all in pre-rotation format whereas the vertex data is post-rotation, confusingly. To get the correct normals for the mesh you have to rotate them yourself.

Share this post

Link to post
Share on other sites
I wrote a MAX ASE exporter that exported Geometry and Texture coordinates in an evening. If you are writing a full fledged game, this should be no problem for you. Trust me, after you write this, you will wonder why you didn''t do it sooner.


Share this post

Link to post
Share on other sites
Yeah writing plugins for Max is not that hard. A little intimidating at first because the concept of how a plugin works is wierd, but it''s basically just a DLL. I''m not sure about earlier versions but Max 4.0 comes with an AppWizard which you can setup under MSVC which will generate the skeleton code depending on what type of plugin you want to create, exporter being one of the options.

But there is also an article here on GameDev dealing with loading 3DS models. I haven''t used this code because I decided to go the plugin route, so I can''t say how good it works. I personally do not like the .3DS format. But that''s just me

If you want to make a plugin for Max to export your data and feel intimidated by it, email me at and I will help you out. I know the example programs that I have run across, including the samples on the Max CDs use very bad programming practices and are pretty hard to understand at first glance.


Share this post

Link to post
Share on other sites
Thanks for all the help Im getting .. this is my first cry for help and im surprised at the response..
I tried exporting a simple cube file as a .ASE file and opened it in wordpad as benjamin and UT(thankx guys) suggested, and I think it should be easy enough to write a program that will get the mesh and normal data from that file. So Ill prob be taking that route.
This leads to another problem .. how do u write a program that will identify triangle strips in the mesh data? Im a sucker for a cool problem and this one looks interesting..

Share this post

Link to post
Share on other sites
Well, the .ASE format contains a list of vertices, then a list of indices for each vertex in each face. You would have to read those into arrays, and iterate through each face and store the vertex data. Move to the next face and if any two vertices match any 2 from the previous face then you have a triangle strip... I think. You would keep going until you no longer had two matches. You could then look at the variables (which I didn''t mention, but you have been keeping) that show the index of the first face in the strip and the last, and you know that any faces between belong in the strip. You would probably want to write it to a new file in your own format.

Why even bother with triangle strips though? Why not just use vertex arrays and the like?

Share this post

Link to post
Share on other sites
Hmm.. this comment may be a bit late but I think is worth mentioning.
If you dont like or for some reasons dont feel like doing plugins, you can also write max scripts, max scripts are a lot easier to work with than plugins and are very powerful (to the extent you need which is taking info from a particular scene) if you look around you can find a plugin (or a script too I dont really remember that well) that allows you to save binary files from maxscript, this will allow you to write any kind of exporter (Im new to 3ds max4 so im not sure if this functionality is already there)

This is extremely useful (instead of using propietary formats) because
*You can extract information other formats wont like bones and weights.
*If you are claver or.. at least curious you can experiment with
compactation and encryptation algorithms.
*You can use max cool capabilities and assign special atributes to parts of the model, like a chrome (sphere mapped) texture, procedural textures, moving textures, shaders, armor values, physics weights, etc. =)

Share this post

Link to post
Share on other sites
Hi, sometime ago i bought a program called 3d Exploration for 35$ , and i found it very useful: with it you can export every kind of 3d file format directly to openg .cpp compiled display lists or vertex arrays. Take a look at


Share this post

Link to post
Share on other sites
Take a look around for a program called 3dto3d, coverts between many fileformats, including OpenGL .cpp.

Share this post

Link to post
Share on other sites

  • Similar Content

    • By xhcao
      Does sync be needed to read texture content after access texture image in compute shader?
      My simple code is as below,
      glBindImageTexture(0, texture[0], 0, GL_FALSE, 3, GL_READ_ONLY, GL_R32UI);
      glBindImageTexture(1, texture[1], 0, GL_FALSE, 4, GL_WRITE_ONLY, GL_R32UI);
      glDispatchCompute(1, 1, 1);
      // Does sync be needed here?
      glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
                                     GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture[1], 0);
      glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);
      Compute shader is very simple, imageLoad content from texture[0], and imageStore content to texture[1]. Does need to sync after dispatchCompute?
    • By Jonathan2006
      My question: is it possible to transform multiple angular velocities so that they can be reinserted as one? My research is below:
      // This works quat quaternion1 = GEQuaternionFromAngleRadians(angleRadiansVector1); quat quaternion2 = GEMultiplyQuaternions(quaternion1, GEQuaternionFromAngleRadians(angleRadiansVector2)); quat quaternion3 = GEMultiplyQuaternions(quaternion2, GEQuaternionFromAngleRadians(angleRadiansVector3)); glMultMatrixf(GEMat4FromQuaternion(quaternion3).array); // The first two work fine but not the third. Why? quat quaternion1 = GEQuaternionFromAngleRadians(angleRadiansVector1); vec3 vector1 = GETransformQuaternionAndVector(quaternion1, angularVelocity1); quat quaternion2 = GEQuaternionFromAngleRadians(angleRadiansVector2); vec3 vector2 = GETransformQuaternionAndVector(quaternion2, angularVelocity2); // This doesn't work //quat quaternion3 = GEQuaternionFromAngleRadians(angleRadiansVector3); //vec3 vector3 = GETransformQuaternionAndVector(quaternion3, angularVelocity3); vec3 angleVelocity = GEAddVectors(vector1, vector2); // Does not work: vec3 angleVelocity = GEAddVectors(vector1, GEAddVectors(vector2, vector3)); static vec3 angleRadiansVector; vec3 angularAcceleration = GESetVector(0.0, 0.0, 0.0); // Sending it through one angular velocity later in my motion engine angleVelocity = GEAddVectors(angleVelocity, GEMultiplyVectorAndScalar(angularAcceleration, timeStep)); angleRadiansVector = GEAddVectors(angleRadiansVector, GEMultiplyVectorAndScalar(angleVelocity, timeStep)); glMultMatrixf(GEMat4FromEulerAngle(angleRadiansVector).array); Also how do I combine multiple angularAcceleration variables? Is there an easier way to transform the angular values?
    • By dpadam450
      I have this code below in both my vertex and fragment shader, however when I request glGetUniformLocation("Lights[0].diffuse") or "Lights[0].attenuation", it returns -1. It will only give me a valid uniform location if I actually use the diffuse/attenuation variables in the VERTEX shader. Because I use position in the vertex shader, it always returns a valid uniform location. I've read that I can share uniforms across both vertex and fragment, but I'm confused what this is even compiling to if this is the case.
      #define NUM_LIGHTS 2
      struct Light
          vec3 position;
          vec3 diffuse;
          float attenuation;
      uniform Light Lights[NUM_LIGHTS];
    • By pr033r
      I have a Bachelor project on topic "Implenet 3D Boid's algorithm in OpenGL". All OpenGL issues works fine for me, all rendering etc. But when I started implement the boid's algorithm it was getting worse and worse. I read article ( inspirate from another code (here: but it still doesn't work like in tutorials and videos. For example the main problem: when I apply Cohesion (one of three main laws of boids) it makes some "cycling knot". Second, when some flock touch to another it scary change the coordination or respawn in origin (x: 0, y:0. z:0). Just some streng things. 
      I followed many tutorials, change a try everything but it isn't so smooth, without lags like in another videos. I really need your help. 
      My code (optimalizing branch):
      Exe file (if you want to look) and models folder (for those who will download the sources):
      Thanks for any help...

    • By Andrija
      I am currently trying to implement shadow mapping into my project , but although i can render my depth map to the screen and it looks okay , when i sample it with shadowCoords there is no shadow.
      Here is my light space matrix calculation
      mat4x4 lightViewMatrix; vec3 sun_pos = {SUN_OFFSET * the_sun->direction[0], SUN_OFFSET * the_sun->direction[1], SUN_OFFSET * the_sun->direction[2]}; mat4x4_look_at(lightViewMatrix,sun_pos,player->pos,up); mat4x4_mul(lightSpaceMatrix,lightProjMatrix,lightViewMatrix); I will tweak the values for the size and frustum of the shadow map, but for now i just want to draw shadows around the player position
      the_sun->direction is a normalized vector so i multiply it by a constant to get the position.
      player->pos is the camera position in world space
      the light projection matrix is calculated like this:
      mat4x4_ortho(lightProjMatrix,-SHADOW_FAR,SHADOW_FAR,-SHADOW_FAR,SHADOW_FAR,NEAR,SHADOW_FAR); Shadow vertex shader:
      uniform mat4 light_space_matrix; void main() { gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f); } Shadow fragment shader:
      out float fragDepth; void main() { fragDepth = gl_FragCoord.z; } I am using deferred rendering so i have all my world positions in the g_positions buffer
      My shadow calculation in the deferred fragment shader:
      float get_shadow_fac(vec4 light_space_pos) { vec3 shadow_coords = / light_space_pos.w; shadow_coords = shadow_coords * 0.5 + 0.5; float closest_depth = texture(shadow_map, shadow_coords.xy).r; float current_depth = shadow_coords.z; float shadow_fac = 1.0; if(closest_depth < current_depth) shadow_fac = 0.5; return shadow_fac; } I call the function like this:
      get_shadow_fac(light_space_matrix * vec4(position,1.0)); Where position is the value i got from sampling the g_position buffer
      Here is my depth texture (i know it will produce low quality shadows but i just want to get it working for now):
      sorry because of the compression , the black smudges are trees ...
      EDIT: Depth texture attachment:
  • Popular Now