Archived

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

MrSandman666

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

Recommended Posts

MrSandman666    122
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
baskuenen    124
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
MrSandman666    122
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
zedzeek    529
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
laeuchli    338
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
MrSandman666    122
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
Snyper    122
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
MrSandman666    122
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
Pauly    122
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
MrSandman666    122
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
Pauly    122
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
MrSandman666    122
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
Pauly    122
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 pseudomarvin
      I assumed that if a shader is computationally expensive then the execution is just slower. But running the following GLSL FS instead just crashes
      void main() { float x = 0; float y = 0; int sum = 0; for (float x = 0; x < 10; x += 0.00005) { for (float y = 0; y < 10; y += 0.00005) { sum++; } } fragColor = vec4(1, 1, 1 , 1.0); } with unhandled exception in nvoglv32.dll. Are there any hard limits on the number of steps/time that a shader can take before it is shut down? I was thinking about implementing some time intensive computation in shaders where it would take on the order of seconds to compute a frame, is that possible? Thanks.
    • By Arulbabu Donbosco
      There are studios selling applications which is just copying any 3Dgraphic content and regenerating into another new window. especially for CAVE Virtual reality experience. so that the user opens REvite or CAD or any other 3D applications and opens a model. then when the user selects the rendered window the VR application copies the 3D model information from the OpenGL window. 
      I got the clue that the VR application replaces the windows opengl32.dll file. how this is possible ... how can we copy the 3d content from the current OpenGL window.
      anyone, please help me .. how to go further... to create an application like VR CAVE. 
       
      Thanks
    • By cebugdev
      hi all,

      i am trying to build an OpenGL 2D GUI system, (yeah yeah, i know i should not be re inventing the wheel, but this is for educational and some other purpose only),
      i have built GUI system before using 2D systems such as that of HTML/JS canvas, but in 2D system, i can directly match a mouse coordinates to the actual graphic coordinates with additional computation for screen size/ratio/scale ofcourse.
      now i want to port it to OpenGL, i know that to render a 2D object in OpenGL we specify coordiantes in Clip space or use the orthographic projection, now heres what i need help about.
      1. what is the right way of rendering the GUI? is it thru drawing in clip space or switching to ortho projection?
      2. from screen coordinates (top left is 0,0 nd bottom right is width height), how can i map the mouse coordinates to OpenGL 2D so that mouse events such as button click works? In consideration ofcourse to the current screen/size dimension.
      3. when let say if the screen size/dimension is different, how to handle this? in my previous javascript 2D engine using canvas, i just have my working coordinates and then just perform the bitblk or copying my working canvas to screen canvas and scale the mouse coordinates from there, in OpenGL how to work on a multiple screen sizes (more like an OpenGL ES question).
      lastly, if you guys know any books, resources, links or tutorials that handle or discuss this, i found one with marekknows opengl game engine website but its not free,
      Just let me know. Did not have any luck finding resource in google for writing our own OpenGL GUI framework.
      IF there are no any available online, just let me know, what things do i need to look into for OpenGL and i will study them one by one to make it work.
      thank you, and looking forward to positive replies.
    • By fllwr0491
      I have a few beginner questions about tesselation that I really have no clue.
      The opengl wiki doesn't seem to talk anything about the details.
       
      What is the relationship between TCS layout out and TES layout in?
      How does the tesselator know how control points are organized?
          e.g. If TES input requests triangles, but TCS can output N vertices.
             What happens in this case?
      In this article,
      http://www.informit.com/articles/article.aspx?p=2120983
      the isoline example TCS out=4, but TES in=isoline.
      And gl_TessCoord is only a single one.
      So which ones are the control points?
      How are tesselator building primitives?
    • By Orella
      I've been developing a 2D Engine using SFML + ImGui.
      Here you can see an image
      The editor is rendered using ImGui and the scene window is a sf::RenderTexture where I draw the GameObjects and then is converted to ImGui::Image to render it in the editor.
      Now I need to create a 3D Engine during this year in my Bachelor Degree but using SDL2 + ImGui and I want to recreate what I did with the 2D Engine. 
      I've managed to render the editor like I did in the 2D Engine using this example that comes with ImGui. 
      3D Editor preview
      But I don't know how to create an equivalent of sf::RenderTexture in SDL2, so I can draw the 3D scene there and convert it to ImGui::Image to show it in the editor.
      If you can provide code will be better. And if you want me to provide any specific code tell me.
      Thanks!
  • Popular Now