|
There are actually three transforms used when rendering an object. The three transform types are: D3DTS_WORLD, D3DTS_VIEW, and D3DTS_PROJECTION. I'm assuming that your D3DPRESENT_PARAMETERS are correct.
Also, there are numerous RenderState variables that generally have to be set before making your Draw calls. These are based on the values received when querying, the IDirect3D9 Interface (actually, your DIRECT3DDEVICE9). The following code is unmanaged C++, but should be clear.
LPDIRECT3DDEVICE9->GetDeviceCaps (&D3DCAPS9) ;
Typical RenderState settings are made like this:
LPDIRECT3DDEVICE9->SetRenderState (D3DRS_FILLMODE, D3DFILL_SOLID) ;
LPDIRECT3DDEVICE9->SetRenderState (D3DRS_LIGHTING, FALSE) ;
By the way, your sphere code is impressive,...I have to try it to see if it works correctly.
I'm assuming that you are calling these functions in your render loop.
LPDIRECT3DDEVICE9->BeginScene () ;
LPDIRECT3DDEVICE9->Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ,
D3DCOLOR_XRGB (0, 0, 0), .0f, 0 ) ;
LPDIRECT3DDEVICE9->EndScene () ;
LPDIRECT3DDEVICE9->Present (NULL, NULL, NULL, NULL) ;
Also, you should read this: Fixed Function FVF Codes, MSDN[^], and, Flexible Vertex Format Constants[^]
Good luck,...
|
|
|
|
|
It's quite late now, and I have no idea why when I try to render this model it comes out rather flat. Using DirectX 9. Here's a couple of pictures so you see what I mean:
http://img36.imageshack.us/img36/6811/yawnm.jpg[^]
http://img36.imageshack.us/img36/8588/ugho.jpg[^]
The model is read out of a .3ds file and then I create a static buffer out of it, problem is that it always comes out like this. If I swap the y and z co-ords around I get a nice top down view of the model but with the same 2 dimensional qualities.
I know the 3ds file is fine and I'm sure its something simple that I'm missing. I just can't see it.
I've made and rendered static buffers before, and I'm pretty sure I never had this problem.
You can guarantee that I'll kick myself when I find out what the problem is.
Well, as it turns out the vertex data I was sending over to create the buffer had an extra 4 bytes for each vertex. This somehow managed to have the effect of making all of the X values 0. I knew it would be something stupid.
My current favourite word is: Delicious!
-SK Genius
Game Programming articles start - here[ ^]-
modified on Monday, May 25, 2009 5:45 PM
|
|
|
|
|
I'm not into Direct3D but from my OpenGL experience, enabling/defining light sources and/or normals?
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|
I think its about time we get a good thread on this.
I've searched the internets for this for some time now, and I have'nt been able to find a good, definitive thread on the creation of the perfect 3d body, so here goes.
I know there is a simple solution for this in the form of D3DX library, and its meshes that do the job for me completely, but thats not the point.
What i am building is a program for my graduation thesis that does not rely on this kind of help in an effort to gain a greater understanding of 3d graphics.
What i have come to understand is that the placement of the vertices is not a big deal, and a basic understanding of math for this is simple. Turns out, placing the vertices in the right order into the vertex buffer and the index buffer is a bit tricky, to say the least!
This is the general code for the placement of vertices in 3d space:
[pre]
int meridians; //
int parallels; //
for(float theta=0;theta < D3DX_PI ;theta = theta + D3DX_PI/meridians ){ //0-PI
for(float phi=0;phi < 2*D3DX_PI;phi= phi + 2*D3DX_PI/parallels){ //0-2PI
verts[index].x = cosf(theta)* sinf(phi);
verts[index].y = sinf(theta)* sinf(phi);
verts[index].z = cosf(phi);
}
}
</pre>
(and yes i know i use d3dx for PI, its not a biggie
So, some explanations for the index calculations or some references(in case i cant use the net) would be much appreciated, also the entire code would be awesome!
thanks.
|
|
|
|
|
You might read this paper by, Hugues Hoppe: Progressive Meshes[^]. He wrote much of the specification for the DirectX Mesh object,...his publications[^] are interesting as background.
The DirectX Mesh X File is convenient as a way to save the graphics object to an archived file format. As you undoubtedly know, displaying a sphere is done with a tessellation of triangular faces.
So, the obvious question is: what exactly characterizes the "perfect 3d body"? Clearly, there is alot to it besides the vertex configuration.
|
|
|
|
|
Thats an interesting read, allthough pretty advanced for my level of knowledge. I understand the basic principle of tesselation but my problem is currently based not on the creation of the vertices in 3d space but on acquiring the needed indexes to fill the index buffer, ill figure it out soon enough!
thanks
|
|
|
|
|
I see,...I initially thought this was more of a conceptual problem.
Here is a tutorial on using Index Buffers (it describes a cube, but, this is easier to visualize): DirectX Managed Index Buffer Tutorial[^]
That author has a series of beginning DirectX tutorials: Complete Listing of DirectX Tutorials[^]
Originally, I thought you were interested in the actual implementation of the basic C+++ code for displaying a 3D Object. There are a number of excellent books on the subject available, that explain the underlying details of the trigonometry, without using the DirectX library (and the associated dependency). If you can find "Tricks of the 3D Game Programming Gurus, Advanced 3D Graphics and Rasterization", by Andre LaMothe[^], or something comparable, I would buy it (it explains all the mathematics of 3D graphics Windows programming in a clear way).
In my research into graphics, I found the following gateways excellent and informative reading: Real-Time Rendering Resources[^], and, Tim Rowley's Listing of Siggraph Papers[^]
|
|
|
|
|
wow! thats alot of ground to cover! and this is what i am looking for!
Thanks alot, ill post the full code when i write it so other ppl can use it.
|
|
|
|
|
its finally done, if anyone needs it, here we go:
<pre>
class Sphere : public Entity
{
public:
IDirect3DVertexBuffer9* SphereVertexBuffer;
IDirect3DIndexBuffer9* SphereIndexBuffer;
int parallels;
int meridians;
float theta; // od 0 do pi
float phi; //od 0 to 2pi
int num_vertices;
int num_triangles;
void get_ime(){OutputDebugString("banana");};
Sphere(int *idd, std::string iime, int pparallels, int mmeridians, std::list<Entity*> *EEntity_list) : Entity(iime, *idd), parallels(pparallels), meridians(mmeridians){
float x,y,z;
theta=0; // od 0 do pi
phi=0;
int index=0;
num_vertices=2*(parallels-1)*(meridians)+2;
HR(gd3dDevice->CreateVertexBuffer(num_vertices* sizeof(VertexPos), D3DUSAGE_WRITEONLY,
0, D3DPOOL_MANAGED, &SphereVertexBuffer, 0));
VertexPos *v;
HR(SphereVertexBuffer->Lock( 0, 0, (void**)&v, 0 ))
for(int i=0;i<meridians;i++){ // iliti theta,manji kut
for(int j=0;j<2*parallels+1;j++){ // ili phi, veći kut od 0-2pi
if(j==0 || j == parallels ){
phi=phi+(D3DX_PI*2 / parallels)/2; //uvjeti za kapice
j++;
}
if(j==(parallels*2)) break;
x=cosf(theta)*sinf(phi);
if(fabs(x)<0.000001) x=0;
y=sinf(theta)*sinf(phi);
if(fabs(y)<0.000001) y=0;
z=cos(phi);
if(fabs(z)<0.000001) z=0;
v[index] = VertexPos(x,y,z);
index++;
phi=phi+(D3DX_PI*2 / parallels)/2;
}
phi=0;
theta=theta+(D3DX_PI/ meridians);
}
v[index]=VertexPos(0,0,1); //126 ako je 9, 9, a je//kapice iliti
index++;
v[index]=VertexPos(0,0,-1); //127
SphereVertexBuffer->Unlock();
//OutputDebugString(index);
HR(gd3dDevice->CreateIndexBuffer(12*meridians*(parallels-1) * sizeof(WORD), D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16, D3DPOOL_MANAGED, &SphereIndexBuffer, 0));
WORD* k = 0;
int brojac=-1;
HR(SphereIndexBuffer->Lock(0, 0, (void**)&k, 0));
for(int i=1;i<meridians+1;i++){
k[++brojac]=num_vertices-2;
(i==meridians) ? (k[++brojac]=2*(parallels-1)-1):(k[++brojac]=i*2*(parallels-1)); //kapica gore, prednja
k[++brojac]=i*2*(parallels-1)-2*(parallels-1);
k[++brojac]=num_vertices-2;
(i==meridians) ? (k[++brojac]=0):(k[++brojac]=i*2*(parallels-1)+2*(parallels-1)-1); //kapica gore, preko puta
k[++brojac]=i*2*(parallels-1)-1;
for(int j=0;j<parallels-2;j++){
k[++brojac]=i*2*(parallels-1)-2*(parallels-1)+j;
(i==meridians) ? (k[++brojac]=2*(parallels-1)-j-1):(k[++brojac]=i*2*(parallels-1)+j); //prednji, lijevo gore trokut
k[++brojac]=i*2*(parallels-1)-2*(parallels-1)+j+1;
(i==meridians)?(k[++brojac]=2*(parallels-1)-j-1):(k[++brojac]=i*2*(parallels-1)+j); //prednji, suprotni
(i==meridians)?(k[++brojac]=2*(parallels-1)-j-2):(k[++brojac]=i*2*(parallels-1)+j+1);
k[++brojac]=i*2*(parallels-1)-2*(parallels-1)+j+1;
k[++brojac]=i*2*(parallels-1)-1-j;
(i==meridians)?(k[++brojac]=j):(k[++brojac]=i*2*(parallels-1)+2*(parallels-1)-1-j); //stražnji, lijevo gore trokut
k[++brojac]=i*2*(parallels-1)-2-j;
(i==meridians)?(k[++brojac]=j):(k[++brojac]=i*2*(parallels-1)+2*(parallels-1)-1-j);
(i==meridians)?(k[++brojac]=j+1):(k[++brojac]=i*2*(parallels-1)+2*(parallels-1)-2-j); //stražnji, suprotni
k[++brojac]=i*2*(parallels-1)-2-j;
}
k[++brojac]=num_vertices-1;
k[++brojac]=i*2*(parallels-1)-(parallels-1)-1; //kapica dolje, prednja
(i==meridians) ? (k[++brojac]=(parallels-1)):(k[++brojac]=i*2*(parallels-1)+(parallels-1)-1);
k[++brojac]=num_vertices-1;
k[++brojac]=i*2*(parallels-1)-(parallels-1); //kapica dolje, preko puta
(i==meridians) ? (k[++brojac]=(parallels-1)-1):(k[++brojac]=i*2*(parallels-1)+(parallels-1));
}
HR(SphereIndexBuffer->Unlock());
EEntity_list->push_back(this);
++(*idd); //*idd=*idd+1 <-isto kao i navedeno
}
void Render(){
HR(gd3dDevice->SetStreamSource(0, SphereVertexBuffer, 0, sizeof(VertexPos)));
HR(gd3dDevice->SetIndices(SphereIndexBuffer));
HR(gd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,num_vertices,0,4*meridians*(parallels-1)));
//HR(gd3dDevice->DrawPrimitive(D3DPT_POINTLIST,0,144));
//HR(gd3dDevice->DrawIndexedPrimitive( D3DPT_POINTLIST,0,0,200,0,288));
}
};
</pre>
|
|
|
|
|
I was looking for something like this. Awesome. Thanks for all the hard work
|
|
|
|
|
im glad i could be helpful
|
|
|
|
|
I have read the solution to the issue and I was also in the process of learning how to make 3D's. I checked the code and will be trying this one out. I hope you don't mind. Thanks a lot!
|
|
|
|
|
ofcourse i dont mind, ima glad.
By the way there are a few limitations you need to be aware of.
First the smallest values for meridians and parallels are 2 both, which makes sense since its not possible to draw a sphere any simpler than that. With 2,2 values, you get a double tetrahedron. The max values are about 180, 180, which makes a pretty detailed sphere, and ALOT of triangles, so it cripples the framerate. This is due to float precision, it can be solved in certain ways, but i doubt you will need a sphere that detailed.
Anyway, have fun.
|
|
|
|
|
hello,
i'm new to openGL, and i'm trying to build a color lookup table of size 265
is there any thing wrong in my code??
// i define the array in header
GLfloat color_table[256][4];
void BuildColorLookUpTable()
{
for(INT i = 0; i < 256; i++)
{
GLfloat red=i/255;
GLfloat green=0;
GLfloat blue=1-i/255;
color_table[i][0] = 0;
color_table[i][0] = red;
color_table[i][0] = green;
color_table[i][0] = blue;
glutSetColor(i, red, green, blue);
}
}
also, can anyone pls give me some guides
thanks
|
|
|
|
|
How is your code acting versus what you expected?
Also, you might ask yourself what i/255 computes to?
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|
i used i/255 to compute the red value,i didn't test my program yet
but my question was is this enough to build the lookup table or I should use
some gl commands to enable the index color mode??
can i use now glindex()??
thanks
|
|
|
|
|
I never used Glut when I was playing with OpenGL but it appears like if you're in color index mode that should setup the table. There might even be a default table already there. I'm not sure why you're maintaining the array of colors, when you can access Glut's color table once you've set it.
You're trying to setup up the table with green a constant zero. Red varying linearly from zero to one and blue being one minus red. However, the reason I asked you to think about what i/255 evaluates to means that's not what you're going to get. Your color table will be considerably more boring.
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|
thanks, i solved the problem of th table
but i have another question pls
i implement this function to render the face normal of the mesh but when i debug
i found that the program doesn't enter the loop at all and i get this in the watch of the debug when
i type i: i CXX0017: Error: symbol "i" not found
inline void CMesh::RenderFaceNormals()
{
float t=0.5;
CVector v0,v1;
for(int i=0 ; i<get_numoffaces();i++)
{
="" v0="(verts[faces[i]-">get_v0()]->get_gp()+ verts[faces[i]->get_v1()]->get_gp()+ verts[faces[i]->get_v2()]->get_gp() )/3;
v1 = t * faces[i]->get_normal();
glBegin(GL_LINES);
glVertex3f(v0.X(), v0.Y(), v0.Z()); // origin of the line
glVertex3f(v1.X(), v1.Y(), v1.Z()); // ending point of the line
glEnd();
}
}
it seems that my program doesn't see i??
can anyone help me??
|
|
|
|
|
As written above, I'm not sure how this compiled. Your for loop is malformed by missing the closing parenthesis at the very least and the second semicolon.
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|
No i'm sure there is no syntax errors, the error in the loop header only appear when i copy
from my program
anyone have solutions for my problem????
inline void CMesh::RenderFaceNormals()<br />
{<br />
float t=0.5;<br />
CVector v0,v1;<br />
<br />
for(int i=0 ; i< get_numOfFaces() ;i++)<br />
{<br />
v0 = (verts[faces[i]->get_v0()]->get_gp()+ verts[faces[i]->get_v1()]->get_gp()+ verts[faces[i]->get_v2()]->get_gp() )/3;<br />
v1 = t * faces[i]->get_normal();<br />
<br />
glBegin(GL_LINES);<br />
glVertex3f(v0.X(), v0.Y(), v0.Z());
glVertex3f(v1.X(), v1.Y(), v1.Z());
glEnd();<br />
}<br />
}
|
|
|
|
|
What compiler and version are you using?
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|
Microsoft Visual Studio 2005
|
|
|
|
|
Then it should be ok with defining the loop variable inside the for header. But to determine if something else is causing a side effect, try this:
int i;
for (i = 0 ; whatever your condition was ; i++)
{
your stuff
}
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|
Thanks Tim very much for ur help
i solve the problem, the problem was that my project was in release mode so i changed it now to debuge mode and it works well
i really appreciate your help
|
|
|
|
|
I'm not sure how switching to debug compile from release "fixes" the problem. Usually then that happens, you have a problem with unitialized memory that debug mode automatically sets to zero or you're using something like an assert macro that is compiled out in release mode and leaves a hole in your code but lets debug mode work.
"Republicans are the party that says government doesn't work and then they get elected and prove it." -- P.J. O'Rourke I'm a proud denizen of the Real Soapbox[ ^] ACCEPT NO SUBSTITUTES!!!
|
|
|
|
|