Salut tout le monde,
Y a un truc qui me tracasse pas mal en ce moment : est-ce que quelqu'un pourrait m'expliquer le "principe" que l'on utilise pour qu'un perso qui se balade dans un décors 3d suive la dénivelation du terrain ????
merci.
Salut tout le monde,
Y a un truc qui me tracasse pas mal en ce moment : est-ce que quelqu'un pourrait m'expliquer le "principe" que l'on utilise pour qu'un perso qui se balade dans un décors 3d suive la dénivelation du terrain ????
merci.
Simplement en affectant lui donnant la même hauteur que le point du terrain sur lequel il se trouve.
Si ton terrain est un quadrillage régulier (très probablement construit avec une heightmap) alors le calcul est très simple, sinon il faut aller voir du côté de la détection de collision et de la physique.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
mon terrain est construit sous max, donc pas de heightmap...
que faire alors ?
Tu peux balancer un rayon vers le bas, et voir quel est le point d'intersection avec ton modèle.
Évidemment ça suppose d'avoir une subdivision spatiale de ta scène pour que ça ne soit pas trop couteux.
Mon site web | Mon blog | Mes photos | Groupe USA
> BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
> presse la touche caps lock, stp
> OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA
Ce sujet m'intéresse également et j'ai quelques questions.
Pour la heightmap, est ce qu'il y a déjà un format de fichier prévu pour DirectX ?
Ca me semble assez couteux en CPU comme solution justement, non ?Tu peux balancer un rayon vers le bas, et voir quel est le point d'intersection avec ton modèle.
Quand on exporte le fichier en .X, il n'y a pas une boite de collision ou quelque chose dans le genre pour faire un calcul de collision ?
J'en profite pour poser une autre question très subjective : quel est le moteur physique le plus adapté pour DirectX 9 selon vous ? (est ce ODE ? je sais qu'il "colle" bien avec OpenGL mais c'est du non objet...)
Merci
La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.
Non, une heightmap est simplement un fichier contenant un quadrillage de hauteurs. Typiquement une image en niveaux de gris.Pour la heightmap, est ce qu'il y a déjà un format de fichier prévu pour DirectX ?
Avec une structure de partitionnement apropriée, non. De toute façon quelle autre méthode utiliserais-tu pour trouver la hauteur d'un point sur ton terrain ?Ca me semble assez couteux en CPU comme solution justement, non ?
Je ne crois pas, mais D3DX fournis des fonctions pour calculer des englobants. Mais ça ne suffira pas, pour le terrain ; il faut taper dans l'octree ou le quadtree.Quand on exporte le fichier en .X, il n'y a pas une boite de collision ou quelque chose dans le genre pour faire un calcul de collision ?
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Désolé mais n'étant pas un spécialiste, tu peux m'en dire plus la dessus stp ?Je ne crois pas, mais D3DX fournis des fonctions pour calculer des englobants. Mais ça ne suffira pas, pour le terrain ; il faut taper dans l'octree ou le quadtree.
Sinon, si vous vous ennuyez ( lol ) j'ai encore deux où trois autres petits pb... si qqu'un a deux minutes à perdre !!!
voilà, j'ai intégré du bump mapping dans mon prog mais le pb c'est qu'il entre en conflict avec mon brouillard ( je craque ), ça fait un bon bout de temps que je suis là dessus et comme je ne maitrise pas trop les texturestage ( je pense que ça vient de là ) et bien je ne sais pas comment y remèdier...
voici mon pb illustré :
sans bump
et avec bump ( le brouillard n'apparait plus sur le sol )
et maintenant le code de l'affichage du sol :
je sais c'est long, mais pour des pros comme vous tous ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 VOID Afficher_Sol() { for( DWORD i=0; i<sol_mesh.dwNumMaterials; i++ ) { g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO ); g_pd3dDevice->SetMaterial( &sol_mesh.Materials[i] ); // Stage 0 : texture de base avec heigh map dans l'alpha channel g_pd3dDevice->SetTexture( 0, m_pEmbossTexture ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); // Stage 1 passes through the RGB channels (SELECTARG2 = CURRENT), and // does a signed add with the inverted alpha channel. The texture coords // associated with Stage 1 are the shifted ones, so the result is: // (height - shifted_height) * tex.RGB * diffuse.RGB g_pd3dDevice->SetTexture( 1, m_pEmbossTexture ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE|D3DTA_COMPLEMENT ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT ); sol_mesh.Mesh->DrawSubset( i ); // on restore les render state g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); } }
thx
C'est une question d'algorithmie ; il faut faire comme le Greg a dit une subdivision spatiale.Envoyé par conrad
Si le sol c'est un polygone subdivisé lui-même en liste de triangles (" triangles list" ) ce qui est généralement le cas , alors on peut par exemple faire la moyenne entre les élévations Z des 3 côtés et voir si les coordonnées de l'objet à tester sont proches de ce point.
Pour les "height maps" , ce sont des matrices 4x4 , pareil il suffit de faire une moyenne entre les coordonnées en Z des points qui définissent les côtés des quadrilatères.
Je crois que cela s'appelle faire une interpolation .
ok mais pour réaliser ce genre d'op on est bien obligé de bloquer le vertexbuffer pour obtenir les infos du mesh non ? donc on perd énorme en perf... Mais je veux bien qu'on m'explique !!!Si le sol c'est un polygone subdivisé lui-même en liste de triangles (" triangles list" ) ce qui est généralement le cas , alors on peut par exemple faire la moyenne entre les élévations Z des 3 côtés et voir si les coordonnées de l'objet à tester sont proches de ce point.
Envoyé par SteelBox
désolé de cette réponse laconique consulter le SDK et l'aide
Sinon il faut jouer sur les dimensions ; par exemple si l'objet fait 100 unités de hauteur , 50 de largeur etc., 75 de longueur etc....
A ce moment-là on en déduit facilement le centre .
Il suffit de tester si la distance entre le centre + hauteur /2 par exemple et la hauteur moyenne du sol est inférieure à une certaine valeur arbitraire.
A moins de faire un simulateur de vol très sophistiqué pas besoin de grande précision non plus.
Même les collisions des avions avec le sol ou les objets dans Ms Flight Simulator 2004 ne sont pas toujours précises
tu n'es pas obligé de le faire en temps réel.Envoyé par conrad
Ta structure de collision peut-etre séparée des informations de rendu et
avoir été précalculée et optimisée pour une réponse rapide. Cela marche bien pour un paysage purement statique (c'est le cas qui arrive le plus souvent dans les jeux).
Mon site web | Mon blog | Mes photos | Groupe USA
> BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
> presse la touche caps lock, stp
> OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA
Conrad pour le problème que tu exposes et d'après le code que tu donnes ( attention je suis pas trop spécialiste Direct 3D ) , dans la fonction afficher_sol , tu charges des textures et tu fais un "height map".
Mais tu n'as pas de contrôle sur le terrain affiché , du moins tu ne peux accéder aux coordonnées .
Donc le mieux c'est de charger un fichier de données supplémentaires contenant les valeurs moyennes de chaque élément du quadrillage ( la moyenne des 4 côtés de chaque facette ) .
Pour obtenir ce fichier de données il faut se créer un petit utilitaire qui calcule les élévations des points du quadrillage ;
ça va te donner une série d'altitudes Z en coordonnées X, Y.
Après en fonction de cela pour chaque objet mémorisé dans une liste , tu regardes si les coordonnées de cet objet est proche de cette altitude moyenne.
Le top c'est de se développer son propre éditeur de terrain avec des "height maps" qui te permettra de calculer les élévations nécessaires ( c'est ce que je ferais )
hop
pensez à mon pb de bump aussi
hop
thx
Si tu veux vraiment apprendre des choses sur le pourquoi et le comment, une bonne référence (en anglais):
http://realtimecollisiondetection.net/
C'est un bouquin écrit par Christer Ericson qui a fait plusieurs jeux pour Sony et c'est beaucoup plus complet que toutes les réponses que tu pourras obtenir sur un forum.
Pour tes images de bump, 1 - désolé mais je vois deux images toutes noires, soit il y a un bug dans ton image soit tes niveaux sont trop bas.
2 - difficile de deviner quelle est ton erreur sans avoir une idée du code, de la technique utilisée etc..
Edit: Ah ben t'as rajouté le code
Mon site web | Mon blog | Mes photos | Groupe USA
> BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
> presse la touche caps lock, stp
> OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA
thx pour le lien
sinon je sais que c jamais bien pratique de donner deux pauvres exemples et 3 lignes de code mais je craque complet ben hop, je me dis qu'un petit miracle peut tjrs arriver lol
( ps : j'ai augmenté à mort la luminosité des images, j'espère que c plus lisible maintenant... )
Questions habituelles (celles que tout développeur devrait se poser avant de poster une question ici) :
- que dit le debug runtime ?
- est-ce que le résultat est le même avec le refrast ? Si oui, assurez-vous d'avoir les derniers drivers de votre carte graphique ou renseignez-vous sur les caps (capabilities de votre carte graphique).
Mon site web | Mon blog | Mes photos | Groupe USA
> BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
> presse la touche caps lock, stp
> OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager