2009-05-18 8 views
0

Comment un modèle 3D est-il traité dans une unité?
Quand j'ai un modèle aléatoire que je veux adapter dans mon port de vue je ne sais pas s'il est trop grand ou pas, si je dois le traduire pour être au milieu ...
Je pense qu'un objet 3d pourrait avoir c'est propre origine.Modèle 3D à intégrer dans la fenêtre d'affichage

Répondre

0

Désolé, votre question est très floue. Je suppose que vous voulez centrer un modèle 3D sur une fenêtre. Vous pouvez y parvenir en calculant la boîte englobante du modèle. Pour ce faire, parcourez tous les polygones et obtenez les coordonnées X/Y/Z minimum/maximum. La boîte de délimitation donnée par les points (min_x,min_y,min_z) et (max_x,max_y,max_z) contiendra le modèle entier. Vous pouvez maintenant centrer le modèle en regardant le centre de cette boîte. Avec quelques calculs supplémentaires (en fonction de votre FOV), vous pouvez également obtenir les bordures gauche/droite/supérieure/inférieure à l'intérieur de votre fenêtre.

+0

i grabé un modèle aléatoire sur Internet et je voulais le montrer dans opengl pour l'apprentissage, mais je ne vois rien, mais en tordant un peu, je peux voir un mouvement, donc j'ai essayé de l'escalader bas, c'est un peu mieux, donc je voulais savoir comment je pourrais obtenir les limites du modèle comme vous l'avez dit pour s'adapter au modèle à mon avis – CiNN

2

Vous devez trouver un volume englobant, une forme qui entoure tous les sommets de l'objet, pour votre objet plus facile à utiliser que l'objet lui-même. Les sphères sont souvent utilisées pour cela. Soit l'artiste peut définir la sphère dans le cadre des informations du modèle, soit vous pouvez l'élaborer au moment de l'exécution. Calcul de la sphère optimale est très difficile, mais vous pouvez obtenir une bonne approximation en utilisant les éléments suivants:

determine the min and max value of each point's x, y and z 
    for each vertex 
    min_x = min (min_x, vertex.x) 
    max_x = max (max_x, vertex.x) 
    min_y = min (min_y, vertex.y) 
    max_y = max (max_y, vertex.y) 
    min_z = min (min_z, vertex.z) 
    max_z = max (max_z, vertex.z) 

sphere centre = (max_x + min_x)/2, (max_y + min_y)/2, (max_z + min_z)/2 
sphere radius = distance from centre to (max_x, max_y, max_z) 

En utilisant ce domaine, déterminer la position du monde qui permet la sphère à visualiser en pleine - géométrie simple déterminera ce .

0

«j'ai donc essayé de le réduire »

La meilleure chose à faire dans cette situation est de ne pas transformer votre modèle du tout! Laisse-le. Ce que vous voulez changer, c'est votre appareil photo.

Commencez par calculer la zone de délimitation de votre modèle quelque part dans l'espace 3D.

Ensuite, calculez le rayon en prenant le maximum (aabb.max.x-aabb.min.x, aabb.max.y-aabb.min.y, aabb.max.z-aabb.min.z). C'est brut, mais ça fait le travail.

Pour centrer l'objet dans la fenêtre, placez la caméra sur la position de l'objet. Si Y est votre axe avant, soustrayez le rayon de Y. Si Z est l'axe avant, soustrayez-le à la place. Soustrayez un facteur de fudge pour que vous passiez le mauvais plan près du plan afin que votre modèle ne soit pas découpé. J'utilise des quaternions dans mon moteur avec une belle méthode lookat(). Appelez donc lookat() et passez au centre de la boîte englobante. Voila! Votre objet est centré dans la fenêtre, quel que soit son emplacement dans le monde. Cela place toujours l'axe de la caméra aligné, vous pouvez donc avoir envie de transformer la caméra en espace modèle, soustrayez le rayon, puis regardez à nouveau le centre. Ensuite, vous regardez toujours l'arrière du modèle. La clé est toujours le lookat().

Voici un exemple de code de mon moteur. Il vérifie pour voir si nous essayons d'encadrer un morceau de terrain statique, si c'est le cas d'une hauteur, d'une lumière ou d'un maillage statique. Un visuel est tout ce qui attire dans la scène et il existe des dizaines de types différents. Une instance Visual :: Instance est une copie du visuel, ou où le dessiner.

void EnvironmentView::frameSelected(){ 
    if(m_tSelection.toInstance()){ 
    Visual::Instance& I = m_tSelection.toInstance().cast(); 
    Visual* pVisual = I.toVisual(); 
    if(pVisual->isa(StaticTerrain::classid)){ 
     toEditorCamera().toL2W().setPosition(pt3(0, 0, 50000)); 
     toEditorCamera().lookat(pt3(0)); 
    }else if(I.toFlags()->bIsLight){ 
     Visual::LightInstance& L = static_cast<Visual::LightInstance&>(I); 
     qst3& L2W = L.toL2W(); 
     const sphere s(L2W.toPosition(), L2W.toScale()); 
     const f32 y =-(s.toCenter()+s.toRadius()).y(); 
     const f32 z = (s.toCenter()+s.toRadius()).y(); 
     qst3& camL2W = toEditorCamera().toL2W(); 
     camL2W.setPosition(s.toCenter()+pt3(0, y, z));//45 deg above 
     toEditorCamera().lookat(s.toCenter()); 
    }else{ 
     Mesh::handle hMesh = pVisual->getMesh(); 
     if(hMesh){ 
     qst3& L2W = m_tSelection.toInstance()->toL2W(); 
     vec4x4 M; 
     L2W.getMatrix(M); 
     aabb3 b0 = hMesh->toBounds(); 
     b0.min = M * b0.min; 
     b0.max = M * b0.max; 
     aabb3 b1; 
     b1 += b0.min; 
     b1 += b0.max; 
     const sphere s(b1.toSphere()); 
     const f32 y =-(s.toCenter()+s.toRadius()*2.5f).y(); 
     const f32 z = (s.toCenter()+s.toRadius()*2.5f).y(); 
     qst3& camL2W = toEditorCamera().toL2W(); 
     camL2W.setPosition(L2W.toPosition()+pt3(0, y, z));//45 deg above 
     toEditorCamera().lookat(b1.toOrigin()); 
     } 
    } 
    } 
} 
Questions connexes