fix not moving

This commit is contained in:
Quaternions 2023-11-16 19:57:50 -08:00
parent d191538aa8
commit 8839b8fbb3
2 changed files with 25 additions and 17 deletions

View File

@ -354,22 +354,26 @@ impl MinkowskiMesh<'_>{
MinkowskiVert::VertVert(self.mesh0.farthest_vert(dir),self.mesh1.farthest_vert(-dir)) MinkowskiVert::VertVert(self.mesh0.farthest_vert(dir),self.mesh1.farthest_vert(-dir))
} }
pub fn predict_collision_in(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{ pub fn predict_collision_in(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{
let start_vert=FEV::<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert>::Vert(self.farthest_vert((-relative_body.clone()).infinity_dir())); (-relative_body.clone()).infinity_dir().map_or(None,|dir|{
let start_vert=FEV::<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert>::Vert(self.farthest_vert(dir));
match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,relative_body,relative_body.time){ match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,relative_body,relative_body.time){
crate::face_crawler::CrawlResult::Closest(fev)=>{ crate::face_crawler::CrawlResult::Closest(fev)=>{
crate::face_crawler::crawl_fev(fev,self,relative_body,relative_body.time,time_limit) crate::face_crawler::crawl_fev(fev,self,relative_body,relative_body.time,time_limit)
}, },
crate::face_crawler::CrawlResult::Hit(_,_)=>None,//already in or passed crate::face_crawler::CrawlResult::Hit(_,_)=>None,//already in or passed
} }
})
} }
pub fn predict_collision_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{ pub fn predict_collision_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{
let start_vert=FEV::<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert>::Vert(self.farthest_vert(relative_body.infinity_dir())); relative_body.infinity_dir().map_or(None,|dir|{
let start_vert=FEV::<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert>::Vert(self.farthest_vert(dir));
match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,&-relative_body.clone(),-time_limit){ match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,&-relative_body.clone(),-time_limit){
crate::face_crawler::CrawlResult::Closest(fev)=>{ crate::face_crawler::CrawlResult::Closest(fev)=>{
crate::face_crawler::crawl_fev(fev,self,&-relative_body.clone(),-time_limit,-relative_body.time).map(|t|(t.0,-t.1)) crate::face_crawler::crawl_fev(fev,self,&-relative_body.clone(),-time_limit,-relative_body.time).map(|t|(t.0,-t.1))
}, },
crate::face_crawler::CrawlResult::Hit(face,time)=>Some((face,-time)), crate::face_crawler::CrawlResult::Hit(face,time)=>Some((face,-time)),
} }
})
} }
pub fn predict_collision_face_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time,contact_face_id:MinkowskiFace)->Option<(MinkowskiEdge,crate::integer::Time)>{ pub fn predict_collision_face_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time,contact_face_id:MinkowskiFace)->Option<(MinkowskiEdge,crate::integer::Time)>{
//no algorithm needed, there is only one state and two cases (Edge,None) //no algorithm needed, there is only one state and two cases (Edge,None)

View File

@ -968,11 +968,15 @@ impl Body{
self.velocity=self.extrapolated_velocity(time); self.velocity=self.extrapolated_velocity(time);
self.time=time; self.time=time;
} }
pub fn infinity_dir(&self)->Planar64Vec3{ pub fn infinity_dir(&self)->Option<Planar64Vec3>{
if self.acceleration==Planar64Vec3::ZERO{ if self.acceleration==Planar64Vec3::ZERO{
self.velocity if self.velocity==Planar64Vec3::ZERO{
None
}else{ }else{
self.acceleration Some(self.velocity)
}
}else{
Some(self.acceleration)
} }
} }
} }