Voir les messages
Pages: [1]
1  Articles / Tutoriaux / Re : [tuto][Wii]Intro à la 3D sur Wii le: 19 Octobre 2010, 10:08:26
Je viens de voir ce topic, et je dis bravo Smiley
Ca va en aider plus d'un a faire de la 3d pour la Wii.
Reste plus qu'une chose : les lumières

Lasouze
2  Divers Developpement / Idées de Projets / Re : Recherche prog Itouch (rémunération) le: 17 Septembre 2010, 09:04:20
Salut, je ne suis pas un développeur Itouch, donc ne je propose pas ma candidature, juste des petites remarques (il m'est arrivé de regarder du code 'objectiv-C' qui est le code de l'Iphone/l'Itouch):

Le contrôle a l'accéléromètre ça risque de rendre le jeu injouable vu qu'ici la précision du "fairy" est plus qu'importante. Peu-être autoriser le l'accéléromètre et le toucher d'écran pour le déplacement, après les utilisateurs choisirons.

Il manque, mais c'est mon point de vu, une petite bandeau en haut pour indiqué l'avancement dans le niveau.
Voir même dans ce bandeau mettre des petits point bleu/rouge/vert/noir pour indiquer le nombre de cristal restant a venir.

Si le décor reste aussi simple, la réalisation des niveau reste très simple, donc très rapide à faire. Limiter a 6 niveaux c'est pas beaucoup.

Enfin, pour ceux que ca intéresse, il est possible de programmer sur Pc pour l'iPhone/Itouch via un petit tuto en anglais :
http://modmyi.com/forums/iphone-ipod-touch-sdk-development-discussion/15087-how-develop-native-apps-iphone-v1-1-1-a.html

Lasouze
3  Nintendo DS/GBA / Aide au développement / Re : Problème de saut/rebond le: 16 Septembre 2010, 08:14:10
Oula, je me suis donc très mal expliqué, je suis le seul a m'être compris Grin

Désolé donc, je recommence, voila le code que je voulais expliquer, beaucoup plus simple et mieux commenté

Code: (cpp)
    while(Collision(persox,persoy,plat1x,plat1y))  //Si il y a collision avec l'autre sprite
    {
   persoy +=1; // on le fait monter pour eviter toute penetration   
   vy = 40; // on initialise a une valeur
    }

    vy-=2;//  Vitesse += Force*dt, avec Force = -9.81 (la gravité) et dt = 1/4, arrondi ca fait 2

    vy = Clamp(vy, -40, 40); // on limite vy entre -40 et +40

    persoy += vy >> 2 ; // Position += Vitesse*dt, avec toujours dt = 1/4

Le "while" plutôt que le "if" du debut permet d'éviter toute pénétration intempestive du joueur sur ton "plat"
; parceque si vy =40, alors vy >>2  = 10, donc ton perso touchera le "plat" avec une pénétration de plus de 1, tu auras beau faire un persoy +1 cela ne suffira pas, d'ou l'utilisation d'un while ("tant que" dans le premier message) pour répéter le décalage jusqu'à supprimer la pénétration.

Les 4 "if" successif était présent pour expliquer le "décalage" à appliquer, il ne faut par faire les "if" + le décalage de bit, c'est l'un ou l'autre, mais pas les 2. Ici, cela a été simplifié par " persoy += vy >> 2 ;"

De plus,  +40 et -40 ca fait peut-être beaucoup, mais la c'est toi qui choisie le résultat final souhaité Smiley

Je pense avoir été plus claire cette fois

Lasouze
4  Nintendo DS/GBA / Aide au développement / Re : Problème de saut/rebond le: 15 Septembre 2010, 16:26:49
Pour T4ils : code tode pour la gravité à oublié un détail :
Vitesse += force*dt
Position += Vitesse*dt

Alors que tu a écris :
Position +=Vitesse

Pour réponde à la question :
Si tu trouves qu'il se déplace trop vite, fait le decalage avec une variable intermediaire clampée

Code: (cpp)
int vy;
Tant que (Collision(persox,persoy,plat1x,plat1y))  //Si il y a collision avec l'autre sprite
{
   persoy +=1; // on le fait monter pour eviter toute penetration   
   vy = 10; // on initialise a une valeur
}

vy --; // on decroit vy
if(vy < -10) vy = -10; // on limite vy

// Ci-dessous c'est pas très beau, mais ca fera une petit parabole
int decalage = -2;
if(vy > -5) decalage = -1;
if(vy > -3) decalage = 0;
if(vy > 2) decalage = 1;
if(vy > 4) decalage = 2;

persoy += decalage ; // Deplacement du perso

Tu n'aura plus tes pb de téléportation, et le "rebond" sera plus jolie

Au lieu de faire tout les if (ils sont ici pour expliquer), tu peux  faire un décalage de bit pour simuler une division par 4, mais sans virgule.
10 /4 = 2
4/ 4 = 1
2 / 4 = 0
...

Code: (cpp)
decalage  = vy >> 2;


Dans ce cas, le persoy += decalage c'est en faite Position +=Vitesse*dt, ou dt = 1/4
Lasouze
5  Nintendo DS/GBA / Aide au développement / Re : Re : Caracteristique technique 3D de la NDS le: 09 Septembre 2010, 09:07:24
Des infos sur les formats de textures dans gba tek :
http://nocash.emubase.de/gbatek.htm#ds3dtextureformats
Je ne connais pas le format 5 compressé mais ça à l'air assez spécifique à la DS quand même

Merci c'est exactement ce que je cherchais.
En réalité, en lisant les explications, c'est une adaptation du S3TC en fonction des limitations de la ds. (un peut comme la wii la adapter a ses besoins)
D'après mes calcules, une texture de 256x256 en 16000 couleurs (avec gestion de la transparence) ne tiendrait alors que 24ko (data + palette incluse)!

Lasouze
6  Nintendo DS/GBA / Aide au développement / Re : Caracteristique technique 3D de la NDS le: 08 Septembre 2010, 09:07:58
Oui Foxy, c'est ce que je voulais demander Smiley puissance de 2 ou multiple de 2.
Donc la réponse est puissant de 2 !

Une dernière petite question pour la route:
Je sais que la wii utilise un système similaire au S3TC pour la compression des images cablé directement dans le hardware. J'ai chercher dans les exemples de devkitpro, dans la palib aussi mais j'ai pas trouvé sur le format compressé des images pour la nds.

Est-ce la meme chose que la wii ? Avez-vous des liens (même en anglais), au des exemples d'utilisation des images au format compressé pour la nds?

Merci

Lasouze
7  Wii/NGC / Aide au développement / Re : [Résolu] Faire de la 3D sur Wii le: 07 Septembre 2010, 15:49:19
Tu as trouvé finalement, bravo

Peux-tu donner ton erreur/correctif, ca sera certainement instructif pour les autres (et ca m'eviterra de chercher   Azn)

Merci

Lasouze
8  Nintendo DS/GBA / Aide au développement / Re : Caracteristique technique 3D de la NDS le: 07 Septembre 2010, 12:50:13
J'ai toutes les répondes, merci Smiley

Lasouze
9  Nintendo DS/GBA / Aide au développement / Caracteristique technique 3D de la NDS le: 07 Septembre 2010, 11:05:00
Bonjour à tous,

j'ai cherché sur le net (merci google) les capacités techniques de la nds, surtout sur la 3D, mais ce que j'ai trouvé va en contradition sur certain site.
Je me pose donc plein de questions.
Alors, avis aux expert, voici mes questions :

La nds est limité à 2048 tri (ou 1024 quad) par frames ?
A 30 ou à 60 fps ? Et avec le 2eme écran pour la 2D ?
Il n'est pas possible de charger un texture de plus de 256x256 (question de mémoire vidéo)?
D'ailleurs, c'est forcement une texture avec une taille en multiple de 2 ?
Il est possible de faire des callLists, combien maximum au total  (question de mémoire vidéo/ram)?
On peut vraiment définir 10 lumières différentes (meme si je n'en utiliserais que 2) sans ralentir la nds?

Merci de vos "lumières" Smiley

Lasouze
10  Wii/NGC / Aide au développement / Re : Faire de la 3D sur Wii le: 27 Août 2010, 10:56:54
Si tu me donne ton code, je trouverais peu-etre plus vite que toi ce qui manque

Lasouze
11  Wii/NGC / Aide au développement / Re : Faire de la 3D sur Wii le: 25 Août 2010, 12:56:46
Dans mon cas, oui a toute les frame :
C'est pour un objet à mesh dynamique (un modèle avec animation par squelette)

Sinon, rien n'empêche de jouer sur la camera (avec la matrice de vue) pour déplacer les light et les mesh static, et donc ne jamais recalculer les normales pour gagner niveau perfs.

En plus, dans mon cas le calculer des normales est bancale, en théorie il faudrait faire cela plus compliqué :
1 - On commence par init à zero les normales de tout les vertex.
2 - Ensuite, pour chaque face du mesh, on calcul une normal, et on l'adittionne à la normal de chaque vextex de la face.
3 - Enfin, on normalise chaque vextex du mesh.

La c'est déjà plus juste, mais c'est beaucoup plus lent

Lasouze
12  Wii/NGC / Aide au développement / Re : Faire de la 3D sur Wii le: 25 Août 2010, 10:30:21
Pour les couleurs, la lumière et les les normales je peux peut-être t'aider

Dans mon moteur ca se passe en plusieurs étape :
Init du moteur

et a chaque frame
Begin scene
Init de la camera
init light
Rendu des objets
End scene.

Voici mon code, c'est pas le plus clair, ni le plus commenté, il n'est "en théorie" que pour moi.

Ps : les variables *Vertices et *Indices représentent un Vertex Buffer et un Index Buffer
Ca pourra peu-etre t'aider

Init du moteur
Code: (cpp)
m_nbframe = 0;
m_curr_fb = 0;

VIDEO_Init(); // init the vi. setup frame buffer and set the retrace callback

switch (VIDEO_GetCurrentTvMode ())//VideoMode = VIDEO_GetPreferredMode(NULL);
{
case VI_NTSC: VideoMode = &TVNtsc480IntDf; break;
case VI_PAL : VideoMode = &TVPal528IntDf;  break;
case VI_MPAL: VideoMode = &TVMpal480IntDf; break;
default     : VideoMode = &TVNtsc480IntDf; break;
}


void *gp_fifo = NULL; // setup the fifo and then init the flipper
gp_fifo = memalign(32,DEFAULT_FIFO_SIZE);
memset(gp_fifo,0,DEFAULT_FIFO_SIZE);

xfb[0] = MEM_K0_TO_K1(SYS_AllocateFramebuffer(VideoMode));
xfb[1] = MEM_K0_TO_K1(SYS_AllocateFramebuffer(VideoMode));

VIDEO_Configure(VideoMode);
VIDEO_SetNextFramebuffer(xfb[m_curr_fb]);
VIDEO_SetBlack(FALSE);
VIDEO_Flush();
VIDEO_WaitVSync();
if(VideoMode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
console_init(xfb[m_curr_fb],0,0,VideoMode->fbWidth,VideoMode->xfbHeight,VideoMode->fbWidth*VI_DISPLAY_PIX_SZ);

GX_Init(gp_fifo,DEFAULT_FIFO_SIZE);

// clears the bg to color and clears the z buffer
//GXColor background = {0x8f, 0xbf, 0xf0, 0xff};
GXColor background = {0x00, 0x00, 0x00, 0xff};
GX_SetCopyClear(background, 0x00ffffff);


// other gx setup
GX_SetViewport(0,0,VideoMode->fbWidth,VideoMode->efbHeight,0,1);
f32 yscale = GX_GetYScaleFactor(VideoMode->efbHeight,VideoMode->xfbHeight);
u32 xfbHeight = GX_SetDispCopyYScale(yscale);
GX_SetScissor(0,0,VideoMode->fbWidth,VideoMode->efbHeight);
GX_SetDispCopySrc(0,0,VideoMode->fbWidth,VideoMode->efbHeight);
GX_SetDispCopyDst(VideoMode->fbWidth,xfbHeight);

GX_SetCopyFilter(VideoMode->aa,VideoMode->sample_pattern, true ? GX_TRUE : GX_FALSE, VideoMode->vfilter);
GX_SetFieldMode(VideoMode->field_rendering,((VideoMode->viHeight==2*VideoMode->xfbHeight)?GX_ENABLE:GX_DISABLE));

GX_CopyDisp(xfb[m_curr_fb],GX_TRUE);
GX_SetDispCopyGamma(GX_GM_1_0);

//SYS_SetResetCallback(reload); // fonction a appeler en cas de "reload"...
//SYS_SetPowerCallback(shutdown); // fonction a appeler en cas de "shutdown"...

//-------------------- POSITION AND COLOR ------------------------//
// setup the vertex descriptor
GX_InvVtxCache();
GX_InvalidateTexAll();
GX_ClearVtxDesc();
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_NRM, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);

           
    // setup the vertex attribute table
    //setup vtxfmt 0 texture
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGB8, 0);

//setup vtxfmt EVT_1TCOORDS
GX_SetVtxAttrFmt(GX_VTXFMT1, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR0, GX_CLR_RGBA, GX_RGB8, 0);
            GX_SetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);

            //setup vtxfmt EVT_2TCOORDS           
GX_SetVtxAttrFmt(GX_VTXFMT2, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT2, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT2, GX_VA_CLR0, GX_CLR_RGBA, GX_RGB8, 0);           
GX_SetVtxAttrFmt(GX_VTXFMT2, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
            GX_SetVtxAttrFmt(GX_VTXFMT2, GX_VA_TEX1, GX_TEX_ST, GX_F32, 0);

        // Init du pad manager
CPADManager::Instance().Initialize();

// Init de la carte SD
__io_wiisd.startup();
        int ret;
        ret = fatMountSimple("sd", &__io_wiisd);

Begin scene
Code: (cpp)

GX_SetViewport(0,0,VideoMode->fbWidth,VideoMode->efbHeight,0,1);
GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
GX_SetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR);
GX_SetCullMode (GX_CULL_NONE);

//disable light
GX_SetChanCtrl(GX_COLOR0A0,GX_DISABLE,GX_SRC_REG,GX_SRC_VTX,GX_LIGHTNULL,GX_DF_CLAMP,GX_AF_NONE);

Init de la camera
Code: (cpp)
    TVector2I size = GetScreenSize();
    Mtx perspective;
    guPerspective(perspective, 60, (f32)size.x/size.y, 1.0F, 32000.0F);
    GX_LoadProjectionMtx(perspective, GX_PERSPECTIVE);
   
        Camera3D->MatView3D.LookAt(Camera3D->CameraPos,  Camera3D->CameraPos +  Camera3D->CameraDir);
        Camera3D->MatView3D_bis = Camera3D->MatView3D*Camera3D->Rotationx*Camera3D->Rotationy*Camera3D->Rotationz;

init light
Code: (cpp)
GXLightObj lightObj;
GXColor lightColour = { 255, 255, 255, 255 };
GX_InitLightPos(&lightObj, Light->Position.x, Light->Position.y, Light->Position.z);
GX_InitLightColor(&lightObj, lightColour);
//GX_InitLightDir(&lightObj, 0, 1, 0);

GX_InitLightSpot(&lightObj, 0.0f, GX_SP_OFF);
GX_LoadLightObj(&lightObj, GX_LIGHT0);

// Set up lighting
GX_SetNumChans(Light->Number + 1);

unsigned int Number = GX_LIGHT0 + Light->Number;
 
GX_SetChanCtrl(GX_COLOR0A0, TRUE, GX_SRC_REG, GX_SRC_REG, Number, GX_DF_CLAMP, GX_AF_SPOT);

GXColor amb = {Light->Ambient.x*0xFF, Light->Ambient.y*0xFF, Light->Ambient.z*0xFF, Light->Ambient.w*0xFF };
GXColor mat = { 255, 255, 255, 255 };
GX_SetChanAmbColor(GX_COLOR0A0, amb);
GX_SetChanMatColor(GX_COLOR0A0, mat);

Rendu des objets : init, load texture, calcul des normal, rendu.
init :
Code: (cpp)
GX_SetNumChans(1); // Melange des couleurs ok (entre autre la lumiere)

GX_SetNumTexGens(0);
GX_SetNumTevStages(0);
GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
load texture :
Code: (cpp)
GX_SetNumTevStages(m_liste_texture.size());
        GX_SetNumTexGens(m_liste_texture.size());

// Declaration
GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);

                GX_SetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
                GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);   //GX_DECAL ou GX_MODULATE ou GX_REPLACE ou GX_BLEND



