Sign in to follow this  
8.zwerg

Billborad is not aligned to view

Recommended Posts

Hey guys,

 

I try to set up Billboards in my programm, but it does not work at all.

My "testplane" can be seen, but its not rotating according to the view.

 

See this image (from side view) for detail.

 

screen_d3d6zc70.jpg

 

So this is what I got..

As you can see, I want to use the Billboards as Tree leaves.

 

The code for the white plane is the following:

glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glUseProgram(0);

glGetFloatv(GL_PROJECTION_MATRIX, @Matrix);
Right:= Vectorize(Matrix[0,0], Matrix[0,1], Matrix[0,2]);
Up:=    Vectorize(Matrix[1,0], Matrix[1,1], Matrix[1,2]);

glPushMatrix;
glColor3f(1,1,1);
glBegin(GL_QUADS);
 glVertex3f(3 +Right.X+Up.X, 0+Right.Y+Up.Y, 3 +Right.Z+Up.Z);
 glVertex3f(-3-Right.X+Up.X, 0-Right.Y+Up.Y, 3 -Right.Z+Up.Z);
 glVertex3f(-3-Right.X-Up.X, 0-Right.Y-Up.Y, -3-Right.Z-Up.Z);
 glVertex3f(3 +Right.X-Up.X, 0+Right.Y-Up.Y, -3+Right.Z-Up.Z);
glEnd;
glPopMatrix;


glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);

Can you tell me my mistake?

Share this post


Link to post
Share on other sites

Why are you pushing the matrix when you aren't using it? (and more importantly, you aren't even calling the matrix functions, not using the parenthesis means they're function pointers instead and on their own they do absolutely nothing)

 

Anyway, I'd argue that probably the easiest way for you would be to rotate (glRotate3f) the billboard the same angle as the camera, but the other way (i.e. -angle instead of angle). Less headaches to cope with. And if you ever switch to a more modern API than the old OpenGL 1.1, remember you can do whatever is the equivalent there.

Share this post


Link to post
Share on other sites
Well, Im aware that glBegin is not the most modern way to work with, but I was learning it in this way, and it still works fine for me. Im just a hobby programmer without any specific knowledge ;)

Can you give me a tip how to get the angles of the "camera"? Like said, Im no professional so I need a bit more information.

Thanks in advance

Share this post


Link to post
Share on other sites

As far as i remember you need to get GL_MODELVIEW_MATRIX

 

then you get

 

BillboardX.x = mvm[0];
BillboardX.y = mvm[4];
BillboardX.z = mvm[8];
 
 
BillboardY.x = mvm[1];
BillboardY.y = mvm[5];
BillboardY.z = mvm[9];
 
those are yours worldspace up and right vectors
 
then

verts[i*4].v.x = particles[i].pos.x-BillboardX.x*particles[i].size+BillboardY.x*particles[i].size;
verts[i*4].v.y = particles[i].pos.y-BillboardX.y*particles[i].size+BillboardY.y*particles[i].size;
verts[i*4].v.z = particles[i].pos.z-BillboardX.z*particles[i].size+BillboardY.z*particles[i].size;
 
 
verts[i*4+1].v.x = particles[i].pos.x+BillboardX.x*particles[i].size+BillboardY.x*particles[i].size;
verts[i*4+1].v.y = particles[i].pos.y+BillboardX.y*particles[i].size+BillboardY.y*particles[i].size;
verts[i*4+1].v.z = particles[i].pos.z+BillboardX.z*particles[i].size+BillboardY.z*particles[i].size;
 
 
verts[i*4+2].v.x = particles[i].pos.x+BillboardX.x*particles[i].size-BillboardY.x*particles[i].size;
verts[i*4+2].v.y = particles[i].pos.y+BillboardX.y*particles[i].size-BillboardY.y*particles[i].size;
verts[i*4+2].v.z = particles[i].pos.z+BillboardX.z*particles[i].size-BillboardY.z*particles[i].size;
 
 
verts[i*4+3].v.x = particles[i].pos.x-BillboardX.x*particles[i].size-BillboardY.x*particles[i].size;
verts[i*4+3].v.y = particles[i].pos.y-BillboardX.y*particles[i].size-BillboardY.y*particles[i].size;
verts[i*4+3].v.z = particles[i].pos.z-BillboardX.z*particles[i].size-BillboardY.z*particles[i].size;

 

