PDA

View Full Version : obj File loader Bezier curve



yellowbutton
05-31-2013, 01:21 AM
Hello everyone!

I want to load an obj file with opengl which shows a bezier curve.

I know how to load the v, vt, f.
The if-query for the "v" looks like this:


if(prefix.compare("v")==0)
{
line = line.substr(line.find_first_of("v")+2);
Vertex v;

istringstream s(line);
s>>v.x;
s>>v.y;
s>>v.z;
if(v.x<min[0])
min[0] = v.x;
if(v.y<min[1])
min[1] = v.y;
if(v.z<min[2])
min[2] = v.z;

if(v.x>max[0])
max[0] = v.x;
if(v.y>max[1])
max[1] = v.y;
if(v.z>max[2])
max[2] = v.z;
mesh.vertices.push_back(v);
}


But how can I make the If- Query to load the ctype, deg and curve?
I only have this so far:


if (prefix.compare("deg")==0)
{
line = line.substr(line.find_first_of("deg")+1);// deg +1;

}

if (prefix.compare("curve")==0)
{
// curve
}



here is an example obj File Bezier curve


v 0.0 0.0 0.0
v 0.0 1.0 0.0
v 1.0 1.0 0.0
v 1.0 0.0 0.0
cstype bezier
deg 3
curv 1 2 3 4
end

tonyo_au
05-31-2013, 08:37 PM
This is actually a c++ question so would not noramlly be answered here; but try this


if (prefix.compare("deg")==0)
{
line = line.substr(line.find("deg")+4);// deg +1;
istringstream s(line);
s>>degree;
}
if (prefix.compare("curve")==0)
{ // curve
line = line.substr(line.find("curve")+6);// curve+1;
istringstream s(line)
s>>curve.v1;
s>>curve.v2;
s>>curve.v3
s>>curve.v4;
}

yellowbutton
06-01-2013, 02:54 AM
Thank you very much. I will try that out:D

yellowbutton
06-04-2013, 11:31 AM
Now I have another problem with that. Maybe you can help me there as well?
How do i implement the class method to the if queries of "deg" and curve"?
Something like this or how shall I implement this?



struct Degree
{
float d;
};

struct Curve {
float v;

int order;
struct Vertex vertex[];
};

yellowbutton
06-07-2013, 09:49 PM
I found an example to draw the bezier curve.
But how can I put all together so that I can load the Beziercurve from an obj file and draw it?

Here is the example I found:



#include <iostream>
#include <glut.h>

struct point {
float x;
float y;
};




void reshape( int w, int h )
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, w, 0, h, -1, 1);
glMatrixMode( GL_MODELVIEW );
}

point linearInterpolate( point pA, point pB, float t )
{
point returnPoint;

returnPoint.x = pA.x + (pB.x - pA.x)*t;
returnPoint.y = pA.y + (pB.y - pA.y)*t;
return returnPoint;
}

void markPoint( point p )
{
glBegin( GL_POINTS );
glVertex2i( p.x - 2, p.y - 2 );
glVertex2i( p.x , p.y - 2 );
glVertex2i( p.x + 2, p.y - 2 );

glVertex2i( p.x - 2, p.y );
glVertex2i( p.x + 2, p.y );

glVertex2i( p.x - 2, p.y + 2 );
glVertex2i( p.x , p.y + 2 );
glVertex2i( p.x + 2, p.y + 2 );
glEnd();
}

//
void drawBezier( point p0, point p1, point p2, point p3 )
{

float steps = 100;

glBegin( GL_POINTS );
for(int i = 0; i < steps; i++) {
float t = (float)i / (steps - 1);
point resP = linearInterpolate(
linearInterpolate(
linearInterpolate(p0, p1, t),
linearInterpolate(p1, p2, t),
t),
linearInterpolate(
linearInterpolate(p1, p2, t),
linearInterpolate(p2, p3, t),
t),
t);
glVertex2i(resP.x, resP.y);
}
glEnd();
}



void draw()
{
glClear( GL_COLOR_BUFFER_BIT );

point p0;
point p1;
point p2;
point p3;


p0.x = 10;
p0.y = 10;

p1.x = 100;
p1.y = 350;

p2.x = 350;
p2.y = 150;

p3.x = 500;
p3.y = 400;

glColor3f( 1.0f, 0.0f, 0.0f );
markPoint( p0 );

glColor3f( 0.0f, 1.0f, 0.0f );
markPoint( p1 );

glColor3f( 0.0f, 0.0f, 1.0f );
markPoint( p2 );

glColor3f( 1.0f, 1.0f, 0.0f );
markPoint( p3 );

glColor3f( 1.0f, 1.0f, 1.0f );
drawBezier( p0, p1, p2, p3 );

glutSwapBuffers();
}


int main (int argc, char* argv[] )
{
[....]
}



Please help me