Aller au contenu

Messages recommandés

Posté(e)

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]

Posté(e)

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))
)

Posté(e)

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 ;-(

Posté(e)

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

Posté(e)

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]

Posté(e)

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

 

  • 2 semaines après...
Posté(e)

Bonjour (gile)

 

Tu m'autorises à exporter ma question avec ta routine TEST sur d'autres forums ? (en mentionant le source ?)

 

Posté(e)

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

Posté(e)
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...

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité