2010-08-02 21 views
4

J'ai un programme simple, il dessine un cercle:/ Cela fonctionne bien ...Calculer les sommets d'un cercle

for (k = 1; k < n+1+1; k++){ 
vertices[k].color = GU_COLOR(0.0f, 0.0f, 1.0f, 0.0f); 
vertices[k].x = cos_d(360 - ((k-1) * dstep)); 
vertices[k].y = sin_d(360 - ((k-1) * dstep)); 
vertices[k].z = 0.0f; 
} 
... 
//Now draw it 
sceGumDrawArray(GU_TRIANGLE_FAN, GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D, n+1+1, 0, vertices); 

Mais cela ne veut pas:

for (k = 1; k < n+1+1; k++){ 
vertices[k].color = GU_COLOR(0.0f, 0.0f, 1.0f, 0.0f); 
vertices[k].x = cos_d(((k-1) * dstep)); 
vertices[k].y = sin_d(((k-1) * dstep)); 
vertices[k].z = 0.0f; 
} 

Mais shouldn n'est-ce pas la même chose - juste avec la différence que la première boucle calcule les sommets dans le sens des aiguilles d'une montre et la seconde dans le sens inverse des aiguilles d'une montre? C'est juste bizarre que ça ne dessine pas les sommets en utilisant le second exemple ...

Ou suis-je stupide?

+0

Si vous pouvez exécuter ceci dans un débogueur, ou imprimer les valeurs à l'écran, alors vous voudrez regarder les valeurs que vous calculez. Regardez ce qui est introduit dans cos_d/sin_d, et voyez si les valeurs sont ce que vous attendez. Une fois que vous faites cela, alimentez ces valeurs dans cos_d/sin_d, et comparez-les avec les types de valeurs que vous attendez, ou comparez-les aux valeurs crachées par une calculatrice scientifique. –

+0

La raison pour laquelle vous voulez vous habituer à cela est que la programmation graphique nécessite un ** lot ** de maths, et est ** vraiment ** facile à se tromper. Les instructions d'impression du débogueur ou du débogage sont le seul moyen de ne pas devenir fou :) –

Répondre

2

Pas vraiment sûr comment vous dessinez le cercle (je vous vois la création d'une liste de sommets, mais ne sais rien au sujet de la prestation de ceux-ci), mais:

Habituellement, lorsque vous inversez de la droite vers le sens antihoraire , vous finissez par obtenir le normal inversé, ce qui signifie que vous regardez à l'arrière de votre cercle. Et, comme c'est le cas avec la plupart des API, lorsque vous regardez à l'arrière de quelque chose (qui n'a pas de volume), il n'est pas rendu.

Cela s'appelle la suppression de la face arrière.

0

Je ne connais pas la bibliothèque que vous utilisez, mais êtes-vous sûr de ne pas mélanger les radians et les degrés dans votre code? Les fonctions sin et cos prennent-elles des radians ou des degrés?

+0

Il est peu probable que ce soit le problème étant donné que cela fonctionne d'une façon. J'imagine que le «_d» de «cos_d» signifie «degrés». – Troubadour

6

Il ne peut pas être dessiné à cause de back-face culling. "Si l'utilisateur a spécifié que les polygones orientés vers l'avant ont un enroulement dans le sens horaire, si le polygone projeté sur l'écran a un enroulement dans le sens inverse des aiguilles d'une montre, il a été pivoté pour ne pas être tiré."

+0

C'est exactement la raison à mon humble avis. Je ne peux pas comprendre quoi que ce soit d'autre – valdo

+0

Une façon de vérifier cela est de désactiver l'élimination de la face arrière (si cela est possible dans le SDK PSP). Une autre façon consiste à déplacer votre caméra de l'autre côté de l'objet, et voir si elle commence à dessiner :) –

0

Vraisemblablement dstep est 360/n? Pour ce qui est de l'esthétique, avec GL_TRIANGLE_FAN, vous voulez probablement que votre premier point soit le centre du cercle.