Jump to content
  • Advertisement
Sign in to follow this  
dantheman1337

Adding radius to sphere plane collision

This topic is 2564 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]int

[/font]

[/font]

[/font][font="Consolas"][font="Consolas"] main(){[/font][/font]

[font="Consolas"][font="Consolas"]

[/font]

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

[font="Consolas"][font="Consolas"] 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();



[/font]

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

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



[/font]

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

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



[/font]

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

[font="Consolas"][font="Consolas"]

[/font]

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

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

}



[/font]

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

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

}



[/font]

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

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

}

p = vnorm.DotProduct(playerend) - radius;



[/font]

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

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

}



[/font]

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

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

}



[/font]

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

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

}



[/font]

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

[font="Consolas"][font="Consolas"]

[/font]

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

[font="Consolas"][font="Consolas"] hit =

[/font]

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

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

[/font]

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

[font="Consolas"][font="Consolas"] }



[/font]

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

[font="Consolas"][font="Consolas"] hit =

[/font]

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

[font="Consolas"][font="Consolas"] }



[/font]

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

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

ray = ray.Normalize();



[/font]

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

[font="Consolas"][font="Consolas"] 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();



[/font]

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

[font="Consolas"][font="Consolas"]

[/font]

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

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

[/font]

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

[font="Consolas"][font="Consolas"] }



[/font]

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

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

[/font]

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

[font="Consolas"][font="Consolas"] }

}

std::cin.get();



[/font]

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

[font="Consolas"][font="Consolas"] }

[/font][/font]

Share this post


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



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

[/font]

[/font]

[/font][font="Consolas"][font="Consolas"] main(){[/font][/font]

[font="Consolas"][font="Consolas"]

[/font]

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

[font="Consolas"][font="Consolas"] 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();



[/font]

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

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



[/font]

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

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



[/font]

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

[font="Consolas"][font="Consolas"]

[/font]

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

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

}



[/font]

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

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

}



[/font]

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

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

}

p = vnorm.DotProduct(playerend) - radius;



[/font]

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

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

}



[/font]

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

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

}



[/font]

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

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

}



[/font]

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

[font="Consolas"][font="Consolas"]

[/font]

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

[font="Consolas"][font="Consolas"] hit =

[/font]

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

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

[/font]

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

[font="Consolas"][font="Consolas"] }



[/font]

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

[font="Consolas"][font="Consolas"] hit =

[/font]

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

[font="Consolas"][font="Consolas"] }



[/font]

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

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

ray = ray.Normalize();



[/font]

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

[font="Consolas"][font="Consolas"] 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();



[/font]

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

[font="Consolas"][font="Consolas"]

[/font]

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

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

std::cout<<

[/font]

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

[font="Consolas"][font="Consolas"] }



[/font]

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

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

[/font]

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

[font="Consolas"][font="Consolas"] }

}

std::cin.get();



[/font]

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

[font="Consolas"][font="Consolas"] }

[/font][/font]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!