2011-01-01 4 views
1

그래서 Triangle-> AABB 충돌 알고리즘이 있으며 AABB가 충돌 한 삼각형을 반환합니다. 나는 삼각형의 3 개의 벡터를 기대하고 있었고 이동의 방향/크기에 따라 편향된 벡터를 결정할 수 있었기 때문에 각도에서 벽을 향해 달리면 충돌 각도에 따라 더 느리게 움직일 수 있었지만 벽. 이렇게하면 충돌이없는 경우에만 움직이는 끈적한 충돌 문제가 제거됩니다. 어떤 제안이나 참고 사항이라도 대단히 감사하겠습니다! 감사.방향/크기 벡터와 충돌 삼각형을 기반으로 방향/크기 벡터를 편향시킬 수 있습니까?

답변

0

삼각형의 법선을 따라 속도 성분을 제거합니다.

아이디어는 움직임을 삼각형으로 "들어가는"부분과 나머지 부분 (수직 방향으로)으로 표현할 수 있다는 것입니다. 그런 다음 나머지 부분 만 움직이면 더 이상 움직임에 의해 삼각형에 가까이 갈 수 없게됩니다 (또는 그 이상의 경우에는 충돌을 감지해서는 안됩니다). 의사 코드에서

: 이렇게하면 바로 그것을 실행할 때 매우 빠르게 벽을 따라 미끄러 만들 것 같은이 의도적으로, 움직임 벡터의 크기를 보존하지 않는

// v := velocity vector of moving object 
// p[3] := points that make up the triangle 

triangle_normal = cross(p[2]-p[0], p[1]-p[0]) 
problematic_v = project(v, onto=triangle_normal) 
safe_movement = v - problematic_movement 

참고.

자세한 내용과 멋진 사진은 가마 수트라 Pool Hall Lessons: Fast, Accurate Collision Detection Between Circles or Spheres을 참조하십시오. 당신은 구체를 사용하지 않지만 충돌을 일으키지 않기 때문에 본질적으로 완벽한 플라스틱을 만들고 있습니다.

+0

흠, 내가 너를 따라갈 지 모르겠다. 삼각형 벡터를 정규화하고 방향/크기를 빼면 아무 것도하지 않는 것처럼 보입니다. 좀 좀 더 정교하게 만들어 주시겠습니까? – JeanOTF

+0

크기와 방향의 삼각형과 벡터는 모두 3 차원입니다. – JeanOTF

+1

"정상"과 "정규화"가 실제로는 관련이없는 단어 인 것은 아닙니다. 나는 갱신 할 것이다. – me22

0

먼저 크기/방향을 벡터로 변환합니다 (훨씬 편리합니다).

그리고 (C++) :

float towards=dot(velocity,norm); // velocity component into triangle 
if(towards<0)      // is moving into triangle 
    velocity-=towards*norm;   // remove component 

그런 다음 삼각형으로 이동할 수 없습니다. towards<0은 평소에 따라 바꿔야 할 수도 있습니다. 그것을 밀어내는 스프링 힘을 갖는 것도 좋은 일입니다.

+0

불행히도이 두 가지 해결책 중 어느 것도 나에게 효과가 없었습니다. 나는 계속 추측해야한다. – JeanOTF

관련 문제