// Chargement de la texture
if(Texture->texObj == NULL)
{
            Texture->texObj = (GXTexObj*) memalign(32, sizeof(GXTexObj));
    GX_InitTexObj(Texture->texObj, MEM_K0_TO_K1((void*)Texture->data), Texture->width, Texture->height, Texture->fmt, GX_CLAMP, GX_CLAMP, GX_FALSE);

        }
       
        GX_LoadTexObj(Texture->texObj, GX_TEXMAP0);

calcul des normal :
Code: (cpp)
 
for(unsigned int i = 0; i < (*Indices).Size; i++)
{
          // on calcule 2 vecteur formant les bord du triangle
TVector3F vertorA =  (*Vertices)[(*Indices)[i].y].Vertex - (*Vertices)[(*Indices)[i].x].Vertex;
TVector3F vertorB =  (*Vertices)[(*Indices)[i].z].Vertex - (*Vertices)[(*Indices)[i].x].Vertex;
        // on calcule la normale
TVector3F tmpNormal = vertorA.Cross(vertorB);
tmpNormal.Normalize();

(*Vertices)[(*Indices)[i].x].Normal = tmpNormal;
(*Vertices)[(*Indices)[i].y].Normal = tmpNormal;
(*Vertices)[(*Indices)[i].z].Normal = tmpNormal;
}

