PDA

Voir la version complète : WIP coffee c++ - C4D et le territoire



oli_d
30/04/2008, 19h23
"La french m'a tout donné, il est temps pour moi de tout lui rendre !"

Nicolas Sarcoffee

Voilà je lance un WIP-tuto-prise de tête qui consiste à transformer C4D en véritable outil de modélisation du territoire. Le but étant de sortir un série de plugins, probablement tous gratuit...

Vaste programme, vous pouvez réserver vos places pour les 10 prochaines années..

Voilà ou j'en suis aujourd'hui :

1er module : importe les modèles numériques de terrain ou de surface au format ASCII :

http://campus.hesge.ch/eil/e-eil/od/c4dGIS/mnt.jpg

à Genève nous avons toute la région avec un maillage de 1m disponible à des prix très abordables. Ceci est le modèle numérique de terrain, mais il y a aussi le modèle de surface avec la végétation et les bâtiments. Le modèle de surface est valable de loin, de près vous voyez que les bâtiments "bavent" un peu beaucoup.

http://campus.hesge.ch/eil/e-eil/od/c4dGIS/mns.jpg

Les terrains sont géoréférencés, c'est à dire que si vous en importez plusieurs ils vont automatiquement se placer au bon endroit.

2ème module : Placage automatique avec localisation précise de l'orthophoto ou de n'importe quel plan raster, à la condition qu'il y ait un fichier de calage (.tfw ou jgw j'expliquerai plus en détail par la suite :

http://campus.hesge.ch/eil/e-eil/od/c4dGIS/mns_ortho.jpg


http://campus.hesge.ch/eil/e-eil/od/c4dGIS/mnt_ortho.jpg

