3DVF Network :
ico_magazine
Magazine
ico_boutique
Boutique
ico_cgjobs
Portail Emploi
ico_upload
Hébergement d'image
blogs
Blogs
ico_progiss
Progiss
ico_social
Social
Login Membre :
blogs
Login
?
Join
space
space
  FORUM 3DVF
  3dsmax Général

  positions 2d vertex en fonction du format camera

 

pitiwazou, 1 utilisateur anonyme et 28 utilisateurs inconnus

 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

positions 2d vertex en fonction du format camera

n°11437
chon
Posté le 29-04-2017 à 12:23:26  profilanswer
 

Bonjour tout le monde,
 
J'ai crée un script qui permet d'avoir dans un .txt toutes les positions 2d de chaque vertex d'un objet, mais pour le moment cela se fait en fonction du viewport (et donc si la taille de mon viewport change les positions aussi). N'y a t-il pas un moyen de le faire en fonction d'un format spécifique? (Genre le format d'export de mon image finale?)  
 
Merci d'avance,
 
Denis
PS: Le code :

Code :
  1. try (destroydialog ::gvp) catch()
  2. rollout gvp "Print Vertex Point"
  3. (
  4. Global obj, dir_path, outFile, gv
  5. button c_path "Path Save"
  6. button c "Stamp Vertex Pos. XY"
  7. on c_path pressed do
  8. (
  9.  dir_path = getSaveFileName caption:"Name Save File" initialDir:(getDir #export) filename: selection[1].name + ".txt"
  10.         outFile = createFile dir_path
  11. )
  12.  on c pressed do
  13.  if selection.count < 1 then
  14. (
  15.  messagebox "Nothing Selected !" title:"Nothing Selected"
  16. )
  17. else
  18.  (
  19. (
  20.  selection.count == 1 and classof selection[1].baseobject == Editable_Poly
  21.   ---
  22.  oPoly = $
  23.  sliderTime = 0
  24.  sTime = animationRange.start
  25.  eTime = animationRange.end
  26.  format "Name: %\n\n" selection[1].name to:outFile
  27.    (
  28.    (
  29.    for i=sTime to eTime do
  30.    (
  31.    sliderTime = i
  32.    forceCompleteRedraw()
  33.    format "_" to:outFile
  34.      (
  35.      local iNumVerts = polyOp.getNumVerts oPoly
  36.      gw.setTransform (Matrix3 1)
  37.      local p3PointWorldPos = [0,0,0]
  38.      local p2PointScreenPos = [0,0]
  39.      local ap2PointScreenPos = #()
  40.      ap2PointScreenPos[iNumVerts] = [0,0]
  41.        for iVert = 1 to iNumVerts do
  42.        (
  43.        p3PointWorldPos = polyOp.getVert oPoly iVert
  44.        ap2PointScreenPos[iVert] = [ceil((((gw.transPoint p3PointWorldPos).x)*2)-42), ceil((((gw.transPoint p3PointWorldPos).y)*2)+27)]
  45.        )
  46.          for p2Pos in ap2PointScreenPos do
  47.          format "%" p2Pos to:outFile
  48.          )
  49.    )
  50.    )
  51.    )
  52.   close outFile
  53. )
  54. )
  55. )
  56. createdialog gvp style:#(#style_titlebar, #style_sysmenu, #style_toolwindow, #style_sunkenedge)


(Publicité)
n°11438
malikarn
++
Posté le 30-04-2017 à 11:37:29  profilanswer
 

salut
arrange toi pour que ton viewport ait la même matrice de transformation que ta cam avec  gw.setTransform $cam
puis par la suite tu appelles gw.transpoint en lui passant un point3 exprimé en camera space et non en world space.
++

n°11439
chon
Posté le 04-05-2017 à 13:55:17  profilanswer
 

Merci beaucoup pour ta réponse, mais je ne vois pas trop comment tu fais car je n'arrive à avoir un résultat avec des caractères du type "e" dedans au lieu de mes coordonnées.

n°11440
malikarn
++
Posté le 04-05-2017 à 22:44:39  profilanswer
 

re
oui pardon j'avais mal lu, je pensais que tu cherchais a exprimer un point dans les coordonnées de la cam (et donc avec sa perspective) plutot qu'en fonction d'un viewport.
 
Mais toutes les méthodes de la classe gw traitent du viewport, dérivé d'une cam ou non. Dès lors si tu resizes ton viewport, l'aspect reste correcte mais pas le format.
Pour retrouver les coordonnées dans le format de rendu il faut faire un peu de trigo.
 
Soit le point P et la cam C.
la formule en abrégé de la position en pixel de P dans C est :

Code :
  1. ([aTan((normalize(coordSys $C $P.pos))[1]),aTan((normalize(coordSys $C $P.pos))[2])]/[$C.fov/2.,$C.fov/2./renderPixelAspect])*[renderWidth/2.,renderHeight/2.]


 
Si tu veux je peux détailler...
Attention toutefois si ta cam a des propriétés de tilt shift, de correction de perspective, d'offset du film gate etc., il faut en tenir compte (ce qui n'est pas le cas ici).
Pour que la formule fonctionne bien, il faut au moins que tu autorises max à bosser avec 5 décimales car les tangentes sont des valeurs bien en dessous de 1.
 
