Utilisation des cameras pour la projection et la creation du tronc de pyramide visuel. I Definition Les cameras de 3ds ont un format 24x36mm, c'est a dire que l'image vu par la camera a une taille de 24mm de haut et de 36mm de large. On peut adapter differents objectifs sur une camera. Le parametre d'un objectif est la distance focal. Cette distance caracterise la lentille (lens), ou le jeux de lentilles utilise par l'objectif, elle s'exprime en mm. Appelons cette distance lens. /| / | 24mm F / | x-------|--x | ( F : foyer ) lens | / | / 36mm |/ Ces donnees suffisent a decrire une camera, mais on defini un autre parametre a partir des precedents, le champ de vision (field of view, fov). Le champ de vision correspond a l'angle au sommet du triangle isocel de base une diagonale de l'image 24x36 et de sommet F. Calcule du champ de vision : sqrt((24/2)^2+(36/2)^2) 36mm ______<------> ----------- en se placant dans le plan du triangle : \ ^ / | /| \ | / | | / | 24mm lens\ | x / --\--|-/--- \ |__/ \|/ \ | / x F \v/ x F sqrt((24/2)^2+(36/2)^2) x = arctan ----------------------- lens -- -- | sqrt((24/2)^2+(36/2)^2) | en degres fov = 2 * arctan | ----------------------- | * ( 180 / Pi ) | lens | -- -- Les valeurs obtenu differes legerement de celle obtenu par 3DS, si quelqun sait pourquoi qu'il me contact. On peut aussi calculer le champ de vision horizontale, angle au sommet du triangle isocel de base le segment reliant le milieu des deux hauteurs de l'image, et de sommet F. h_fov = 2 * arctan ( (36/2) / lens ) * ( 180 / Pi ) On peut aussi calculer le champ de vision vecticale, angle au sommet du triangle isocel de base le segment reliant le milieu des deux largeurs de l'image, et de sommet F. v_fov = 2 * arctan ( (24/2) / lens ) * ( 180 / Pi ) II Projection Nous supposons ici que nous avons une scene, c'est a dire des points dont les coordonnees sont exprimees dans l'espace camera. Je ne m'ettant pas sur le sujet beaucoup de docs parlent de transformations, et de cameras. Nous voulons voir notre scene au travers de la camera, la technique utilise est la projection : ( dans le plan XoZ ) | x F x | x---------|---------------------- lens | | Thales assure que : x_image = ( lens / z_espace ) * x_espace ( de meme ) y_image = ( lens / z_espace ) * y_espace (x_image,y_image) represante les coordonnees dans notre image 24x36mm du point de coordonnees (x_espace,y_espace,z_espace). Bien sur le support "image 24x36" est virtuel, nous travaillons avec une image qui est un champ de pixel et hauteur height et de longueur width. Il faut donc exprimer les coordonnees "image 24x36" en coordonnees dans notre champ de pixel, en fait cela reviens a convertir des mm en pixel. Nous devons definir deux rapport, un horizontale et l'autre verticale car le champ de pixel n'aura pas forcement un aspect 3:2 (ie proportionel a l'image 24x36 ). h_pixel_ratio = width / 36.0 v_pixel_ratio = height / 24.0 Pour passer du mm au pixel sur l'horizontale, on multiplie par h_pixel_ratio. Pour passer du mm au pixel sur la vertical, on multiplie par v_pixel_ratio. Une formule pour projeter les points sur notre champ de pixel : x_pixmap = h_pixel_ratio * ( lens / z_espace ) * x_espace y_pixmap = v_pixel_ratio * ( lens / z_espace ) * y_espace III Plans de Coupures Cette partie concerne la definition des plans de coupures pour le clipping 3d. Un plan peut etre definie par sa normal et sa distance par rapport a l'origine Quand on relie les quatres coins de l'image 24x36mm au foyer on obtien un tronc de pyramide, il est possible d'utiliser les plans de ce tronc comme plan de coupures de notre scene. Les plans sont decrit dans l'espace camera, donc la distance de chaque plan sera nulle. Ici je me contente de donner les formules, elle sont "tres" simple a obtenir avec un minimmum de rigueur, en dessinant le tronc de pyramide et en decomposant chaque normal suivant les trois axes. On regarde la projection des normales sur les axes et les angles forme avec, les angles sont en fait h_fov et v_fov. Plan de coupure droit, normale oriente du cote visible : x = sin ( ( 180 - scene->camera->h_fov ) * pi / 360.0 y = 0.0 z = cos ( ( 180 - scene->camera->h_fov ) * pi / 360.0 Plan de coupure gauche, normale oriente du cote visible : x = - sin ( ( 180 - scene->camera->h_fov ) * pi / 360.0 y = 0.0 z = cos ( ( 180 - scene->camera->h_fov ) * pi / 360.0 Plan de coupure haut, normale oriente du cote visible : x = 0.0 y = sin ( ( 180 - scene->camera->v_fov ) * pi / 360.0 z = cos ( ( 180 - scene->camera->v_fov ) * pi / 360.0 Plan de coupure bas, normale oriente du cote visible : x = 0.0 y = -sin ( ( 180 - scene->camera->v_fov ) * pi / 360.0 z = cos ( ( 180 - scene->camera->v_fov ) * pi / 360.0 Remarque : j'utilise h_fov - 0.1 et v_fov - 0.1 a cause des erreur d'arrondis en basse resolution ( ce probleme doit etre regle avec plus de rigueur ) Marmouze Toutes remarques, critiques, suggestions sont les bien venus . Contact : Marmouze@altavista.net IRCNET #demofr #codefr #linuxscn