Blender (jusqu'à 2.49)
Curseur 3D
Position en temps réel
(English version)
    Début   Index
précédent Sauver un theme 
 Charger une image Suivant
1/ Position réelle du curseur.
    Liaison automatique  à la scène
2/ distance d'un point au curseur 3D
3/ lien vers Blenderartist

1/ Position réelle du curseur.

    Ce script est peu utile puisqu'il est possible d'avoir cette position en passant par le panneau View Properties qui s'affiche par le menu View de la fenêtre 3D. Mais c'est cependant un passage obligé pour tester les méthodes de liaison automatique  à la scène et l'ordre de récupération du nom de l'empty qui servira d'affichage 3D.

Méthode de liaison automatique  à la scène


sce=Blender.Scene.getCurrent()
if sce.getScriptLinks('Redraw')== None : 
    sce.addScriptLink('auto3dcursor.py','Redraw')
elif 'auto3dcursor.py' not in sce.getScriptLinks('Redraw'): 
    sce.addScriptLink('auto3dcursor.py','Redraw') 

Précision sur l'algorithme
Pour afficher les valeurs, il est nécessaire d'avoir un objet ayant une propriété name . Comme ce n'est pas le cas du curseur 3D, on doit ajouter un Empty
 
 

...
     E=Blender.Object.New('Empty')
     sce=Blender.Scene.getCurrent()
     sce.link(E)


 import Blender
p= Blender.Window.GetCursorPos()
EN="  %2s,%2s,%2s"%(round(p[0],2),
                       round(p[1],2),
                       round(p[2],2))
try:
  if Blender.x3dpos!=EN:
     print EN, Blender.x3dpos
     EP=Blender.Object.Get()
     print EP
     E=Blender.Object.Get(Blender.x3dpos)
     E.setLocation(p)
     E.setName(EN) 
     Blender.x3dpos=EN
     Blender.Redraw()

except:
     E=Blender.Object.New('Empty')
     sce=Blender.Scene.getCurrent()
     sce.link(E)
     Blender.x3dpos=EN
     E.setName(EN)
     print EN
     E.setLocation(p)
     E.setDrawMode(8)
     Blender.Redraw()

sce=Blender.Scene.getCurrent()
if sce.getScriptLinks('Redraw')== None : 
    sce.addScriptLink('auto3dcursor.py','Redraw')
elif 'auto3dcursor.py' not in sce.getScriptLinks('Redraw'): 
    sce.addScriptLink('auto3dcursor.py','Redraw') 

2/ Distance d'un point au curseur 3D (mise à jour le 26/10/2005 )
Télécharger le script

Combiné au panneau View Properties et à l'affichage du panneau Tranform Properties ce script devrait offrir un outil de mesure efficace. 

Principe:

  1. Creer automatiquement un Empty et lui attacher le script.
    •  
  2. Mesurer la distance entre l'empty et le curseur 3D
    • Pour cela on récupère la position de du curseur3s avec la fonction: 
          Blender.Window.GetCursorPos() 
      et celle de l'empty avec les deux lignes: 
          E= Blender.Object.Get(Blender.x3dpos)
          p2=E.getLocation() 
      A partir des deux points dans l'espace  (p et p2), on trouve la distance en appliquant la formule suivante :
       
      p.x = Blender.Window.GetCursorPos()[0]
      p.y = Blender.Window.GetCursorPos()[1]
      p.z = Blender.Window.GetCursorPos()[2]
      ...
      p2.x = E.getLocation()[0]
      p2.y = E.getLocation()[1]
      p2.z = E.getLocation()[2]
      ...
      distance=abs((p.x-p2.x])*(p.x-p2.x)+
                            (p.y-p2.y)*(p.y-p2.y)+
                             (p.z-p2.z)*(p.z-p2.z))**0.5
  3. Tracer une ligne entre ces deux éléments de référence:
    1. possibilité ancienne mais découverte il y a peu : dessiner directement dans  la fenêtre 3D . Si on respecte une contrainte simple : le script doit être attaché à un objet et non pas à la scène. Le reste passe simplement par les fonctions openGL qui se trouvent dans le module BGL.
  4. Donner le résultat sous la forme chiffrée dans le nom  de l'empty.
    • C'est un tour de passe-passe car il faut pouvoir récupérer le nom de cet objet à chaque nouvel affichage et il y a un affichage chaque fois qu'un objet est déplacé dans la scène. Si c'est l'empty qui est déplacé, alors son nom change à chaque réaffichage. Il faut donc le stocker provisoirement et pouvoir aussi le récupérer au prochain appel du script . Comme l'espace de nom du python est effacé à la fin de chaque exécution de script  seul endroit disponible est le module Blender lui-même.
  5. TRES IMPORTANT.
    1. Attention si vous faites une copie du cadre ci-dessous, pensez à renommer le script dans fenêtre de traitement de texte. En effet, celui-ci se lie automatiquement à l'Empty mais il  s'attend à trouver un script qui porte le nom de mesure.py 
