PDA

Voir la version complète : Question Urbanisme : Poser les bâtis sur le terrain en pente



R-Tel
18/07/2015, 19h25
Hello à tous !

J'ai une question pour un projet d'étude :huh:

Pour commencer, sur rhinoceros, j'ai modélisé tout mon terrain à l'aide des courbes de niveau, jusque là pas de soucis.
Plus tard j'ai pu recupérer tous les bâtiments au format rhino (il s'agit d'un arrondissement de Paris).
Là est le soucis, ils ont tous la base au même niveau, et je dois les poser sur mon terrain.....

Avec rhino, je n'ai pas trouvé la solution, j'ai donc tout exporter sur C4D pour tenter de trouver un système, mais pour le moment, je sèche :crying:
j'ai tenté avec les propriétés de simulation, mais je n'ai pas trouvé la bonne combinaison

Si quelqu'un a une solution miracle pour moi, je suis très preneur :icon_redface:

oli_d
19/07/2015, 07h25
Salut,

J'ai un vieux script python qui fait un truc du genre. Il faut sélectionner le neutre contenant les bâtiments, le terrain doit être juste en dessous dans la hiérarchie et doit être un objet polygonal. Attention, c'est simplement l'axe de l'objet bâtiment qui est mis sur le terrain, le script ne tient pas compte de toute la géométrie (pour la procédure d'installation c'est ici (http://frenchcinema4d.fr/showthread.php?74044-Proc%E9dure-d-installation)).



# -*- coding: utf-8 -*-

import c4d

#Mettre le neutre contenant les objet juste au dessus du terrain dans la hierarchie

def plaquer_sur_poly(groupe,terrain):
objs = groupe.GetChildren()
if not objs : return None

if not terrain.GetType()==c4d.Opolygon:
c4d.gui.MessageDialog('Le terrain doit être un objet polygonal')
return False

rc = c4d.utils.GeRayCollider()
rc.Init(terrain)
bbox = terrain.GetRad()
mg_t = terrain.GetMg()
inv_m = ~mg_t
centre = terrain.GetMp()*mg_t

y_max = centre.y + bbox.y + 1000
lg = bbox.y * 2 + 2000

for o in objs :
mg =o.GetMg()
i_m= ~mg
pos = mg.off*inv_m
pos.y = y_max

if rc.Intersect(pos, c4d.Vector(0,-1,0),lg):
x= rc.GetNearestIntersection()
pos.y-=x['distance']
mg.off = pos*mg_t
doc.AddUndo(c4d.UNDOTYPE_CHANGE,o)
o.SetMg(mg)


return True

def main():
doc.StartUndo()
if not op:
c4d.gui.MessageDialog("Vous devez séléctionner le groupe d'objets à plaquer")
return
terrain = op.GetNext()
if not terrain:
c4d.gui.MessageDialog("Le terrain doit être placé juste après le groupe d'objets dans la hiérarchie")
return
if not terrain.CheckType(c4d.Opolygon):
c4d.gui.MessageDialog("Le terrain doit être un objet polygonal")
return
plaquer_sur_poly(op,terrain)
doc.EndUndo()
c4d.EventAdd()


if __name__=='__main__':
main()

R-Tel
19/07/2015, 13h09
Merci pour ta réponse, malheureusement, je n'arrive pas à faire tourner le script :/
puis je t'envoyer le fichier en privé pour que tu me dises ce que j'ai raté ?

oli_d
19/07/2015, 13h34
Fais péter ...

edit : je viens de voir que tu es en r11, donc pas de python .. (envoie ton fichier j'essaie de te les poser sur ton terrain)

oli_d
20/07/2015, 08h50
Je me permets de mettre ma réponse à R-tel en mp, cela servira peut-être à quelqu'un:

Cela ne marchait pas parce que le script place l'axe de l'objet sur le sol. Etant donné que tes bâtiments étaient tous dans un seul objet, j'ai lancé la commande maillage/conversion/Groupes de polygones en objet pour avoir un objet par groupe de polygone connecté. Ensuite j'ai mis les axes en bas de chaque objet via la commande Maillage/Centre des axes/Centre des axes en mettant le curseur Y à -100%. Et là cela fonctionne, sauf sur les bords où il y a des axes qui ne sont pas au dessus du terrain, il faudrait soit bouger les axes, soit les bâtiments à la main.

Il y a encore une pétouille dans mon script, il faut que le terrain soit avec l'axe à zéro pour que cela fonctionne ... Je corrige ça dès que j'ai un moment

R-Tel
21/07/2015, 14h27
Merci c'est génial :thumbup1:

Là, je dois refaire la manœuvre, mais lors de la conversion en groupe de polygone, mon PC prend un temps fou, en fait, je n'ai pas pu le faire, j'ai l’impression que ça ne s’arrête jamais. C'est normal que ça prenne un max de temps ou j'ai un bug sur mon PC ?

[Edit ; c'était bien un bug de mon coté

lenogre
21/07/2015, 16h46
Drop it ?
http://www.kuroyumes-developmentzone.com/cinema-4d/free-plugins/

oli_d
22/07/2015, 09h08
Merci c'est génial :thumbup1:

Là, je dois refaire la manœuvre, mais lors de la conversion en groupe de polygone, mon PC prend un temps fou, en fait, je n'ai pas pu le faire, j'ai l’impression que ça ne s’arrête jamais. C'est normal que ça prenne un max de temps ou j'ai un bug sur mon PC ?

[Edit ; c'était bien un bug de mon coté

Je confirme que la commande conversion en groupe de polygone n'est pas du tout optimisée, cela a pris un temps énorme sur ma machine également.

R-Tel
23/07/2015, 10h30
Drop it ?
http://www.kuroyumes-developmentzone.com/cinema-4d/free-plugins/

Super, j'ai testé par curiosité, ça marche aussi !

Par contre nouveau soucis, peut on simplifier un objet simple qui contient trop de polygone ?
Je pense que mes batis sont issus d'un fichier .obj, résultat, un cube a pas mal de facettes triangulaires.... Même en convertissant en quadrangles, j'ai quelque chose de lourd, pareil en optimisant...

Fredaubailly
23/07/2015, 10h43
Tu as testé le déformateur Réduction de polygones ?
Ça vaut ce que ça vaut mais des fois, ça fait la farce...

R-Tel
23/07/2015, 10h56
Oui je suis en train de tester, ça marche pas trop mal, mais si il existe un plug in plus efficace, je suis pas contre :sweatdrop:

[edit] au final j'ai utilisé le réduction de polygone sur tous mes bâtis que j'avais connecté avant opération. Ensuite, à partir de là, j'ai convert en objet et converti en quadrangle. Le résultat était top.
Enregistrement en obj, dans rhino fonction reduce mesh et la quasi nickel, le fichier est passé de 3go à 640 mo:thumbup1: