Création d'une entité qui suit la caméra (vue 3eme personne)
Partie Jeu :
J'ai consacré une partie de ma soirée à essayer de faire apparaitre une entité qui suivrait les mouvements de caméra. Tout d'abord rien ne vaut une vidéo afin d'illustrer mes propos.
Et donc l'explication pour arriver à ses fins :
Tout d'abord, il faut reprendre les anciennes sources (cf ancien post). A partir de là l'incorporation va être rapide car toutes les initialisations sont faites (et la caméra aussi normalement. Dans le cas présent on partira du systeme de coordonnées présent dans le tutorial (pour la caméra) ce qui permettra d'avoir une base commune).En premier lieu il faut déclarer l'entité :
// On declare le persoAvec ses coordonnées :
TrueVision3D.TVMeshClass Perso;
//Varialbe DirectX pour position/vecteur and coe (évite de tout gérer à la main)Voici un raccourci assez appréciable pour ce qui est des coordonnées, angles, ... (nous verrons les différentes applications possibles dans la suite du post).
DxVBLibA.D3DVECTOR PersoPosition;
Cette technique évite les longueurs telles :
float sngPositionX;
float sngPositionY;
float sngPositionZ;
float sngLookatX;
float sngLookatY;
float sngLookatZ;
float sngAngleX;
float sngAngleY;
Par la suite on passe le système d'angle en degré (en même temps que la déclaration pour l'affichage des FPS) :
//On passe en degréEn même temps créé l'entité Perso :
TV.SetAngleSystem(CONST_TV_ANGLE.TV_ANGLE_DEGREE);
Perso = new TVMeshClass();Il y a certainement moultes manières plus rapide mais celle-ci marche.
Perso = (TVMeshClass)Scene.CreateMeshBuilder("perso");
Perso.CreateBox(2, 1, 1, false);
On texture ce cube :
TextureFactory.LoadTexture("Resources\\hmap.bmp", "PersoTex", -1, -1, CONST_TV_COLORKEY.TV_COLORKEY_NO, true, true);
Perso.SetTexture(Globals.GetTex("PersoTex"), -1);
Maintenant que le cube est créé (existe dans le code) il faut s'occuper de son positionnement afin qu'il s'affiche correctement.
A la suite on met :
//Position de départ du persoIci, sngPosition désigne la position de la caméra (comme définit dans le tutorial).
PersoPosition.x = sngPositionX + 5;
PersoPosition.z = sngPositionZ + 5;
PersoPosition.y = sngPositionY;
Dans la fonction Check_movement il faut rajouter :
PersoPosition.x = sngPositionX + (float)(System.Math.Cos((double)sngAngleY) * 7);Afin de calculer la position du cube par rapport à la caméra.
PersoPosition.z = sngPositionZ + (float)(System.Math.Sin((double)sngAngleY) * 7);
PersoPosition.y = Land.GetHeight(PersoPosition.x, PersoPosition.z) + 3;
Et enfin il faut mettre à jour (toujours dans check_movement) :
Perso.SetPosition(PersoPosition.x, PersoPosition.y, PersoPosition.z);Comme vous pouvez le voir le raccourci utilisé au depart ( DxVBLibA.D3DVECTOR PersoPosition) permet de gérer les postions et rotations, ce qui est amplement suffisant pour garder notre entité en vue.
Perso.SetRotation(-90f + ((float)sngStrafe * 10f), ((float)sngAngleY * -57.295f), 0f);
Si vous souhaitez voir le code dans sa totalité rendez-vous ICI
Je n'ai malheureusement pas avancé dans la programmation du moteur réseau, je suis pour le moment occupé par divers travaux.
Prochainement le chargement d'un model pour remplacer le cube.
Aucun commentaire:
Enregistrer un commentaire