Archived

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

OpenGL using models in OpenGL (CAUTION! NEWBIE INSIDE!)

This topic is 6280 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

Ok, this is probably very basic and stupid but I''m a pretty stupid newbie (especially in the field of 3d graphics and OpenGL) so please bear with me. In my program I need to handle more or less complex models. Well, they are far too complex to hardcode every single polygon by hand. So how do i get models into my program? I don''t have a 3D modeler right now and I''m not a great 3D artist. So what would you recommend for me? How could I create my models, how should I store them in a file? How would I load them again (this one is probably pretty straight forward. I just have to do the storing process the other way ''round) and how should I display ''em then? How do you handle models? Or how would you handle models if you had to? So many questions and all I have is an empty brain. Please help a desperate newbie out. There was a time where you were newbies too and needed help like I do right now. ANY input is more than welcome. Thanx for reading till here. And pleeeeeaaze help me if you can. "Mr Sandman bring me a dream"

Share this post


Link to post
Share on other sites
quote:
Original post by MrSandman666

In my program I need to handle more or less complex models. Well, they are far too complex to hardcode every single polygon by hand.

So how do i get models into my program? I don''t have a 3D modeler right now and I''m not a great 3D artist. So what would you recommend for me?



You can use 3D studio (max) to create your models or another modeling package.

quote:
How could I create my models, how should I store them in a file? How would I load them again (this one is probably pretty straight forward. I just have to do the storing process the other way ''round) and how should I display ''em then?

How do you handle models? Or how would you handle models if you had to?


Best to save in 3DS format or just the standard file from that modeller. There are a lot of conversion tools out there to convert the modeller file, to C(++) or a simple AscII format or binary or whatever. If this conversion still isn''t good enough, I would recommend converting to simple AscII and writing your own convertor.

To display them, might not be so easy if you haven''t written any OGL or D3D program yet. If you''re new at this - I would suggest a visit to nehe.gamedev.net for source code and tutorials and www.opengl.org for the SDK.

Share this post


Link to post
Share on other sites
3D STUDIO MAX??? *cough*
I''m not rich for crying out loud! I''m only a hobby programmer.
Still, that''s not the main reason for me not to use some expensive modelling kit. I know there are even freeware ones out there.
I would just like to have my own file format to keep things simple. It is usually pretty hard (I think) to convert a 3d file (*.3ds for example) to something that works with OpenGL.
I mean, if someone knows a very simple and plain 3d file format out there or I find one, I''ll be very happy to have a look and try my luck with it, but 3ds is definately too complicated for me (I already had a look at it and didn''t understand a word).
I thought of having a list of vertices, each with position data and a material attached to it.
From that I can calculate the single polygons (which will be pretty hard though) and the normals from these polys.
The polygons can be rendered pretty easily then.

The problem is, where do I get the vertices from, how do I store them in a file so that they can be read easily later and how do I create polygons from these vertices.
Another problem for me would be the internal storage of the vertices and polygons. You''ll never know the nmber of verices or polys in a model in beforehand so the intuitive approach for me would be a linked list, but wouldn''t that be incredibly slow to read later? A dynamicaly declared array could be a solution.

BTW: I''m new to OpenGL, but that doesn''t mean that I have no experience at all with it. I''m just learning it at the moment, so i know the basic theories of rendering triangels, moving and lighting them and this kind of stuff. I havent mastered texture mapping yet, though.
Ohhhh, sh...! Texture mapping! I didn''t think about that one! If my model is defined by vertices initialy, how the hell would I specify the textures for them??? Ok, probably I have to store polys right away. So, where do I get poly''s from?
Oh my... Questions over questions. WHy does 3d have to be so hard

Anyways:
Thank you very much for your reply! I apologize if my answer sounded somehow rude or so. That just happens to me sometimes.
I really appreciated your help

"Mr Sandman bring me a dream"

Share this post


Link to post
Share on other sites
a nice one is md2 files (plenty of character models around for code to load a md2 check the milkshake site)
"3d exportation"? converts various 3d file formats
milkshake + blender r modelling apps

http://members.xoom.com/myBollux

Share this post


Link to post
Share on other sites
Theres a primer on loading simple objects on my site. Once you''ve done that, it goes on to provide code to load Milkshape 1.3 files.

Paul Groves
pauls opengl page

Share this post


Link to post
Share on other sites
this has a bunch of 3d editers. Should help you out. I use Strata 3d(free version), export me objects in vrml2 format then convert them to truespace files...

Share this post


Link to post
Share on other sites
Pauly, on your site you said that vertex arrays are somewhat fasionable and that they have certain advantages compared to display lists.
I''ve never heard of vertex arrays though. Wouldn''t display lists be faster? What are the advantages of vertex arrays?

"Mr Sandman bring me a dream"

Share this post


Link to post
Share on other sites
I would say, download Milkshape 3D. On the millshape site there are some links to tutorials on how to model and how to use the program. Its shareware so it works normal for 30 days, after that it will not save or export. The cost to register is only $20. If you can''t afford 3d studio max, im sure you can afford this one.

-Snyper

Share this post


Link to post
Share on other sites
In fact, I already DID download Milkshape. And the SDK and the avi tutorials. I haven''t registered it yet, but I guess I will do so soon. In my opinion it''s a really cool program.
But that doesn''t help me with my vertex array question. can anyone help me with that?

"Mr Sandman bring me a dream"

Share this post


Link to post
Share on other sites
Data in display lists is static. You can''t change it after you''ve compiled the display list without recompiling the display list again.

Vertex arrays let you render primitives with indices (reducing geometry bandwidth) and if you use copmiled vertex arrays and the proper datatypes, they can be as fast as display lists. The bonus is they aren''t static so you can change the data in them if needs be.