rendu :
Code: (cpp)

           
       GX_Begin(GX_TRIANGLES, GX_VTXFMT1, Count * 3);




for(unsigned int i = 0; i < Count; i++)
{

CRenderer::TVertex* VIx = &(*Vertices)[(*Indices)[i].x];
CRenderer::TVertex* VIy = &(*Vertices)[(*Indices)[i].y];
CRenderer::TVertex* VIz = &(*Vertices)[(*Indices)[i].z];
                                                             
            GX_Position3f32((f32) VIx->Vertex.x,(f32) VIx->Vertex.y,(f32) VIx->Vertex.z);
GX_Normal3f32((f32) VIx->Normal.x,(f32) VIx->Normal.y,(f32) VIx->Normal.z);           
            GX_Color3f32((f32) VIx->Color.x,(f32) VIx->Color.y,(f32) VIx->Color.z);
            for(unsigned int j = 0;j<m_liste_texture.size();j++) GX_TexCoord2f32((f32) VIx->CoordTex.x,(f32) VIx->CoordTex.y);

            GX_Position3f32((f32) VIy->Vertex.x,(f32) VIy->Vertex.y,(f32) VIy->Vertex.z);
GX_Normal3f32((f32) VIy->Normal.x,(f32) VIy->Normal.y,(f32) VIy->Normal.z);
            GX_Color3f32((f32) VIy->Color.x,(f32) VIy->Color.y,(f32) VIy->Color.z);
for(unsigned int j = 0;j<m_liste_texture.size();j++) GX_TexCoord2f32((f32) VIy->CoordTex.x,(f32) VIy->CoordTex.y);

GX_Position3f32((f32) VIz->Vertex.x,(f32) VIz->Vertex.y,(f32) VIz->Vertex.z);
GX_Normal3f32((f32) VIz->Normal.x,(f32) VIz->Normal.y,(f32) VIz->Normal.z);
GX_Color3f32((f32) VIz->Color.x,(f32) VIz->Color.y,(f32) VIz->Color.z);
for(unsigned int j = 0;j<m_liste_texture.size();j++) GX_TexCoord2f32((f32) VIz->CoordTex.x,(f32) VIz->CoordTex.y);


}
GX_End();

