Esta publicación que os presentamos versa sobre el cálculo de volúmenes de tiburones empleando análisis de imagen. El objetivo es obtener volúmenes exactos de individuos de varias especies de tiburones pelágicos mediante fotografías referenciadas, y de esta manera poder llevar a cabo en el futuro estudios precisos sobre hidrodinámica, comportamiento de termorregulación, y ratios de consumo energético. Ha sido presentada recientemente en el congreso MARTECH 2011 celebrado en Cádiz.
System calculation of volumes by image analysis on sharks
Ignacio Gonzalez, Gonzalo Mucientes
Abstract: Determining the volume of an animal can help us to understand certain aspects of its hydrodynamics and thermodynamics, such as behavioral thermoregulation and energy consumption. This determination is difficult due to the irregular shapes of the animal’s body. On the other hand, large calibrated tanks are needed for measurements and this is not functional. We have designed an innovative mechanism to register morphological characteristics in a fast, low-cost way, using standard digital photography.
La cuestion es que era mas facil (y mas rapido) utilizar admesh que rehacer el script python… (llamadme vago… :-P)
Para la proxima version intentaremos pulirlo un poco mas…
y el «(» de la última línea sobra, claro, un error de tipeo mío
y el «(» de la linea ab,ac,ad sobra (
mmmh.. parece que el problema está al postear en ésta página, obviamente el código anterior quedaba así, sustituyendo espacios por_ para que se vea
for f in faces:
___fverts = f.vertices
___ab,ac,ad = (verts[fverts[0]].co, verts[fverts[1]].co, verts[fverts[2]].co
un ejemplo:
for f in faces:
fverts = f.vertices # getting face’s vertices
ab = verts[fverts[0]].co
ac = verts[fverts[1]].co
ad = verts[fverts[2]].co
entramos en un bucle que examina cada elemento de faces y la siguiente línea TIENE que estar indentada, es obligatorio por python, como no es el caso el bloque entero falla. Todo este bloque debería estar escrito más o menos así (con una pequeña corrección de paso para abreviar)
for f in faces:
fverts = f.vertices
ab,ac,ad = (verts[fverts[0]].co, verts[fverts[1]].co, verts[fverts[2]].co
Pero… como se ha perdido la indentación tampoco sabemos en donde acaba el buble, y eso ya es un problema más serio
> «El que si que probé, y no funciona, es este:»
El problema que tienes con tu script es típico de Python, ese script está deshecho porque ha perdido los tabuladores y espacios, no sólo es difícil arreglarlo sino incluso saber qué hace
Por lo demás es cierto que los nombres de los módulos han cambiado, así que el primer script no va en el blender nuevo efectivamente, lo he mirado y necesita unos cuantos retoques para funcionar
veo que el script es del 2005… y no creo que funcione en el blender actual (aunque he de decir que no lo he probado).
El que si que probé, y no funciona, es este:
Así que la opción de admesh es la mas sencilla (aparte de que de regalo te pule la malla y te cierra los huecos!!)
# Made by Alexander Zubkov
# mail to: contact@artdds.com OR mail@al-z.name
# find me at http://www.artdds.com AND http://www.al-z.name
import bpy
class LayoutPanel(bpy.types.Panel):
bl_label = «Volume & Mass Calc»
bl_space_type = «PROPERTIES»
bl_region_type = «WINDOW»
bl_context = «data»
density = 1.0
volume_mass = 0.000
bpy.types.Mesh.density = bpy.props.FloatProperty(
name=»Material Density»,
description=»Density of the Material»,
default=1.0,
min=0,
max=100)
def draw(self, context):
layout = self.layout
obj = bpy.context.object
obj_data = obj.data
row = layout.row()
row.label(text=obj.name, icon=’OBJECT_DATA’)
row.label(text=obj_data.name, icon=’MESH_DATA’)
layout.label=(«Pulse la medida a calcular»)
row =layout.row(aling=True)
row.alignment = ‘EXPAND’
row.operator(«object.button»,text=»Vol»).mode = 1
row.operator(«object.button»,text=»Mass», icon=’MESH_DATA’).mode = 2
row = layout.row()
row.label(text=»Please check: ALL your mesh’s faces must be TRIs», icon=’INFO’)
row = layout.row()
row.prop(obj_data, «density»)
row =layout.row(aling=False)
row.label(«Volumen: » + str(round(volume_mass,3)), icon=’MESH_DATA’)
row.label(text=»Masa: » + str(round(volume_mass * obj_data.density,3)), icon=’MESH_DATA’)
class OBJECT_OT_Button(bpy.types.Operator):
bl_idname = «object.button»
bl_label = «Button»
def execute(self,context):
print(«Calculando lo mandado…»)
verts = obj_data.vertices # array of vertices
faces = obj_data.faces # array of faces
volume_mass = 0; # VOLUME OF THE OBJECT
for f in faces:
fverts = f.vertices # getting face’s vertices
ab = verts[fverts[0]].co
ac = verts[fverts[1]].co
ad = verts[fverts[2]].co
# calculating determinator
det = (ab[0]*ac[1]*ad[2]) – (ab[0]*ac[2]*ad[1]) – (ab[1]*ac[0]*ad[2]) + (ab[1]*ac[2]*ad[0]) + (ab[2]*ac[0]*ad[1]) – (ab[2]*ac[1]*ad[0])
volume_mass = volume_mass + (det/6)
print(«Volume: » + str(round(volume_mass,3)))
print(«Mass: » + str(round(volume_mass * obj_data.density,6)))
print(self.mode)
return{‘FINISHED’}
def register():
bpy.utils.register_module(__name__)
pass
def unregister():
bpy.utils.unregister_module(__name__)
pass
if __name__ == «__main__»:
register()
Gracias!! Toda la info es bienvenida. El compartir información científica y técnica es uno de los objetivos de nuestro blog. Recibe un abrazo del equipo.
Ah, añado que Blender permite calcular volúmenes mediante varios plugins, y tambien podemos crearnos nuestros propios scripts y añadirselos sacando el destornillador y peleando con Python o mejor C
De hecho veo que ya han hecho algo así:
Autor: Scorpius, Nueva Jersey
fuente: http://blenderartists.org/forum/showthread.php?49216-AreaVolume-script
import Blender, vector, time
object = Blender.Object.GetSelected()
objname = object[0].name
meshname = object[0].data.name
mesh = Blender.NMesh.GetRaw(meshname)
def tri_area1(face):
v1, v2, v3 = face.v
v1, v2, v3 = v1.co, v2.co, v3.co
e1 = v1-v2
e2 = v3-v2
cp = Blender.Mathutils.CrossVecs(e1,e2)
area = cp.length/2
return area
def tri_area2(face):
v1, v2, v3 = face.v
v1, v2, v3 = v1.co, v2.co, v3.co
e1 = vector.vsub(v1,v2)
e2 = vector.vsub(v3,v2)
cp = vector.vcross(e1, e2)
area = vector.vlen(cp)/2
#volume = vector.vdot(v1, cp) * area / 3
return area
print
start = time.clock()
print «Area1:», sum([tri_area1(face) for face in mesh.faces]),
end = time.clock()
print «in %.2f %s» % (end-start, «seconds»)
start = time.clock()
print «Area2:», sum([tri_area2(face) for face in mesh.faces]),
end = time.clock()
print «in %.2f %s» % (end-start, «seconds»)
Hombre, ¿También usáis vosotros el Blender? un gran programa