Comment calculer un déplacement?

H0gS Messages postés 380 Statut Contributeur -  
KX Messages postés 19031 Statut Modérateur -
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 19031 Statut Modérateur 3 020
 
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 380 Statut Contributeur 36
 
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 19031 Statut Modérateur 3 020
 
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