2011-09-19 3 views
3

J'essaie de créer un objet elliptique dans box2D (Cocos2D). Jusqu'à présent, j'ai utilisé b2CircleShape pour ça mais j'ai réalisé que ça ne va pas le couper plus, je dois avoir un corps en forme elliptique. Est-ce que c'est posible? J'ai essayé avec b2PolygonShape mais mes bords sont linéaires et j'ai besoin qu'ils soient courbés.b2shape Ellipse?

Quelqu'un a-t-il eu le même problème? Aucune suggestion?

+0

Créez-le vous-même? Comme base, j'utiliserais b2CircleShape comme une classe de base et utiliser [ce lien] (http://en.wikipedia.org/wiki/Ellipse#Equations) pour travailler les maths. –

+0

c'est ma dernière option, poing je voulais voir si il y a un moyen plus facile .. Mais comme je le vois maintenant, je pense que je vais devoir créer une classe b2Shape personnalisée .. Je vais attendre quelques jours et si rien ne s'affiche Je vais créer ma propre classe et l'afficher ici comme réponse. – paxx

Répondre

2

Vous pouvez essayer avec une forme de polygone et créer l'ellipse à partir de segments: l'ellipse sera un polygone convexe et vous pouvez ajouter un nombre raisonnable de segments. Ce sera juste une approximation, mais vous pouvez ajuster plus tard le nombre de segments pour vous donner la meilleure ration entre la performance et l'approximation de la forme originale.

0

J'ai aussi utilisé l'approximation. Cela a quelques inconvénients de performance, mais rien de majeur je suppose. Code (Flash ActionScript 3, mais vous devriez être capable de le porter facilement):

var vertices:Vector.<b2Vec2> = new Vector.<b2Vec2>(); 
var a:Number = _image.width/2/PhysicsVals.RATIO; 
var b:Number = _image.height/2/PhysicsVals.RATIO; 
var segments:int = ellipse_approximation_vertices_count; (the more the more precise shape is, but the more time it takes to do collision detection) 

var segment:Number = 2 * Math.PI/segments; 

for (var i:int = 0; i < segments; i++) 
{ 
    vertices.push(new b2Vec2(a * Math.cos(segment * i), b * Math.sin(segment * i))); 
} 

var shape:b2PolygonShape = new b2PolygonShape(); 
shape.SetAsVector(vertices, vertices.length); 

var fixtureDef:b2FixtureDef = new b2FixtureDef();  
fixtureDef.shape = shape;