end scene :
Code: (cpp)

GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
GX_SetColorUpdate(GX_TRUE);
GX_CopyDisp(xfb[m_curr_fb],GX_TRUE);
GX_DrawDone();

VIDEO_SetNextFramebuffer(xfb[m_curr_fb ^ 1]);

if(m_nbframe == 0) VIDEO_SetBlack(FALSE);

VIDEO_Flush();
// VIDEO_WaitVSync(); -> limite a N frame

m_curr_fb ^= 1;
m_nbframe ++;
Lasouze
13  Wii/NGC / Aide au développement / Re : Re : Faire de la 3D sur Wii le: 24 Août 2010, 10:49:09
Pour l'histoire du squelette, c'est possible de faire des frames à partir d'un squelette ? C'est à dire avoir sur son PC un modèle 3D facilement modifiable ? Ou faut tout refaire pour chaque frame ?

Il existe pour blender des script sur le net.
Personnellement j'ai utilisé le script d'export au format MD5 (Doom3) qui utilise l'animation par squelette.
Ici un script pour exporter depuis blender en format MD5, avec un exemple en plus :
http://home.mnet-online.de/der/blender2md5.rar

Après il y a plein d'exemple qui permet d'importer et d'animer un modele MD5 sur le net en C++ /OpenGL.
Par exemple ici http://jeux.developpez.com/sources/opengl/?page=modeles
Le convertir en code wii et alors très simple : l'opengl et le GX sont tres semblable dans le principe et dans le nom de fonction.

Aujourd'hui j'ai mis en pose mon projet Wii pour un projet XBox. Mais je reviendrais certainement en 2011 dessus afin de le finir, et le proposer à la communauté. (un mix en Mario Galaxy et Portal )

En attendant, si je peux etre utile Smiley
Lasouze
Pages: [1]