Comment calculer un déplacement?

Fermé
H0gS Messages postés 266 Date d'inscription dimanche 2 décembre 2007 Statut Contributeur Dernière intervention 10 septembre 2012 - 26 oct. 2011 à 23:31
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 27 oct. 2011 à 14:23
Bonjour à tous,

Voilà, je vous expose mon problème. J'ai écris une méthode qui calcule le déplacement de mon joueur dans un environnement à 3 dimensions. Cela fonction bien, mais les déplacements diagonaux sont plus rapides. Sans doute une logique trigonométrique que je n'ai pas maîtrisée.

Alors, des suggestions?

Code C++
void Player::Move(bool front, bool back, bool left, bool right, float elapsedTime)
{
	// Transformer l'angle Y en radian afin de pouvoir appliquer
	// les formules trigonométriques
	float radY = m_rotY / 180.f * PI;

	// Déterminer la velocité de l'axe X et Z
	float velX = ((left ? -1.f : 0.f) + (right ? 1.f : 0.f)) * elapsedTime;
	float velZ = ((back ? -1.f : 0.f) + (front ? 1.f : 0.f)) * elapsedTime;

	// Déterminer la postion en X et Z avec les cos et les sin
	m_posX+= velZ * sin(radY) + velX * cos(radY);
	m_posZ+= velX * sin(radY) - velZ * cos(radY);
}


m_rotY, m_posX, m_posZ sont respectivement : la rotation en Y du joueur, la position en X du joueur et la position en Z du joueur. En respectant que l'axe des X gère la gauche et la droite, l'axe des Z gère l'avant et l'arrière et l'axe des Y gère le haut et le bas.

Merci de votre collaboration.
Hugo.

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
26 oct. 2011 à 23:58
Je ne vois pas pourquoi tu calcules Y avec une rotation...

Si tu prends ta position réelle (m_posX,m_posY,m_posZ) ton move pourrait être :

void Player::Move(bool front, bool back, bool left, bool right, bool bottom, bool top, float elapsedTime)
{
	m_posX += ((left ? -1.f : 0.f) + (right ? 1.f : 0.f)) * elapsedTime;
	m_posY += ((bottom ? -1.f : 0.f) + (top ? 1.f : 0.f)) * elapsedTime;        
	m_posZ += ((back ? -1.f : 0.f) + (front ? 1.f : 0.f)) * elapsedTime;
}

Evidemment sur ton écran tu ne peux pas avoir de la 3D, donc tu dois prendre en compte ta position sur Z, pour le calcule de affX, et affY. Par exemple :

	float tmpZ = m_posZ/sqrt(2);
	affX = m_posX - tmpZ;
	affY = m_posY - tmpZ;

	plot2d(affX,affY); // peu importe le nom de ta fonction d'affichage
0
H0gS Messages postés 266 Date d'inscription dimanche 2 décembre 2007 Statut Contributeur Dernière intervention 10 septembre 2012 36
27 oct. 2011 à 02:15
Attention... Je ne veut pas que le joueur puisse se déplacer sur les trois axes. Seulement en x et en z.

Vous pouvez le voir comme un jeu FPS.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
27 oct. 2011 à 14:23
J'ai rajouté bottom/top pour être plus général, mais tu peux les enlever ou toujours les mettre à false, ça ne change pas grand chose. Ton m_posy sera donc constant, contrairement à l'affichage en affY qui lui va être modifié vu qu'il dépend de z.
0