2013-05-27 2 views
0

, 난 그냥이 그것을 제거하고있는 중이 야에 대한 충돌을 받고 :강체를 제거하지만, 여전히 강체를 제거하는 올바른 방법을 무엇

void removeRigidBody(btDynamicsWorld* pDynamicsWorld, btRigidBody* rb) 
{ 
    pDynamicsWorld->removeRigidBody(rb); 
    delete rb->getMotionState(); 
    delete rb; 
} 

그러나 개체는 여전히 후 pDynamicsWorld->getCollisionObjectArray()에 나타납니다 내가 할일 pDynamicsWorld->stepSimulation

이상한 충분히 이상한 ARM, x86에서 발생하지 않습니다.

+0

공식 포럼에서 버그를 물어볼 수 있습니까? – zeller

+0

@ zeller 나는 그렇지 않다. 그래서 이것은 알고있는 한 올바른 방법이다? – weston

+0

@zeller 지금 물어 보았습니다 : http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=9129 감사합니다. – weston

답변

0

이것은 대부분의 버그와 마찬가지로 어리석은 실수입니다. 그것을 읽는 데 시간이 걸린 사람들에게 미안합니다.

오류는 실제로 jni가 removeRigidBody를 호출 한 일부 java에있었습니다. 물론 어떤 != 0 정수가 유효한 주소가 될 수 있도록

if (body.id > 0) { 

id는, 실제로 btRigidBody 주소의 int로 캐스트입니다. x86에서 어드레스는 <이었고 다른 디바이스에서는> 0이었습니다.

+1

정말 버그였습니다. 그냥 총알이 아니라 코드에 :) – zeller

1

사실, 이것이 내가 찾은 것입니다. 코멘트에 코드를 게시하는 것은 끔찍하게 보일 것입니다.

 //remove the rigidbodies from the dynamics world and delete them 
    int i; 
    for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) 
    { 
      btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; 
      m_dynamicsWorld->removeCollisionObject(obj); 
      delete obj; 
    } 

그래서 충돌 개체에서 본문을 제거합니다.

+0

고마워, 나는 그 장면을 주었지만,'removeRigidBody'는'removeCollisionObject'를 (btDiscreteDynamicsWorld'에서) 어쨌든 호출하기 때문에 아무런 차이가 없었습니다. – weston

+0

저는 총알 v281을 사용하는 지역 gamedev 포럼의 누군가에게 물었습니다. 그리고 그것은 분명히 정상적인 행동이 아니라고 말했습니다. 그게 내가 도울 수있는 한, 총알 포럼에서 답을 얻을 수 있기를 바랍니다. – zeller

+0

당신의 노력에 감사드립니다, 그것은 어리석은 버그였습니다, 제발 내 대답을 참조하십시오. – weston