krunch Posté(e) le 19 février 2011 Posté(e) le 19 février 2011 Bonjour à tous En général quand je fais des traçages grdraw grvecs et que je passe la vue en 3D conique (le mode perspective à projection non-parallele en passant par l'orbite + clicdroit) ça ne marche plus... La projection fait que les calculs issus de trans ne sont plus valables L'exemple en dessous est un essai de fonction équivalente à celle donnée par gile ici (SelOneOrMore en milieu de page), à savoir une fenêtre de sélection. Le calcul-affichage n'est pas optimisé mais il fait un calcul équivalent à SelOneOrMore (*), en passant par le SCV (trans pnt 1 2) et il affiche une fenêtre de sélection Mais dans les 2 cas (celui là et SelOneOrMore) si je passe en 3Dconique ça ne marche plus : la fenêtre devient un rectangle en pers, seuls les points clés (le 1er et le curseur) sont valables. Il faut faire quelque chose d'autre, peut-être passer par les matrices ? (*) note à gile : il me semble que résultat est le même si la projection est parallèle (mais sans ilp et vxv) ? Appel : (InputSel '(0 0 0)) (defun InputSel (1st / out gr in pnt sel) (setq 1st (trans 1st 1 2)) (princ "\n> Sélection (2è point) : ") (while (not out) ; donnée du tampon grread : suivant si (5 . ..) / actuel sinon (setq gr (if (= (car (setq gr (grread t 14 2))) 5) (grread t 14 2) gr) in (car gr)) (cond ; in = 3Dpt[sCU] * ROLLOVER ((= in 5) (setq pnt (trans (cadr gr) 1 2)) (setq pnt (list 1st (list(car 1st)(cadr pnt)(caddr 1st)) pnt (list(car pnt)(cadr 1st)(caddr pnt)))) (setq pnt (mapcar '(lambda(u) (trans u 2 1)) pnt)) (redraw) (TraceVects pnt T 1 0) ) ; * CLIC-DROIT ((= in 25) (setq out T) ) ) ) ) (defun TraceVects (ptlist cls coul high / X Y) (setq ptlist (mapcar '(lambda (U) (trans U 0 1)) ptlist)) (mapcar '(lambda (X Y) (grdraw X Y coul high)) ptlist (cdr ptlist)) (if cls (grdraw (car ptlist) (last ptlist) coul high)) ) [Edité le 19/2/2011 par krunch]
krunch Posté(e) le 20 février 2011 Auteur Posté(e) le 20 février 2011 J'ai refait une tentative mais sans succès.. (nouveau code en dessous, on l'appelle avec (InputSel '(0 0 0)) ) Je rappelle que c'est pour dessiner des lignes avec grvecs dans une vue 3d conique (là ce n'est qu'un exemple...)Et donc dans ce cas (conique) les points interpolés par des opérations dans le SCV [ (trans pnt 1 2) > calcul > (trans pnt 2 1) ] ne sont pas valables. Ce qui est bizarre c'est qu'on dirait que seul les X des variables pt1vue et pt3vue ont besoin d'être corrigés, pas les Y. D'autre part quand je modifie la variable LENSLENGTH la déformation est la même (ce qui voudrait dire qu'elle n'influe pas), et je vois pas trop quel paramètre peut entrer en compte en vue perspective... Si quelqu'un en sait plus là dessus.. (defun InputSel (1st / out gr in pnt sel) (princ "\n> Sélection (2è point) : ") (while (not out) ; donnée du tampon grread : suivant si (5 . ..) / actuel sinon (setq gr (if (= (car (setq gr (grread t 14 2))) 5) (grread t 14 2) gr) in (car gr)) (cond ; in = 3Dpt[sCU] * ROLLOVER ((= in 5) (setq pnt (cadr gr)) (redraw) (DrawQuad 1st pnt) ) ; * CLIC ((= in 3) (print "clic") (setq out T) ) ; * CLIC-DROIT ((= in 25) (setq out T) ) ) ) ) (defun DrawQuad (pt0 pt2 / pt0vue pt2vue pt1vue pt3vue pt1 pt3 ssmode) (setq pt0vue (trans pt0 1 2)) (setq pt2vue (trans pt2 1 2)) (setq pt1vue (list (car pt2vue) (cadr pt0vue) (caddr pt0vue))) (setq pt3vue (list (car pt0vue) (cadr pt2vue) (caddr pt2vue))) (setq pt1 (trans pt1vue 2 1)) (setq pt3 (trans pt3vue 2 1)) (setq ssmode (if (< (car pt2vue) (car pt0vue)) "_CP" "_WP")) (grvecs (list (if (= ssmode "_CP") -255 255) pt0 pt1 pt1 pt2 pt2 pt3 pt3 pt0)) )
krunch Posté(e) le 22 février 2011 Auteur Posté(e) le 22 février 2011 Rebonjour Alors d'après cette page (tout en bas) il y aurait bien une déformation (par matrice non-uniforme ?) à faire.. Mais ce que je ne comprends pas c'est où sont les paramètres, car dans une vue 3D conique (par exemple faite avec VUEDYN) les variables LENSLENGTH et PERSPECTIVECLIP n'affectent pas la projection.. Bon, sinon... ça intéresse pas trop la 3D conique ?..Je suis à deux doigts d'avoir l'impression de parler tout seul ;-(
(gile) Posté(e) le 22 février 2011 Posté(e) le 22 février 2011 Salut, Tout d'abord, je pense que le mode de Perspective d'AutoCAD devrait être réservé à la visualisation du modèle et pas à la modélisation.Pour avoir fait, il y a longtemps, des perspectives "à la main", je peux très bien concevoir comment les calculs pour l'affichage seront plus gourmands en mode perspective qu'en mode parallèle (sans parler des textures et lumières). En ce qui concerne ton problème de LISP, tu cites la routine gr-sel-display, mais tu ne reproduit pas les calculs qu'elle fait, tu te contentes de construire les points intermédiaires à partir des coordonnées des points saisis avant de les retraduire en coordonnées SCU.gr-sel-display, après avoir construits ces points intermédiares les projette sur le paln de la vue (avec ilp) avant de les traduire en coordonnées SCU. Essaye la commande TEST suivante, elle fonctionne correctement chez moi. ;; gr-sel-display (gile) ;; Dessine (grvecs) un rectangle similaire au rectangle de sélection ;; quelle que soit la vue courante. ;; Retourne une liste contenant le mode de sélection ("_CP" ou "_WP") ;; et les 4 sommets du rectangle (coordonnées SCU courant) (defun gr-sel-display (/ *error* gr pt1ucs pt2ucs pt3ucs pt4ucs pt1view pt2view pt3view pt4view ssmode result) (defun *error* (msg) (or (= msg "Fonction annumée") (princ (strcat "\nErreur: " msg)) ) (redraw) (princ) ) (setq pt1ucs (getpoint)) (while (and (setq gr (grread T 12 0)) (/= (car gr) 3)) (redraw) (setq pt3ucs (cadr gr) pt1view (trans pt1ucs 1 2) pt3view (trans pt3ucs 1 2) pt2view (list (car pt3view) (cadr pt1view) (caddr pt1view)) pt4view (list (car pt1view) (cadr pt3view) (caddr pt3view)) pt2ucs (trans (ilp pt2view (mapcar '+ pt2view '(0 0 1)) (trans '(0 0 0) 1 2) (trans '(0 0 1) 1 2 T) ) 2 1 ) pt4ucs (trans (ilp pt4view (mapcar '+ pt4view '(0 0 1)) (trans '(0 0 0) 1 2) (trans '(0 0 1) 1 2 T) ) 2 1 ) ssmode (if ( "_CP" "_WP" ) ) (grvecs (list (if (= ssmode "_CP") -255 255 ) pt1ucs pt2ucs pt2ucs pt3ucs pt3ucs pt4ucs pt4ucs pt1ucs ) ) ) (redraw) (list ssmode pt1ucs pt2ucs pt3ucs pt4ucs) ) ;; VXV ;; Retourne le produit scalaire (réel) de deux vecteurs ;; ;; Arguments : deux vecteurs (defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2))) ;; ILP (gile) ;; Retourne le point d'intersection de la droite définie par p1 p2 ;; et du plan défini par un point et sa normale. ;; ;; Arguments ;; p1 et p2 : les points définissant la droite dont on cherche l'intersection ;; org : un point queconque du plan d'intersection ;; nor : le vecteur normal du plan d'intersection (defun ilp (p1 p2 org nor / scl) (if (and (/= 0 (setq scl (vxv nor (mapcar '- p2 p1)))) (setq scl (/ (vxv nor (mapcar '- p1 org)) scl)) ) (mapcar (function (lambda (x1 x2) (+ (* scl (- x1 x2)) x1))) p1 p2 ) ) ) ;; Commande TEST (defun c:test (/ gsd ssmod) (and (setq gsd (gr-sel-display)) (setq ss (ssget (car gsd) (cdr gsd))) (sssetfirst ss ss) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 22 février 2011 Posté(e) le 22 février 2011 Réalisé sans trucage http://img535.imageshack.us/img535/9296/persepective.gif Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 22 février 2011 Auteur Posté(e) le 22 février 2011 Merci En effet c'est plutôt curieux, et je suppose que ça doit être une question de version car chez moi j'obtiens ça, également avec ta dernière fonction TEST : http://img716.imageshack.us/img716/2138/sanstitre1joh.jpg [Edité le 28/2/2011 par krunch]
krunch Posté(e) le 28 février 2011 Auteur Posté(e) le 28 février 2011 ReBonjour à tous Ce serait vraiment sympa d'essayer la fonction TEST ci-dessus de (gile) en 3D perspective et de me dire si vous obtenez le résultat escompté (ou comme moi un quadrilatère en perspective) ainsi que votre version.. J'aimerais (tenter de) savoir si c'est une question de version ou autre chose. En vous remerciant
krunch Posté(e) le 10 mars 2011 Auteur Posté(e) le 10 mars 2011 Bonjour (gile) Tu m'autorises à exporter ma question avec ta routine TEST sur d'autres forums ? (en mentionant le source ?)
bonuscad Posté(e) le 10 mars 2011 Posté(e) le 10 mars 2011 Ce serait vraiment sympa d'essayer la fonction TEST ci-dessus de (gile) en 3D perspective Bon j'ai pris la peine d'essayer, j'ai poussé le vice jusqu'à me mettre en perspective et d'ajuster la focale pour avoir des objets déformés, résultat: le cadre de capture est bien orthogonal. Ceci sous Autocad Map2009. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
krunch Posté(e) le 11 mars 2011 Auteur Posté(e) le 11 mars 2011 Bon j'ai pris la peine d'essayer, j'ai poussé le vice jusqu'à me mettre en perspective et d'ajuster la focale pour avoir des objets déformés, résultat: le cadre de capture est bien orthogonal. Ceci sous Autocad Map2009. Merci bien. J'ai beau réessayer : avec Autocad 2008 le résultat est toujours un rectangle déformé (comme mis en perspective et projeté sur le plan SCU) dès que je passe en vue perspective. D'autre part la focale (du moins la variable LENSLENGTH) n'influe pas sur la déformation. Peut-être qu'ils ont changé un truc dans la 2009.. J'ai du mal à le croire, mais comme je ne vois pas d'autre variable concernée...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant