본문에 타원 모양을 만들고 상자 2d에서 만드는 방법을 이해할 필요가 없습니다.box2d에서 타원 모양을 만드는 방법은 무엇입니까?
아무 아이디어 나 할 방법 을 사용하여 정점이 많이있는 b2PolygonShape
을 사용하십시오.
본문에 타원 모양을 만들고 상자 2d에서 만드는 방법을 이해할 필요가 없습니다.box2d에서 타원 모양을 만드는 방법은 무엇입니까?
아무 아이디어 나 할 방법 을 사용하여 정점이 많이있는 b2PolygonShape
을 사용하십시오.
** 옵션 # 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 = ▵
// 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);
}
이 도움이 되었습니까 : 당신이 타원의 정점이 있으면, 당신은 같은 일을 할 수 있을까?
이런 소리는 더 많은 경향이있다. 사슬은 다각형 모양의 "솔기"에 달라 붙지 않으며 폴리곤 기반 몸체가 단일 다각형 조명기 인 경우에는 "솔기가 없습니다") 폴리곤을 정의하는 데 매우 동일한 체인 지오메트리를 사용하는 것보다 덜 우아합니다. 하지만, b2_maxpolygonvertices 한계가 있습니다. 그 이상의 타원을 정의하려면 여러 개의 조명기를 사용해야합니다. 또한, 어쨌든 원의 요점은 무엇입니까? 그냥 질량을 직접 설정하고 완전히 사용되지 않는 원 모양을 버리십시오. –
Box2dCode의 노트를 읽으면 is : "b2BlockAllocator가 최대 오브젝트 크기를 가지고 있기 때문에 이것을 너무 많이 늘릴 수 없습니다." b2_maxPolygonVertices 정의의 경우. 또한 객체를 "탄환"으로 설정하고 고정 시간 단계를 사용하여 터널 가능성을 줄입니다. 완벽한 솔루션은 없습니다. 그러나 이것은 효과가있다. – FuzzyBunnySlippers
어쩌면 당신은 원을 필요로하지 않을 것입니다 ... 나는 당신이 사슬 모양을 위해 질량을 설정할 수 없다고 생각했습니다. 나는 그것을 점검 할 것입니다. – FuzzyBunnySlippers
이러한 데모 중 하나에 계란 모양이 있습니다. 아마도 그 모양을 확인할 수 있습니다. http://www.sideroller.com/wck/ – iforce2d
"신장 가능한"원을 정의합니다. 너비가 동일하면 일반적인 원 모양이 사용되고 그렇지 않으면 다각형 근사가 작성됩니다. " 세계 건설 키트의 문서에서 나온 것입니다. 나는 그들이 새로운 일을 끝내기를 바랬다 ... – Pavel
나는 대답을 게시했다. .. 잠깐 생각했다. .. 조금 생각해야했다. ... – FuzzyBunnySlippers