Mais ou cela devient plus intéressant, c'est que j'ai réussi à dépuceler le format de fichier shape de ESRI, qui est la référence en matière de SIG (système d'information du territoire) et donc de stockage des données géographique.

A Genève nous avons environ 400 couches centralisée sur un serveur cartographique ( liste des données :http://etat.geneve.ch/geoportail/metadata/(S(uqxjx0ay3wt5o2451hrmoh55))/metadata.aspx )

Et donc le but sera de pouvoir non seulement utiliser la géométrie, mais également les données alpha-numériques liées.

Un exemple ici avec la couche des bâtiments qui possède un attribut pour la hauteur et un autre pour l'altitude de base -> un petit coup de COFFEE et hop les bâtiments sont générés automatiquement et toujours localisés précisément:

http://campus.hesge.ch/eil/e-eil/od/c4dGIS/bat.jpg

Je mets un peu d'ordre dans mes plugs et je vous proposerai dans un très prochain post un téléchargement avec quelques données pour tester.

Pour l'instant j'ai tout fait en COFFE, mais je me suis mis activement au C++ ces derniers temps et je pense plutôt continuer en C++.

Est-ce qu'il y a déjà des FC4Diens qui utilisent couramment ce type de données ?

Sir Gong
30/04/2008, 19h33
Nicolas Sarcoffee
Excellent, je rajoute cent francs dans le nourrin (Maître Carlaàvélo)

Bien que je n'y comprenne rien pour cause d'intelligence limitée, ça a l'air bien ton truc, et merci de partager,




Si tu veux je te remets dans le bac à sable pour te refaire membre reconnu ?

oli_d
30/04/2008, 22h13
Si tu veux je te remets dans le bac à sable pour te refaire membre reconnu ?

Avec plaisir, juste pour le plaisir d'en ressortir


Bien que je n'y comprenne rien pour cause d'intelligence limitée,

En fait la programmation ça sert juste à passer 10 fois plus de temps à faire le même truc, mais de manière plus "scientifique"

« Un programme est un sort jeté sur un ordinateur, qui transforme tout texte saisi au clavier en message d’erreur. » - Anonyme

oli_d
01/05/2008, 22h14
1er module : importer un modèle de terrain au format ascii
Télécharger les fichiers (http://campus.hesge.ch/eil/e-eil/od/c4dGIS/ascii2mnt.zip)

( placer les deux fichiers dans le dossier plugin de C4D et redémarrer C4D, il devrait y avoir un menu "Import MNT ASCII" dans le menu Modules externes)

Voici donc le premier épisode et les premières explications.

Le problème avec les données géographiques c'est que l'on a des coordonnées x,y (x,z dans C4D) très élevées.Si l'on veut pouvoir travailler sans trop de problème, il faut donc déplacer nos objet près du point 0 de C4D.

Le TagOrigin est un plug type Tag, qui sera attribué directement par code (il est invisible et n'apparait dans aucun menu). Il sert simplement à stocker les coordonnées du point 0 et permet ensuite de caler d'autres objets géographiques.

Le fichier ascci2mnt est un plug de type menu qui va importer un fichier *.asc et le transformer en terrain. Ce type de modéle est très utilisé en Europe, aux US je crois qu'ils utilisent plus les *.dem (que l'on peut importer par défaut)

C'est un modéle de terrain de type grille à maille carrée. Les 6 premières lignes du fichiers contiennent dans l'ordre le nombre de colonnes, de lignes, les coordonnées du point en haut à gauche, la valeur de la maille et la valeur des points vides.
Pour la suite du fichier on a un nombre qui représente l'altitude.


Le code va donc :

demander à l'utilisateur l'emplacement du fichier (il faudra que je rajoute une sécurité si l'utilisateur choisi un mauvais fichier)
ouvrir le fichier et récupérer les 6 premières lignes
à partir de ces données créer un objet polygonal avec le nombre de points
faire une double boucle pour lire les altitudes et placer les points
créer les poly à partir des points


Le code est non crypté et commenté.

Si vous voulez faire des essais je joins les deux fichiers ascii (http://campus.hesge.ch/eil/e-eil/od/c4dGIS/mnt.zip)des exemples en dessus.

Sur le site de l'IGN vous pouvez télécharger un exemple disponible pour la France :http://www.ign.fr/rubrique.asp?rbr_id=2407&lng_id=FR cocher la ligne BD ORTHO colonne ArcView.

Pour les améliorations j'aimerais encore pouvoir directement dans l'objet pouvoir choisir la résolution du maillage pour le rendre plus léger lorsque l'on a des grandes surfaces.

Et si vous avez des suggestions .....

oli_d
05/05/2008, 22h34
2ème module : importer des images raster géoréférencées
Télécharger le fichier (http://campus.hesge.ch/eil/e-eil/od/c4dGIS/rastergeo.zip)

Placez le fichier "rasterGEO.cof" dans le dossier plugin et relancez C4D.

Ce module va permettre de placer des images (orthophotos, plans, cartes...) précisément dans notre scène sous forme de polygone comme support pour la modélisation. Il faut que les images disposent d'un fichier de calage du modèle ESRI. Ce fichier se présente sous la forme d'un fichier texte, avec un nom identique à l'image et un suffixe qui reprend la première et la dernière lettre de l'extension de l'image avec un "w" à la fin. En clair si ma carte s'appelle "plan.tif", le fichier de calage s'appellera "plan.tfw" (pour un fichier *.jpg->jgw, pour un *.gif->gfw, etc...)

Ce fichier texte contient 6 lignes, la première donne la valeur en mètre d'un pixel les deux dernières les coordonnées du pixel en haut à gauche de l'image, ce qui va permettre de mettre à l'échelle et caler l'image.

La commande "importer un raster géréférencé" va créer un objet plan aux dimensions terrain de l'image et plaquer l'image sous forme de texture dessus. Si vous avez plusieurs "dalles" de carte par exemple, elles vont se caler au bon endroit (essayez avec des cartes IGN "Données FranceRaster®" au format ARCVIEW :http://www.ign.fr/rubrique.asp?rbr_id=2407&lng_id=FR

Il y a juste un truc que je ne suis pas arrivé à faire en COFFEE, c'est de monter la taille d'aperçu de la texture dans le canal illumination pour que l'image soit plus nette en Gouraud. Si quelqu'un à la solution ...

xs_yann
06/05/2008, 08h26
Super ce que tu fais Oli_D :prie:

Pour changer la taille d'aperçu de la texture en COFFEE rien de plus simple :



var mat = doc->GetFirstMaterial(); // Un materiau juste pour l'exemple
mat#MATERIAL_PREVIEWSIZE = MATERIAL_PREVIEWSIZE_128;


ou


var mat = doc->GetFirstMaterial(); // Un materiau juste pour l'exemple
var bc = mat->GetContainer();
bc->SetData(MATERIAL_PREVIEWSIZE,MATERIAL_PREVIEWSIZE_ 128);
mat->SetContainer(bc);



Tu as la liste des options dans mmaterial.h :


MATERIAL_PREVIEWSIZE = 500,
MATERIAL_PREVIEWSIZE_DEF = 0,
MATERIAL_PREVIEWSIZE_64 = 6,
MATERIAL_PREVIEWSIZE_128 = 7,
MATERIAL_PREVIEWSIZE_256 = 8,
MATERIAL_PREVIEWSIZE_512 = 9,
MATERIAL_PREVIEWSIZE_1024 = 10,
MATERIAL_PREVIEWSIZE_2048 = 11,
MATERIAL_PREVIEWSIZE_4096 = 12,


Bon courage :odile:

Red
06/05/2008, 14h26
Argh j'ai effacé mon message par erreur, je te remets l'essentiel :

Très bon sujet !

Pour les suggestions, par rapport à la densité du maillage, ça sera bien de pouvoir l'adapter, mais idéalement, il faudrait pouvoir le faire de manière non uniforme et en fonction de la distance à la caméra. Pour ce faire, afin d'être assez optimal, tu devras peut-être considérer l'option de diviser ton carré de base en carrés plus petits (correspondant +/- à la taille d'un petit ilôt). Ainsi, on pourrait faire des perspectives depuis une rue par exemple, pour intégrer un bâtiment, et avoir un max de détail sur ce qui est proche, et peu de polys sur l'arrière plan.


Je suis le topic de près, un jour viendra sûrement ou je pourrai utiliser tes plugins :)
(et en plus c'est chez ouam :
http://www.deltazone.org/~fc4d/images/red_chezouam.jpg )

Jean-Laurent
06/05/2008, 16h08
Pour les améliorations j'aimerais encore pouvoir directement dans l'objet pouvoir choisir la résolution du maillage pour le rendre plus léger lorsque l'on a des grandes surfaces.



Pas bien compris.
Quel difficulté as-tu pour modifier le maillage de départ ?
L'idée de Red est pas mal d'un maillage non uniforme en fonction de la distance à la caméra. Par contre ça me semble coton à mettre en place. Voir quasi impossible sans N-gone.

Un sacré challenge que tu t'es fixé. :prie:

oli_d
06/05/2008, 18h47
Merci à tous pour les encouragements, je commençais à désespérer tout seul dans la section programmation. J'ai presque hésité à transformer mon projet en "blonde paramétrique à forte poitrine" pour attirer du monde !

Merci beaucoup xs-yann c'était juste le paramètre qui me manquait, j'avais bien le "MATERIAL_PREVIEWSIZE " mais impossible de l'utiliser. Il faut dire que depuis que j'ai goûté au SDK C++ je trouve définitivement la doc du COFFEE très peu pratique.

Red :
Chouette quartier, j'ai un très bon ami qui est ton voisin.
Merci pour les suggestions, il y a un terme particulier que j'ai oublié pour ce type de terrain procéduraux dont la densité polygonale s'adapte à la distance de la caméra. C'est un peu un de mes rêves d'y arriver, mais pour l'instant cela dépasse mes compétences.


Un sacré challenge que tu t'es fixé.

Pour l'instant c'est pas trop compliqué, c'est juste de la lecture de fichier externes, mais je ne vais pas tardé à avoir des problèmes mathématiques complexes et je ne manquerais pas de te solliciter :mrgreen:

Red
06/05/2008, 19h13
Merci pour les suggestions, il y a un terme particulier que j'ai oublié pour ce type de terrain procéduraux dont la densité polygonale s'adapte à la distance de la caméra. C'est un peu un de mes rêves d'y arriver, mais pour l'instant cela dépasse mes compétences.

Ca dépend de comment tu t'y prends, c'est clair qu'un seul maillage à densité variable, c'est hyper compliqué ! Mais si tu pars du principe que je suggérais, avec, admettons, 4x4 carrés de relief, adapter la résolution de chaque carré indépendamment, c'est pas impossible... Si tu arrives à importer les maillages avec moins de détails, le plus dur est fait :) Et si je ne m'abuse tu prévoyais de le faire.
Après, si le carré de base est trop grand pour avoir un détaillage suffisamment progressif à l'échelle d'un quartier (comme ça semble être le cas), il faudrait subdiviser le mesh du carré de terrain en plusieurs mesh carrés plus petits.

Jean-Laurent
06/05/2008, 20h04
Mais si tu pars du principe que je suggérais, avec, admettons, 4x4 carrés de relief, adapter la résolution de chaque carré indépendamment, c'est pas impossible... Si tu arrives à importer les maillages avec moins de détails, le plus dur est fait :) Et si je ne m'abuse tu prévoyais de le faire.


C'est ce que j'avais compris aussi au début. Mais le problème de plusieurs mesch carrés séparés c'est pour les objets qui sont à cheval entre deux meshs. Selon la définition du Mesch il va y avoir des déchirures obligatoires. C'est pourquoi il faut que les meschs soient connectés d'où mon histoire de N-gone.

oli_d
06/05/2008, 20h48
Mais si tu pars du principe que je suggérais, avec, admettons, 4x4 carrés de relief,

J'avais mal compris, mais Jean-Laurent à raison, le problème c'est la jonction entre les carrés, mais en même temps de loin peut-être que cela peut être acceptable.

Sinon pour la solution des n-gones c'est vrai que c'est une bonne piste qui me donne quelques idées, mais qui pour l'instant passera forcément par le C++ (d'après mes connaissances il est impossible de créer des n-gones en COFFEE)

tarlack
06/05/2008, 21h24
j'ai bossé sur la creation de geometries multi-resolution à partir de cartes d'altittude et d'un point de vue (ce que veut faire Red en fait), et les trous dues aux jonctions se voyaient, il faut faire des triangles de jonction entre les niveaux (si tu fais des carrés dont les tailles sont en puissance de 2, avec un maillage régulier). Tu peux regarder du coté des geometries clip-map, ca te donnera peut-etre une idée de comment le faire :)

bon courage :)

oli_d
06/05/2008, 22h07
Tu peux regarder du coté des geometries clip-map

:prie: merci pour l'info, c'est exactement ce que je cherchais ! C'est quand même fou :google: quand on a les bons mots clés.

Aurety
13/05/2008, 21h41
Je suis bluffé ! :shock: Merci Oli ! La question reste : Ou trouve-t'on ces données pour d'autres régions ?

oli_d
14/05/2008, 06h38
Merci Aurety pour les encouragements,


La question reste : Ou trouve-t'on ces données pour d'autres régions ?

Pour la France, on trouve des données sur le site de l'IGN (http://www.ign.fr/), mais malheureusement les données sont payantes et même assez chères, ce qui fait que peu de monde les utilise.

Pour la Suisse, chaque canton possède ces propres données, mais on en trouve des données générales sur toute la Suisse chez swisstopo (http://www.swisstopo.admin.ch/internet/swisstopo/fr/home.html) mais tout est également payant.

oli_d
14/05/2008, 07h09
2ème module (suite) : plaquer des images géoréférencées sur un objet

Télécharger le fichier (http://campus.hesge.ch/eil/e-eil/od/c4dGIS/placage_raster.zip)

(attention j'ai remis tous les plugs supprimez donc d'abord les 3 autres plug (tagOrigin.cof, ascii2mnt.cof et rasterGeo.cof) avant de réinstaller ceux-là).

J'ai apporté la petite modif au dernier plug pour que la taille de prévisualisation de la texture soit un peu plus top.

Ce quatrième plug va vous permettre de plaquer un plan, une carte ou une photo aérienne sur un objet géoréférencé. La texture va se placer automatiquement au bon endroit. Comme pour rasterGeo, il faudra que les images aient un fichier de calage (tfw pour tif, jgw pour jpg->voir plus haut).

Marche à suivre :

sélectionner l'objet géoréférencé à texturer
sélectionner le menu "plaquer un raster géoréférencé" dans le menu plugin
attendre...


Attention pour que la texture apparaisse il faut que votre fichier image soit dans un dossier accessible (tex) et donc enregistrez d'abord votre fichier C4D au bon endroit.

Enjoy !

norris
25/05/2008, 16h23
Salut Oli_D
Message très peu constructif, mais c'est vraiment énorme ce que tu fais là :shock: !

En plus le coup des calages automatiques, :poucehaut:!
Je n'ai pas tout compris, mais j'imagine qu'il doit être possible de créer des villes à l'aspect futuriste ou autre ?

En tous cas les possibilités sont énormes !
Merci de nous en faire profiter :poucehaut: !

oli_d
26/05/2008, 20h34
Merci Norris,


Je n'ai pas tout compris, mais j'imagine qu'il doit être possible de créer des villes à l'aspect futuriste ou autre ?

Pour l'instant il s'agira de récupérer des données pour recréer des parties de villes existantes. Plus tard je me lancerai peut être dans un truc style citygen pour recréer un ville aléatoirement.

La suite arrive, mais pour le module d'import des fichiers de type shape (voir plus haut) je l'ai fait en COFFEE mais sans interface avec les données que j'ai à disposition. J'aimerais maintenant passer au C++ pour créer des objets styles bâtiments, végétation, mobilier, éclairage, etc.. Mais le C++ c'est chaud de chez brûlant ! ...