L11 Mostly complete. Not sure Frenet Frame is working properly.

This commit is contained in:
Alex 2017-04-12 00:55:10 -05:00
parent 4e5b557868
commit c11fbbb5b0
6 changed files with 174 additions and 1 deletions

1
L11/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

View file

@ -201,7 +201,175 @@ void render()
// INSERT CODE HERE
// Unbind the program
// Initialize B.
glm::mat4 B;
// Initialize Frenet Frame variables
glm::vec3 p1;
glm::vec3 p2;
glm::vec4 uVec1;
glm::vec4 uVec2;
glm::vec3 Tan;
glm::vec3 Bin;
glm::vec3 Norm;
// Provided code for using global time variable t
float kfloat;
float uu = std::modf(std::fmod(t*0.5f, ncps-3.0f), &kfloat);
int k = (int)std::floor(kfloat);
if(type == BEZIER)
{
if(ncps > 3)
{
// Fill in B.
B[0] = glm::vec4(1.0f, 0.0f, 0.0f, 0.0f);
B[1] = glm::vec4(-3.0f, 3.0f, 0.0f, 0.0f);
B[2] = glm::vec4(3.0f, -6.0f, 3.0f, 0.0f);
B[3] = glm::vec4(-1.0f, 3.0f, -3.0f, 1.0f);
// Initialize G.
glm::mat4 G;
// Fill in G.
for(int i = 0; i < ncps/4; i++)
{
G[0] = glm::vec4(cps[i*4], 0.0f);
G[1] = glm::vec4(cps[i*4 + 1], 0.0f);
G[2] = glm::vec4(cps[i*4 + 2], 0.0f);
G[3] = glm::vec4(cps[i*4 + 3], 0.0f);
// Create uVec. Draw curve.
glBegin(GL_LINE_STRIP);
for(float u = 0; u <= 1.0f; u += 0.01f)
{
glm::vec4 uVec(1.0f, u, u*u, u*u*u);
glm::vec4 p = G*(B*uVec);
glColor3f(0.1f, 0.1f, 1.0f);
glVertex3f(p.x, p.y, p.z);
}
glEnd();
}
}
}
if(type == CATMULL_ROM)
{
if(ncps > 3)
{
// Fill in B.
B[0] = glm::vec4(0.0f, 2.0f, 0.0f, 0.0f);
B[1] = glm::vec4(-1.0f, 0.0f, 1.0f, 0.0f);
B[2] = glm::vec4(2.0f, -5.0f, 4.0f, -1.0f);
B[3] = glm::vec4(-1.0f, 3.0f, -3.0f, 1.0f);
B = 0.5f*B;
// Initialize G.
glm::mat4 G;
// Fill in G.
for(int i = 0; i < ncps - 3; i++)
{
G[0] = glm::vec4(cps[i], 0.0f);
G[1] = glm::vec4(cps[i + 1], 0.0f);
G[2] = glm::vec4(cps[i + 2], 0.0f);
G[3] = glm::vec4(cps[i + 3], 0.0f);
// Create uVec. Draw curve.
glBegin(GL_LINE_STRIP);
for(float u = 0; u <= 1.0f; u += 0.01f)
{
glm::vec4 uVec(1.0f, u, u*u, u*u*u);
glm::vec3 p = G*(B*uVec);
glColor3f(0.1f, 0.1f, 1.0f);
glVertex3f(p.x, p.y, p.z);
}
glEnd();
}
G[0] = glm::vec4(cps[k], 0.0f);
G[1] = glm::vec4(cps[k + 1], 0.0f);
G[2] = glm::vec4(cps[k + 2], 0.0f);
G[3] = glm::vec4(cps[k + 3], 0.0f);
glm::vec4 uVec(1.0f, uu, uu*uu, uu*uu*uu);
glm::vec3 p = G*(B*uVec);
uVec1 = glm::vec4(0.0f, 1.0f, uu*2.0f, (uu*uu)*3.0f);
p1 = G*(B*uVec1);
uVec2 = glm::vec4(0.0f, 0.0f, 2.0f, uu*6.0f);
p2 = G*(B*uVec2);
Tan = glm::normalize(p1);
Bin = glm::normalize(glm::cross(p1, p2));
Norm = glm::cross(Bin, Tan);
glBegin(GL_LINE_STRIP);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(p.x, p.y, p.z);
glVertex3f(Tan.x, Tan.y, Tan.z);
glEnd();
glBegin(GL_LINE_STRIP);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(p.x, p.y, p.z);
glVertex3f(Bin.x, Bin.y, Bin.z);
glEnd();
glBegin(GL_LINE_STRIP);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(p.x, p.y, p.z);
glVertex3f(Norm.x, Norm.y, Norm.z);
glEnd();
}
}
if(type == BASIS)
{
if(ncps > 3)
{
// Fill in B.
B[0] = glm::vec4(1.0f, 4.0f, 1.0f, 0.0f);
B[1] = glm::vec4(-3.0f, 0.0f, 3.0f, 0.0f);
B[2] = glm::vec4(3.0f, -6.0f, 3.0f, 0.0f);
B[3] = glm::vec4(-1.0f, 3.0f, -3.0f, 1.0f);
B = (1.0f/6.0f)*B;
// Initialize G.
glm::mat4 G;
// Fill in G.
for(int i = 0; i < ncps - 3; i++)
{
G[0] = glm::vec4(cps[i], 0.0f);
G[1] = glm::vec4(cps[i + 1], 0.0f);
G[2] = glm::vec4(cps[i + 2], 0.0f);
G[3] = glm::vec4(cps[i + 3], 0.0f);
// Create uVec. Draw curve.
glBegin(GL_LINE_STRIP);
for(float u = 0; u <= 1.0f; u += 0.01f)
{
glm::vec4 uVec(1.0f, u, u*u, u*u*u);
glm::vec4 p = G*(B*uVec);
glColor3f(0.1f, 0.1f, 1.0f);
glVertex3f(p.x, p.y, p.z);
}
glEnd();
}
}
}
// Unbind the program
prog->unbind();
// Pop matrix stacks.

1
L12/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

1
L13/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

1
L14/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

1
L15/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/