EDIT.

Yeah that was it:

 

 
void __fastcall  TFCOpenGL::drawbillboardF(float cx, float cy, float cz, float size)
{
double m_PickInfo_ModelView[16];// of ;
 
  t3dpoint<float> Pos;
glGetDoublev(GL_MODELVIEW_MATRIX, m_PickInfo_ModelView);
 
BillboardX.x = m_PickInfo_ModelView[0];
BillboardX.y = m_PickInfo_ModelView[4];
BillboardX.z = m_PickInfo_ModelView[8];
 
 
BillboardY.x = m_PickInfo_ModelView[1];
BillboardY.y = m_PickInfo_ModelView[5];
BillboardY.z = m_PickInfo_ModelView[9];
 
 
 
glBegin(GL_QUADS);
 
glTexCoord2f(0.0, 1.0);
 
Pos.x = cx-BillboardX.x*size+BillboardY.x*size;
Pos.y = cy-BillboardX.y*size+BillboardY.y*size;
Pos.z = cz-BillboardX.z*size+BillboardY.z*size;
 
glVertex3f(Pos.x,Pos.y,Pos.z);
glTexCoord2f(1.0, 1.0);
 
Pos.x = cx+BillboardX.x*size+BillboardY.x*size;
Pos.y = cy+BillboardX.y*size+BillboardY.y*size;
Pos.z = cz+BillboardX.z*size+BillboardY.z*size;
 
glVertex3f(Pos.x,Pos.y,Pos.z);
 
glTexCoord2f(1.0, 0.0);
Pos.x = cx+BillboardX.x*size-BillboardY.x*size;
Pos.y = cy+BillboardX.y*size-BillboardY.y*size;
Pos.z = cz+BillboardX.z*size-BillboardY.z*size;
glVertex3f(Pos.x,Pos.y,Pos.z);
 
glTexCoord2f(0.0, 0.0);
Pos.x = cx-BillboardX.x*size-BillboardY.x*size;
Pos.y = cy-BillboardX.y*size-BillboardY.y*size;
Pos.z = cz-BillboardX.z*size-BillboardY.z*size;
glVertex3f(Pos.x,Pos.y,Pos.z);
 
glEnd();
 
}
Edited by WiredCat

Share this post


Link to post
Share on other sites

Thanks for your response.

 

However, you replied exactly what I have already "achieved". Means that I have already set up my Right/Up Vector (see my code), but the Quad is not rotating with the camera.

 

Any solutions for that problem?

Share this post


Link to post
Share on other sites

lol,

 

you are picking wrong matrix, and getting wrong vector,

 

 

how is

glGetFloatv(GL_PROJECTION_MATRIX, @Matrix);
Right:= Vectorize(Matrix[0,0], Matrix[0,1], Matrix[0,2]);
Up:=    Vectorize(Matrix[1,0], Matrix[1,1], Matrix[1,2]);

equal to

double m_PickInfo_ModelView[16];// of ;
 
  t3dpoint<float> Pos;
glGetDoublev(GL_MODELVIEW_MATRIX, m_PickInfo_ModelView);
 
BillboardX.x = m_PickInfo_ModelView[0];
BillboardX.y = m_PickInfo_ModelView[4];
BillboardX.z = m_PickInfo_ModelView[8];
 
 
BillboardY.x = m_PickInfo_ModelView[1];
BillboardY.y = m_PickInfo_ModelView[5];
BillboardY.z = m_PickInfo_ModelView[9];

to be more specific

glGetFloatv(GL_PROJECTION_MATRIX, @Matrix); and glGetDoublev(GL_MODELVIEW_MATRIX, m_PickInfo_ModelView);

 

 

 

after that you will have worldspace vectors (up, right) so you: LoadIdenity then setupcamera, and draw your object (defining position of billboard and its size)

Edited by WiredCat

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this