Sign in to follow this  
dantheman1337

Adding radius to sphere plane collision

Recommended Posts

I have the collision down, which when tested works better than I thought. However, I don't know how or where to add the radius so that I get a collision based on the radius of the sphere, not the actual coordinate. Sorry if I'm not making the most sense. Here's my code:



[font="Consolas"][size="2"][color="#0000ff"][font="Consolas"][size="2"][color="#0000ff"][font="Consolas"][size="2"][color="#0000ff"]int

[/color][/size][/font]

[/color][/size][/font]

[/color][/size][/font][font="Consolas"][font="Consolas"][size="2"] main(){[/size][/font][/font]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] radius = 0;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector p1(0,0,0),p2(10,0,0),p3(10,10,0);

vector vert1 = p2 - p1, vert2 = p3 - p2;

vector vnorm = vert1.CrossProduct(vert2);

vnorm = vnorm.Normalize();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] D = -(p1.DotProduct(vnorm));[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector playerstart(1,1,1),playerend(1,1,-1);



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] p;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] p = vnorm.DotProduct(playerstart) - radius;



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] startl, endloc;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p > 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] startl = 1;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"] [/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p < 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] startl = 2;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] startl = 0;

}

p = vnorm.DotProduct(playerend) - radius;



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p > 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] endloc = 1;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"] [/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p < 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] endloc = 2;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] endloc = 0;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]bool[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] hit = [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]false[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](startl == endloc){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] hit =

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]false[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] std::cout <<

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"no hit\n"[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] hit =

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]true[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](hit){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector ray = playerend - playerstart;

ray = ray.Normalize();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] T = -(D + vnorm.DotProduct(playerstart))/vnorm.DotProduct(ray);[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector intersect(playerstart.x + (ray.x*T),playerstart.y + (ray.y*T),playerstart.z + (ray.z*T));

vector v1 = intersect - p1, v2 = intersect - p2, v3 = intersect - p3;

v1 = v1.Normalize();

v2 = v2.Normalize();

v3 = v3.Normalize();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] sum = acos(v1.DotProduct(v2)) + acos(v2.DotProduct(v3)) + acos(v3.DotProduct(v1));[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](fabs(sum - (2*3.14159f)) < 0.1){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] std::cout<<

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"hit at "[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] << intersect.x << [/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]" "[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] << intersect.y << [/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]" "[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] << intersect.z << std::endl;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] std::cout<<

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"no hit\n"[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }

}

std::cin.get();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]return[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](0);[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }

[/size][/font][/size][/font]

Share this post


Link to post
Share on other sites
Nevermind, solved it! Code:



[font="Consolas"][size="2"][color="#0000ff"][font="Consolas"][size="2"][color="#0000ff"][font="Consolas"][size="2"][color="#0000ff"]int

[/color][/size][/font]

[/color][/size][/font]

[/color][/size][/font][font="Consolas"][font="Consolas"][size="2"] main(){[/size][/font][/font]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] radius = 2;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector p1(0,0,0),p2(10,0,0),p3(10,10,0);

vector vert1 = p2 - p1, vert2 = p3 - p2;

vector vnorm = vert1.CrossProduct(vert2);

vnorm = vnorm.Normalize();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] D = -(p1.DotProduct(vnorm));[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector playerstart(0,0,3),playerend(0,0,1);



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] p;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] p = vnorm.DotProduct(playerstart) - radius;



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] startl, endloc;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p > 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] startl = 1;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"] [/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p < 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] startl = 2;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] startl = 0;

}

p = vnorm.DotProduct(playerend) - radius;



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p > 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] endloc = 1;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"] [/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](p < 0){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] endloc = 2;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] endloc = 0;

}



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]bool[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] hit = [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]false[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](startl == endloc){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] hit =

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]false[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] std::cout <<

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"no hit\n"[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] hit =

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]true[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](hit){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector ray = playerend - playerstart;

ray = ray.Normalize();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] T = -((D) + vnorm.DotProduct(playerstart))/vnorm.DotProduct(ray);[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] vector intersect(playerstart.x + (ray.x*T),playerstart.y + (ray.y*T),playerstart.z + (ray.z*T));

vector v1 = intersect - p1, v2 = intersect - p2, v3 = intersect - p3;

v1 = v1.Normalize();

v2 = v2.Normalize();

v3 = v3.Normalize();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]float[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] sum = acos(v1.DotProduct(v2)) + acos(v2.DotProduct(v3)) + acos(v3.DotProduct(v1));[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"]

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]if[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](fabs(sum - (2*3.14159f)) < 0.1 || intersect == p1 || intersect == p2 || intersect == p3){[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] intersect -= vector(ray.x*radius,ray.y*radius,ray.z*radius);

std::cout<<

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"hit at "[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] << intersect.x << [/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]" "[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] << intersect.y << [/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]" "[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"] << intersect.z << std::endl;[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]else[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"]{[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] std::cout<<

[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"no hit\n"[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"];[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }

}

std::cin.get();



[/size][/font]

[/size][/font][size="2"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]return[/color][/font][/color][/font][/color][/font][font="Consolas"][font="Consolas"](0);[/font][/font][/size]

[font="Consolas"][size="2"][font="Consolas"][size="2"] }

[/size][/font][/size][/font]

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