Blender (jusqu'à 2.49)
|
Python
MESH
:
Repérer
le point d'intersection de deux segments
en
mode edit
Pour Blender
version cvs 236
du 07/02/2005
minimum
|
|
Fichier
exemple
Edges
en mode sélection
Conserver
les seams et les edges
Le script
Le
même objectif en utilisant la fonction LineIntersect() de Mathutils
Voir aussi :
Comment
trouver la plus courte distance d'un point à une ligne
Calculer
le chemin le plus court entre deux lignes
Ce script permet de trouver le point d'intersection
de deux segments sélectionnés en mode édit.
Il fonctionne aussi bien en sélection
par point ...
que par edge.
Pour une raison encore indeterminée,
dans les versions de l'API python antérieure à Blender
2.4, les edges ne sont pas reconnus si au moins un appel aux seams
n'a pas été effectue par ctrl-e .
Méthode pour récupérer
dans une liste tous les edges en mode sélection
:
# sachant que M est un mesh
# chaquelement e appartenant à la liste
# M.edges peut etre teste avec l'expression
# e.flag&1
e=[e for e in M.edges if e.flag&1]
... |
Méthode
pour mettre à jour un mesh en conservant les parametres des seams
et d'edges.
# sachant que M est un mesh
# update accepte plusieurs parametres
# le premier pour recalculer les normales
# le second pour conserver les seams et les
# edges.
M.update(0,1)
... |
Le Script
# -------------------------------------
# Blender Version cvs 236
# 09/02/2005 minimum
#
# Pour une raison encore indeterminee
# les edges ne sont pas reconnus si
# au moins un appel aux seams n'a pas
# ete effectue par ctrl-e
# --------------------------------------
import Blender
if Blender.Get('version')>=236:
from Blender import NMesh
in_editmode = Blender.Window.EditMode()
if in_editmode:
Blender.Window.EditMode(0)
O=Blender.Object.GetSelected()[0]
M=O.getData()
e=[e for e in M.edges if e.flag&1]
if len(e)==2:
A1 = e[0].v1.co
B1 = e[0].v2.co
u1 = [0,0,0]
for i in range(3):
u1[i] = B1[i]-A1[i]
print u1
A2 = e[1].v1.co
B2 = e[1].v2.co
u2 = [0,0,0]
for i in range(3):
u2[i] = B2[i]-A2[i]
mu1 = (A1[1]-A2[1])*u1[0]-(A1[0]-A2[0])*u1[1]
mu2 = u1[0]*u2[1]-u1[1]*u2[0]
mu = mu1/mu2
C = [0,0,0]
for i in range(3):
C[i] = A2[i]+mu*u2[i]
p=Blender.NMesh.Vert(C[0],C[1],C[2])
M.verts.append(p)
M.update(0,1)
else:
print "only or at least
2 edges have to be selected"
Blender.Window.EditMode(in_editmode) |
Le
même objectif en utilisant la fonction LineIntersect() de Mathutils
# -------------------------------------
# Blender Version 241
# 18/02/2006
# -------------------------------------
from Blender import Mathutils, NMesh, Object
MESH=Object.GetSelected()[0].getData()
EDGES=MESH.edges
NV=Mathutils.LineIntersect(Mathutils.Vector(EDGES[0].v1),
Mathutils.Vector(EDGES[0].v2),
Mathutils.Vector(EDGES[1].v1),
Mathutils.Vector(EDGES[1].v2))
print NV
MESH.verts.append(NMesh.Vert(NV[0][0],NV[0][1],NV[0][2]))
MESH.verts.append(NMesh.Vert(NV[1][0],NV[1][1],NV[1][2]))
MESH.addEdge(MESH.verts[-2],MESH.verts[-1])
MESH.update(0,1) |
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|