++

n°11443
chon
Posté le 09-05-2017 à 15:58:56  profilanswer
 

Hello ! Merci encore pour ta réponse :)
Je veux bien que tu détailles un petit peu car quand je teste ta méthode (peut-être que je m'y prend mal) il me met en message d'erreur "no "normalize" function for -5.0".

n°11444
malikarn
++
Posté le 11-05-2017 à 12:45:08  profilanswer
 

ok
je te détaille ca un peu plus tard parce qu'avec quelques images ce sera plus simple ^^
en attendant, si j'ai pas fait de fautes de syntax, j'aurai du préciser que ce bout de code ne fonctionne que si il existe une caméra nommée C (et juste C) et un point nommé P dans ta scène.

 

edit, J'ai testé et a priori il n'y a pas de boulette dans la syntax. La voicie différemment :

Code :
  1. V = coordSys $C $P.pos
  2. Vn = normalize V
  3. A = [aTan(Vn[1]), aTan(Vn[2])]
  4. R = A / [$C.fov/2. , $C.fov/2./renderPixelAspect]
  5. R *= [renderWidth/2.,renderHeight/2.]
  6. format "\nPos = %\n" R


++


Message édité par malikarn le 11-05-2017 à 12:56:54
n°11445
malikarn
++
Posté le 13-05-2017 à 11:55:11  profilanswer
 

re
ok donc pour fixer les idées, voici une image qui illustre le problème :
http://pix.blizzart.net/image/1494668196/medium.jpg
On a une cam C et un point P.
Le fov F d'une cam construit deux triangles rectangles en T. Du coup si on travaille sur le demi-fov (F/2) certaines fonctions trigo émergent.
Notamment, la longueur du segment TP vaut la tangente de l'ange A
Mais ca c'est vrai uniquement dans le cercle trigo, c'est a dire si TC vaut 1
A partir de là on exprime le vecteur CP, c'est a dire où se situe P dans les coordonnées de C :

Code :
  1. V = coordSys $C $P.pos


Mais la distance CT est arbitraire dans notre scène ! c'est pourquoi il nous faut normaliser le vecteur CP pour ramener CT à 1 et nous permettre par la suite d'invoquer des fonctions trigos.

Code :
  1. Vn = normalize V


Maintenant - et en ne considérant que la composante X - ma position normalisée de P dans C c'est la distance TP à condition que CT valle 1.  Ce qui est le cas vu qu'on vient de normaliser le vecteur. Donc puisque je connais TP, cela signifie que sa tangente inverse vaut l'angle A.
Je dois réaliser cette opération tant sur la composante X que Y

Code :
  1. A = [aTan(Vn[1]), aTan(Vn[2])]


J'ignore dans la foulée la composante Z de Vn qui n'a pas de sens ici.
Bien maintenant le plus dur est fait, je connais l'angle A Il faut juste que je le compare a F/2. Et pour comparer, ben je fais une division :

Code :
  1. R = A / [$C.fov/2. , $C.fov/2./renderPixelAspect]


Donc là, tu peux aussi comparer l'angle formé par 2 x A et le FoV ou comme j'ai fait ici, comparer juste A au demi fov (F/2). J'ajoute que je divise le demi-fov par l'aspect ratio du rendu pour retrouver facilement l'angle formé "verticalement".
Maintenant qu'on tient le rapport, si ce rapport vaut 1 c'est que les angles sont identiques, donc A = F/2 s'il faut 0 c'est que P est en T, il suffit de multiplier par la résolution de sortie : si A vaut 1 c'est donc qu'il se trouve a 1 x 1920/2 = 960 pixels horizontalement et s'il vaut 0 : 0x1920/2 = 0 c'est a dire P est au centre de l'écran.
Encore une fois, l'opération se fait sur X comme Y

Code :
  1. R *= [renderWidth/2.,renderHeight/2.]


cette syntaxe est équivalente à

Code :
  1. R = R * [renderWidth/2.,renderHeight/2.]


Et voila !

 

++

Message cité 1 fois
Message édité par malikarn le 13-05-2017 à 12:01:05
n°11446
malikarn
++
Posté le 13-05-2017 à 11:57:03  profilanswer
 

oops, double post :S


Message édité par malikarn le 13-05-2017 à 11:57:36
n°11447
chon
Posté le 14-05-2017 à 01:51:16  profilanswer
 

Wow merci 1000 fois pour le temps passé à me répondre je regarde ça demain. Merci encore !

n°11452
chon
Posté le 16-05-2017 à 15:09:24  profilanswer
 

Hello malikarn,

 

J'ai tenté un peu avec ta formule :

 
Code :
  1. (
  2. local theMesh = selection[1]
  3. local curcam = try(getActiveCamera()) catch()
  4. if selection.count == 1 then
  5. (
  6.  if classof theMesh == Editable_Poly then
  7.  (
  8.   for vert in (theMesh.mesh.verts as bitarray) do
  9.   (
  10.    w= polyop.getVert theMesh vert
  11.    V = coordSys curcam w
  12.    Vn = normalize V
  13.    A = [aTan(Vn[1]), aTan(Vn[2])]
  14.    R = A / [curcam.fov/2. , curcam.fov/2./renderPixelAspect]
  15.    R *= [renderWidth/2.,renderHeight/2.]
  16.    format " %\n" R
  17.   )
  18.  )
  19. )
  20. )
 

Alors ça me donne ces chiffres pour un rectangle dans ma scène (format de rendu : 2048x1536)

 

https://www.noelshack.com/2017-20-1 [...] apture.png

 

[-630.751,1505.3]
[-2044.35,145.805]
[1067.16,-1434.29]
[1998.41,-516.99]

 

(Les vertex sont bien dans l'ordre 1,2,3,4)
et ça me donne ça (en utilisant la position des 4 points pour créer une hotzone cliquable sur un html)

 

https://image.noelshack.com/fichier [...] -05-16.jpg

 

Serait-ce parce que les coordonnées 0,0 ne commencent pas en haut à gauche?


Message édité par chon le 16-05-2017 à 15:23:21
(Publicité)
 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM 3DVF
  3dsmax Général

  positions 2d vertex en fonction du format camera

 

Haut de page
space
space
space
A Propos | Contact
Copyright © 2000-2017 3DVF. Tous droits réservés. | Infogérance serveur | tracker
space