Thats just a primer, there''s loads of stuff been written about the pros and cons on graphics message boards all over the place.

Paul.

Share this post


Link to post
Share on other sites
Thanx man!
Now I finally understand it.

I started diggin into the material you have on your homepage and to say the least: I''m confused! This is all so complicated that I have the feeling that I have to take another approach or find a reeeeeaaally simple tutorial. I mean, your tutorial is prbably great for someone who has some experience doing stuff like that, but for me this is the first time I have to actually write my own engine for my game. Until know I always used some 3rd party engine to get my graphics onto the screen. I have actually no idea what to do with all the data given by Milkshape and - I''m sorry - your tutorial doesn''t help me much. After all it''s basically only some source code with a few comments. I need someone to take my hand, walk me through this step by step and explain every single bit in detail.
It''s a pitty that NeHe doesn''t have a tutorial on Model Loading. The rest of his tutorials are great!
I really am pretty desperate. I need to get this done and I don''t kno how to approach it.
How did you learn it?

"Mr Sandman bring me a dream"

Share this post


Link to post
Share on other sites
How did I learn about model loaders? I wrote one myself. That simple meshloader uses I format that I dreamt up.

3d programs usually export vertices, face and material data. The first part of the parser reads the vertices into an array.
Eg:
0.0 0.0 0.0 // element [ 0 ]
1.0 0.0 0.0 // element [ 1 ]
0.0 1.0 0.0 // element [ 2 ]
0.0 0.0 0.0 // element [ 3 ]


The face data in the file are indices to the vertices in the array. So one particular triangle might look like:
0 1 2
That would reference the coordinates at positions 0, 1 and 2 in the vertex array - thus making a triangle.

I thought this was fairly easy to pick up from what I''d written - I guess I''ll go back to it and rewrite it a bit when I have the time.

Thanks for the feedback,
Paul.

Share this post


Link to post
Share on other sites
Well, I guess I just have to dig my way through the Milkshape Ascii file specs and come up with a new loader from scratch.
But I still got a few questions:

1. Why didn''t you take the normals from Milkshape but generate your own ones?

2. Did any one make it to read the binary version of the Milkshape file format? If so: how? I don''t undertand their concept. Are there tutorials on this? Example loaders?

Any further help woudl be veeery welcome!


"Mr Sandman bring me a dream"

Share this post


Link to post
Share on other sites
1.
Because I have no idea what Mete (the author) was taking when he designed Milkshapes smoothing group mechanism. And I had the code lying around from my Lightwave object parser.

2.
There aren''t any ''formal'' specs. for the binary version of the files. You get a text file with a bunch of C structs in it - if you try to use those in your program it doesn''t seem to work

Its easy to load binary files if you know their structure. Lets take the ASCII simple meshloader file and make it into a binary format. To make it easier to read we could rearrange the file structure so that the object stats are all together. So at the start of your binary file you''d have two unsigned integers that tell us the number of vertices in the object and the number of (triangular) faces it has.

We''ll collect this together in a type called tObjectInfo. Below are the types that we need to define and some variables of the types we need to store our object data.


/* Type definitions */
typedef struct {
unsigned int num_vertices;
unsigned int num_faces;
} tObjectInfo;

typedef float tVertex[3];
typedef unsigned int tIndex[3];

/* Variable declarations */
tObjectInfo object_stats;
tVertex *object_verts;
tIndex *object_indices;


So you''d open the file with fopen (or whatever you use) set in binary mode, then:

fread ( object_stats, ( sizeof ( tObjectInfo )), 1, file );

That reads data that is the size of a tObjectInfo into a record variable "object_stats". The "1" is the number of times to perform the same read. The "file" is the open file pointer.

You''d use these stats to create arrays of vertices and indices:

object_verts = ( tVertex* ) malloc ( sizeof ( tVertex * object_stats.num_vertices ));

object_indices = ( tIndex* ) malloc ( sizeof ( tIndex * object_stats.num_indices ));


In the code above you''re casting the result of a malloc call to the arrays of either tVertex or tIndex. The "sizeof" part makes sure we allocate the correct number of bytes. It''s good pratice to check whether these return NULL or not. If using C++ you''d call the new operator instead of using malloc.

Next, your file would have a bunch of floats that represented the vertices, so you''d read these in like:

fread ( &object_verts, ( sizeof ( tVertex )), object_stats.num_vertices, file );

And then the indices:

fread ( &object_indices, ( sizeof ( tIndex )), object_stats.num_indices, file );

So as you can see at this level, reading binary files is easy. You just have to know the structure. In reality most 3d binary file formats are made up of ''chunks''. Each chunk has an Id header and its size in there to. But as long as you know the format of each chunk then reading them isn''t a problem.

The bonus of having chunks with their size in the header is that if you want to ignore the data in the chunk you can just fseek past it with the current chunk''s size.

Phew! Wrote a lot there - still it helps with the touch typing -- You can tell I''m bored can''t you

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,
      glUseProgram(program.get());
      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?
      glUseProgram(0);
      glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
      glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                     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
      Hello,
      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 (http://natureofcode.com/book/chapter-6-autonomous-agents/) inspirate from another code (here: https://github.com/jyanar/Boids/tree/master/src) 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): https://github.com/pr033r/BachelorProject/tree/Optimalizing
      Exe file (if you want to look) and models folder (for those who will download the sources):
      http://leteckaposta.cz/367190436
      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.xyz / 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 ... https://i.stack.imgur.com/T43aK.jpg
      EDIT: Depth texture attachment:
      glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT24,fbo->width,fbo->height,0,GL_DEPTH_COMPONENT,GL_FLOAT,NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, fbo->depthTexture, 0);
  • Popular Now