2014-09-01 1 views
6

저는 Bullet 물리 엔진을 사용하여 3D 세계를 만들려고합니다.지상 충돌을 피하십시오. Bullet

나는 그의 몸에 캡슐 모양으로 내 캐릭터를 가지고와 내 땅 그의 일부 정적 진영으로 만든 것은 여기 내 말을 설명하기 위해 스키마가 함께 스틱 : enter image description here

문제가있을 때 내를 한 블럭에서 다른 블럭으로 달리는 캐릭터 : 블릿은 충돌을 감지하고 캐릭터는 y- 축에서 조금씩 뛰기 시작합니다.

어떻게하면 문제를 피할 수 있습니까? 나는이 문제를 극복하기 위해 무슨 짓을

+0

x 축에서 충돌 블록이 겹 칩니 까? – axelduch

+1

글 머리 기호에 box2d와 같은 가장자리 (체인) 모양이 있습니까? – LearnCocos2D

+0

aduch : 블록 1 오른쪽 가장자리 = 블록 2 왼쪽 가장자리. 따라서,/ @ LearnCocos2D : Nop,하지만 캡슐 모양을 상자 모양으로 대체하려고 시도했지만 모든 것이 더 좋았습니다. 이상한 점은 Oo – user30088

답변

14

는 다음과 같습니다 :

지상에 캡슐 슬라이드를 대신에, 나는 봄의 상단에 동적 캡슐 타고 있었다. 나는 봄을 캡슐 바닥에서 시작된 여러 개의 광선으로 구현했습니다. 스프링의 길이는 0.5 미터 이하 였고 캡슐을 잡아 당겨 땅바닥으로 밀었습니다. 그립/당기기가 중요하므로 캐릭터가 예기치 않게 뛰지 않습니다. 스프링의 뻣뻣함은 얼마나 큰 소리를 내는지를 제어합니다. 캡슐은 암시 적으로 구현 계단과 슬로프를 걸어

  • 수레 이후

    은 다음과 같은 효과

    • 바닥에 기하학의 가장자리 원하지 않는 충돌이 있었다. 봄은 계단의 계단 위로 "올라서"캐릭터 캡슐을 밀어 올립니다.
    • 점프의 구현은 봄이지면의 그립을 풀어 몸에 충동을주는 문제였습니다.
    • 점프 또는 낙하 후의 착륙 캐릭터는 예상대로 자동으로 "무릎 굽힘"을 표시합니다.
    • 일반적으로 수직 운동이 원활하게 부드럽게 진행됩니다. 엘리베이터 플랫폼에서와 같이.
    • 내리막 길로 달릴 때도 그립/당김으로 인해 캐릭터가 "날기"시작하지 않을 것입니다 (일부 게임에서는 경험할 수 있습니다).
    • 더킹 문자 = 스프링 및/또는 캡슐의 길이를 줄입니다.
    • 내리막 슬라이딩? 당신은 스프링 히트의 레이 캐스팅의 바닥 부분의 각도를 확인하여 완전히 제어 할 수 있습니다.

    나는 봄의 강성, 봄의 길이, 그립의 길이 등으로 많이 놀아야했지만, 결국 이것은 얼마나 간단하고 잘 작동하는지에 대해 매우 행복했다.

  • +1

    그것은 매력처럼 작동합니다! 감사 : D – user30088

    +1

    이봐, 나는 그게 얼마 동안인지 알지만, 정확히 봄은 무엇입니까? 제 말은 총알이나 물리학 개념의 수업입니까? Google은별로 도움이되지 않았다 –

    +1

    내가 이것을했을 때 Bullet 2.7x에는 기본 제공되는 스프링 구현이 없었습니다. 그래서 저는 스프링스 물리학을 Google에서 읽고 직접 읽었습니다. 어쨌든 세부 사항에 대한 더 많은 통제가 필요하다. 스프링을 댐핑하는 것과 같은 일을한다. –

    0

    발신자가 "Internal Edge Collision"입니다. 방금 몇 시간 전에 해결책을 찾았습니다. btHeightfieldTerrainShape를 사용하는 경우이 문제를 해결하려면 btBvhTriangleMeshShape를 사용해야합니다.

    여기가 답입니다.

    이 콜백 추가 : pGround이 어디

    static bool CustomMaterialCombinerCallback(btManifoldPoint& cp,const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) 
    { 
        btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); 
        return true; 
    } 
    
    extern ContactAddedCallback gContactAddedCallback; 
    

    는 그 뒤 btBvhTriangleMeshShape를 생성하고이 코드를 추가하려면 btBvhTriangleMeshShape :

    // Enable custom material callback 
    pGround->setCollisionFlags(pGround->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); 
    
    btTriangleInfoMap* triangleInfoMap = new btTriangleInfoMap(); 
    btGenerateInternalEdgeInfo(pGroundShape, triangleInfoMap); 
    

    아니면 BulletInternalEdgeDemo 예를 열 수 있습니다 구현하는 방법을 볼 수 그것은 상세히.

    +0

    이 솔루션을보다 일반적인 경우로 확장하는 방법 (btBvhTriangleMeshShape 외)? – cppBeginner

    +0

    아니요, 할 수 없습니다. 그것은 btBvhTriangleMeshShape에서만 작동합니다. –

    관련 문제