#!BPY

"""
Name: 'Mesure on'
Blender: 232
Group: 'Misc'
Tooltip: 'Activate control of the length to the 3Dcursor'
"""
# ============================================
# jmsoler 26/10/2004, Blender artistic licence
# updated : 27/07/2005
# last update : 26/10/2006
# ============================================
import Blender

from Blender import BGL,Draw, Window
p=[0,0,0.0,0.0]
p2=[0,0,0.0,1.0]

viewMatrix = Window.GetPerspMatrix()
viewBuff = [viewMatrix[i][j] for i in xrange(4) for j in xrange(4)]
viewBuff = BGL.Buffer(BGL.GL_FLOAT, 16, viewBuff)

BGL.glLoadIdentity()
BGL.glMatrixMode(BGL.GL_PROJECTION)
BGL.glPushMatrix()
BGL.glLoadMatrixf(viewBuff)

try:
  p= Blender.Window.GetCursorPos()
  E= Blender.Object.Get(Blender.x3dpos)
  p2=E.getLocation() 
  E.setSize(-p2[0],-p2[1],-p2[2])

  BGL.glColor4f(1.0,0.5,0.0,1.0)
  BGL.glBegin(BGL.GL_LINES)
  BGL.glVertex3f(p[0],p[1],p[2])
  BGL.glVertex3f(p2[0],p2[1],p2[2])
  BGL.glEnd()

  BGL.glColor4f(1.0,1.0,1.0,1.0)

  EN=abs((p[0]-p2[0])*(p[0]-p2[0])+
                 (p[1]-p2[1])*(p[1]-p2[1])+
                       (p[2]-p2[2])*(p[2]-p2[2]))**0.5
  E.setName("  %s"%round(EN,4))
  Blender.x3dpos=E.getName()

except:
     E=Blender.Object.New('Empty')
     sce=Blender.Scene.getCurrent()
     sce.link(E)

     NAME='mesure.py'

     if NAME not in [t.name for t in Blender.Text.Get()]:
        SCRIPTDIR = Blender.Get('scriptsdir')+Blender.sys.sep
        print SCRIPTDIR+NAME
        Blender.Text.Load(SCRIPTDIR+NAME)

     p= Blender.Window.GetCursorPos()
     p2= [1.0,1.0,1.0]
     E.setLocation(p2)
     E.setSize(p2)

     EN=abs((p[0]-p2[0])*(p[0]-p2[0])+
                   (p[1]-p2[1])*(p[1]-p2[1])+
                      (p[2]-p2[2])*(p[2]-p2[2]))**0.5
     E.setName("  %s"%round(EN,4))
     Blender.x3dpos=E.getName()
     E.setDrawMode(8)

     if sce.getScriptLinks('Redraw')== None : 
        sce.addScriptLink('mesure.py','Redraw')
     elif 'mesure.py' not in sce.getScriptLinks('Redraw'): 
        sce.addScriptLink('mesure.py','Redraw')

     BGL.glColor4f(1.0,0.5,0.0,1.0)
     BGL.glBegin(BGL.GL_LINES)
     BGL.glVertex3f(p[0],p[1],p[2])
     BGL.glVertex3f(p2[0],p2[1],p2[2])
     BGL.glEnd() 

Lien sur Blenderartist 
 
précédent Sauver un theme 
  Charger une image Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
 news://news.zoo-logique.org/3D.Blender


 

 

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube