2012-04-05 5 views
2

본문에 타원 모양을 만들고 상자 2d에서 만드는 방법을 이해할 필요가 없습니다.box2d에서 타원 모양을 만드는 방법은 무엇입니까?

아무 아이디어 나 할 방법 을 사용하여 정점이 많이있는 b2PolygonShape을 사용하십시오.

+2

이러한 데모 중 하나에 계란 모양이 있습니다. 아마도 그 모양을 확인할 수 있습니다. http://www.sideroller.com/wck/ – iforce2d

+1

"신장 가능한"원을 정의합니다. 너비가 동일하면 일반적인 원 모양이 사용되고 그렇지 않으면 다각형 근사가 작성됩니다. " 세계 건설 키트의 문서에서 나온 것입니다. 나는 그들이 새로운 일을 끝내기를 바랬다 ... – Pavel

+0

나는 대답을 게시했다. .. 잠깐 생각했다. .. 조금 생각해야했다. ... – FuzzyBunnySlippers

답변

5

** 옵션 # 1 **

두기구로 몸을 사용하여 첫 번째는 몸에게 약간의 질량을 제공하기 위해 중앙 원형 모양이 될 것입니다. 두 번째는 타원이 될 것이고, 꼭지점은 체인 모양으로 만들어집니다.

첫 번째 고정 장치를 사용하면 몸체를 약간의 질량으로 몸을 움직일 수 있으며 두 번째 고정 장치를 사용하면 충돌을 적절하게 처리 할 수 ​​있습니다.

나는 최근에 룰렛 바퀴를 예로 들어 보았습니다. 나는 그것을 만들기 위해 아래 코드를 게시했다. 반지름 (OUTER_RADIUS)에 대한 상수 값을 타원에 대한 반경의 극형으로 바꿉니다 found here on wikipedia.

void MainScene::CreateBody() 
{ 
    const float32 INNER_RADIUS = 2.50; 
    const float32 OUTER_RADIUS = 3.0; 
    const float32 BALL_RADIUS = 0.1; 
    const uint32 DIVISIONS = 36; 

    Vec2 position(0,0); 

    // Create the body. 
    b2BodyDef bodyDef; 
    bodyDef.position = position; 
    bodyDef.type = b2_dynamicBody; 
    _body = _world->CreateBody(&bodyDef); 
    assert(_body != NULL); 

    // Now attach fixtures to the body. 
    FixtureDef fixtureDef; 
    fixtureDef.density = 1.0; 
    fixtureDef.friction = 1.0; 
    fixtureDef.restitution = 0.9; 
    fixtureDef.isSensor = false; 

    // Inner circle. 
    b2CircleShape circleShape; 
    circleShape.m_radius = INNER_RADIUS; 
    fixtureDef.shape = &circleShape; 
    _body->CreateFixture(&fixtureDef); 

    // Outer shape. 
    b2ChainShape chainShape; 
    vector<Vec2> vertices; 
    const float32 SPIKE_DEGREE = 2*M_PI/180; 
    for(int idx = 0; idx < DIVISIONS; idx++) 
    { 
     float32 angle = ((M_PI*2)/DIVISIONS)*idx; 
     float32 xPos, yPos; 

     xPos = OUTER_RADIUS*cosf(angle); 
     yPos = OUTER_RADIUS*sinf(angle); 
     vertices.push_back(Vec2(xPos,yPos)); 
    } 
    vertices.push_back(vertices[0]); 
    chainShape.CreateChain(&vertices[0], vertices.size()); 
    fixtureDef.shape = &chainShape; 
    _body->CreateFixture(&fixtureDef); 

} 

또한 룰렛 (플러스 사진 선하심) 솔루션 this post을 확인할 수 있습니다.

옵션 2 체인/에지 모양 대신에 조명기의 삼각형 팬을 만들 수 있습니다.

b2Vec2 triVerts[3]; 
triVerts[0] = Vec2(0,0); 
for(int idx = 1; idx < vertices.size(); idx++) 
{ 
    b2PolygonShape triangle; 
    fixtureDef.shape = &triangle; 
    // Assumes the vertices are going around 
    // the ellipse clockwise as angle increases. 
    triVerts[1] = vertices[idx-1]; 
    triVerts[2] = vertices[idx]; 
    triangle.Set(triVerts,3); 
    _body->CreateFixture(&fixtureDef); 
} 

이 도움이 되었습니까 : 당신이 타원의 정점이 있으면, 당신은 같은 일을 할 수 있을까?

+0

이런 소리는 더 많은 경향이있다. 사슬은 다각형 모양의 "솔기"에 달라 붙지 않으며 폴리곤 기반 몸체가 단일 다각형 조명기 인 경우에는 "솔기가 없습니다") 폴리곤을 정의하는 데 매우 동일한 체인 지오메트리를 사용하는 것보다 덜 우아합니다. 하지만, b2_maxpolygonvertices 한계가 있습니다. 그 이상의 타원을 정의하려면 여러 개의 조명기를 사용해야합니다. 또한, 어쨌든 원의 요점은 무엇입니까? 그냥 질량을 직접 설정하고 완전히 사용되지 않는 원 모양을 버리십시오. –

+0

Box2dCode의 노트를 읽으면 is : "b2BlockAllocator가 최대 오브젝트 크기를 가지고 있기 때문에 이것을 너무 많이 늘릴 수 없습니다." b2_maxPolygonVertices 정의의 경우. 또한 객체를 "탄환"으로 설정하고 고정 시간 단계를 사용하여 터널 가능성을 줄입니다. 완벽한 솔루션은 없습니다. 그러나 이것은 효과가있다. – FuzzyBunnySlippers

+0

어쩌면 당신은 원을 필요로하지 않을 것입니다 ... 나는 당신이 사슬 모양을 위해 질량을 설정할 수 없다고 생각했습니다. 나는 그것을 점검 할 것입니다. – FuzzyBunnySlippers

관련 문제