Bonjour,
je souhaite rendre un mesh dans une texture. Comment calculer les dimensions de la texture afin qu'elle soit proportionelle à la taille du mesh à l'écran ?
Version imprimable
Bonjour,
je souhaite rendre un mesh dans une texture. Comment calculer les dimensions de la texture afin qu'elle soit proportionelle à la taille du mesh à l'écran ?
Tu peux calculer la taille de la boîte englobante de ton modèle à l'écran. En C++, il faut utiliser D3DXComputeBoundingBox pour calculer la boîte englobante, et D3DXVec3Project pour projeter un point 3D à l'écran.
Ok, j'ai calculé ma bounding box qui me retourne 1 vecteur min et un max...
J'ai transformé ces 2 vecteurs grace à la fonction Vector3.Project en utilsant le viewport de mon device...
Mais ensuite je suis bloqué. J'ai bien essayé tout un tas de manip sur les vecteurs de transformations mais aucune d'elle ne m'a donné un résultat satisfaisant.
Quelle opération dois-je effectuer aprés la transformation des vecteurs pour obtenir la taille 2D de ma boundingbox a l'écran ?
Tu calcules la différence entre les coordonnées 2D min et max, et tu fais un max (ou un min selon tes besoins) entre X et Y.
Bon, ca fait 2 jours que je me prends la tête avec ce calcul est impossible de réussir à calculer les coordonnées écrans. Dés que je bouge la camera les resultats sont complétement abérants :mur:
Si quelqu'un a un exemple concret je suis preneur ;)
Donc vu que je n'y arrive pas j'ai tenté de contourner le problème en rendant le postshader sur un mesh transparent légèrement plus grand que l'original. ca fonctionne bien mais le problème est que si je m'éloigne trop avec la caméra les faces du mesh transparent clignotent. Y'a-t-il un moyen d'éviter ce clignotement ?
Tu peux nous montrer le code ?Citation:
Bon, ca fait 2 jours que je me prends la tête avec ce calcul est impossible de réussir à calculer les coordonnées écrans. Dés que je bouge la camera les resultats sont complétement abérants
Tu cherches à faire quoi en fait ?Citation:
Donc vu que je n'y arrive pas j'ai tenté de contourner le problème en rendant le postshader sur un mesh transparent légèrement plus grand que l'original
Sûrement un problème de Z-Fight. Quels sont les paramètres de ta matrice de projection ?Citation:
ca fonctionne bien mais le problème est que si je m'éloigne trop avec la caméra les faces du mesh transparent clignotent. Y'a-t-il un moyen d'éviter ce clignotement ?
Je vais le réécrire et je le posteraisCitation:
Envoyé par Laurent Gomila
Voilà le résultat pour l'instant :Citation:
Envoyé par Laurent Gomila
http://img357.imageshack.us/img357/5...00154ii.th.png
En fait je voulais faire une atmosphere pour la planète et ca marche plutôt bien avec le mesh transparent. Mais a terme je voudrais utiliser des effets comme le bloom mais ciblé sur certains mesh seulement c'est pour ca que j'ai besoin de cette fonctionalité dans mon moteur.
Voici mes paramètres actuels pour la projection :Citation:
Envoyé par Laurent Gomila
FOV = 60°
AspectRatio = 1.33
NearPlane = 0.1
FarPlane = 100000.0
Très joli (enfin les textures haute résolution ça aide beaucoup ;)).Citation:
Voilà le résultat pour l'instant :
Tu ne peux pas appliquer ce genre de post-process sur ton backbuffer tel quel ? Pourquoi as-tu besoin d'ajuster une texture pour chaque mesh ? (note que ceci est une vraie question, pas une remarque détournée).Citation:
En fait je voulais faire une atmosphere pour la planète et ca marche plutôt bien avec le mesh transparent. Mais a terme je voudrais utiliser des effets comme le bloom mais ciblé sur certains mesh seulement c'est pour ca que j'ai besoin de cette fonctionalité dans mon moteur.
Essaye de relever le near, je ne pense pas que tu aies besoin de 0.1 pour une vue aussi distante.Citation:
Voici mes paramètres actuels pour la projection :
FOV = 60°
AspectRatio = 1.33
NearPlane = 0.1
FarPlane = 100000.0
Tu m'étonnes :D Mais autant je plaide coupable sur la skybox (2048*2048) autant la texture de la planête n'a qu'une réso de 512*512. En fait elle est scalée déformée est appliquée x fois en transparence ce qui permet d'avoir un grands nombres de détails même en zoomant a fond dessus sans pour autant utiliser des texture de 4096*2048 :lol:Citation:
Envoyé par Laurent Gomila
Oui bien sur, c'est la première chose que j'ai faite mais comme je voyage dans la scene (ya 10 planetes, plein d'autres meshs) et que j'ai essayé de conserver des proportions réalistes, la majorité du temps je n'aurais besoin d'appliquer mon post que sur des meshs trés éloignés donc trés petits... Du coup passer dans le shader le buffer alors que l'effet ne s'applique qu'a 1/100 de sa taille c'est assez peu optimisé question performance.Citation:
Envoyé par Laurent Gomila
Bon ca marche nickel avec le nearplane à 1.0. Je n'avais pas penser a la modifier comme un abruti :aie:Citation:
Envoyé par Laurent Gomila
Problème résolu, ou bien tu veux qu'on regarde ton code de calcul de coordonnées écran ? ;)
Pour mon enrichissement personnel et aussi (et surtout) parceque je déteste ne pas savoir je le posterais dés que je l'aurais réécrit :D
Allez hop je l'ai refaite rapido :D
Code:
1
2
3
4
5
6
7
8
9 Vector3 vMin = Vector3.Project(NXModels.ModelsLoaded[ModelIndex].BBoxMin, NXEngine.NX3DDevice.Viewport, NXMatrix.Projection, NXMatrix.View, WorldMatrix); Vector3 vMax = Vector3.Project(NXModels.ModelsLoaded[ModelIndex].BBoxMax, NXEngine.NX3DDevice.Viewport,NXMatrix.Projection, NXMatrix.View, WorldMatrix); Vector3 vPos = Vector3.Project(Position, NXEngine.NX3DDevice.Viewport, NXMatrix.Projection, NXMatrix.View, WorldMatrix); float Width = Math.Max(vMax.X, vMin.X); float Height = Math.Max(vMax.Y, vMin.Y); Rectangle Result = new Rectangle((int)(vPos.X - Width / 2), (int)(vPos.Y - Height / 2), (int)Width, (int)Height); NXDebug.Messages.Add(Result.ToString());
Ton calcul du rectangle me paraît étrange. Pourquoi pas plus simplement :
Code:
1
2
3
4
5
6
7
8 float Left = Math.Min(vMin.x, vMax.x); float Top = Math.Min(vMin.y, vMax.y); float Width = Math.Abs(vMin.x - vMax.x); // syntaxe au pif :) float Height = Math.Abs(vMin.y - vMax.y); Rectangle Result = new Rectangle((int)Left, (int)Top, (int)Width, (int)Height); // Et tu n'as pas besoin de projeter la position de ton objet