Superficiar una malla

pnc - 17/02/2009 18:20
Yo sigo con mis mallas. ¿Hay alguna manera de calcular automáticamente la superficie de una malla?
(y ya puestos, localizar el centro de gravedad).
¿En Blender?
¿En AutoCAD?
¿En algún otro?
Posdata: no sé si el foro de modelado es el más adecuando.
GEKKONIDAE - 17/02/2009 18:46
En Blender, en el entorno de objeto puedes pulsar los botones para que aparezca la longitud de segmentos y el área de las caras.

El centro de gravedad no sé, pero el centro geométrico lo obtienes al seleccionar todos los vértices y en modo objeto pulsas el botón center. El centro del objeto se va al centro geométrico de la malla, sus coordenadas serán ese centro.

Bájate el manual Precision modelling de Blender si te defiendes con el inglés.
(Mirando los dibujos también se entiende sin saber inglés). [url]http://www.blendernation.com/2007/12/27/precisión-modelling-pdf-guide/[/url].
Caronte - 17/02/2009 19:57
Para calcular el volumen: [url]http://www.blendernation.com/2007/05/11/Python-script-calculating-the-volume-of-objects/[/url].
pnc - 17/02/2009 20:30

En Blender, en el entorno de objeto puedes pulsar los botones para que aparezca la longitud de segmentos y el área de las caras.

¿cómo? ¿dónde? ¿me lo explicas para tontos?

Para calcular el volumen.

Lo que quiero es la suma de las áreas de todas las caras que tenga la malla.
polan - 17/02/2009 21:37

¿Cómo? ¿dónde? ¿me lo explicas?

Hola, entra en Edit Mode y pulsa f9 (editing) y lo tienes en la pestaña Mesh tools more. Un saludo.
pnc - 17/02/2009 21:48
Ahora sí, pero necesito la suma de todos los triángulos.
polan - 17/02/2009 22:06
Ni idea, pero puede que haya algún script para ello.
Pepius - 17/02/2009 22:07
Copia esto que he hecho en un momento en una text window:
[code]From Blender import scene, Mesh, window. Scn= scene. Getcurrent().

Ob= scn, getactiveobject().

Me= ob, getdata (Mesh=1).

Area_t = 0.

For f in me, Faces:
Area_t += f, área.

Print area_t.
Window. Redrawall().
[/code]

Cuando lo hagas copiado, pulsas Alt+p y te vas a la ventana de la consola de Blender. Ahí tendrás la suma de las áreas de las caras.

Espero que te sirva, un saludo.
Caronte - 17/02/2009 22:10
Qué lujo.
Pepius - 17/02/2009 22:16
Python manda. Edito el código que se me había colado una identificación.
pnc - 18/02/2009 11:06
Muchas gracias. ¿Y unas breves instrucciones para tener el script siempre disponible?
Caronte - 18/02/2009 11:48
Si no me equivoco, con que copies la cabecera de otro script del mismo grupo (cambiando nombre y tal), ya te aparecerá.
pnc - 25/02/2009 12:40
Yo sigo pidiendo: Si ejecuto el script con un cubo de 2x2x2 me dice que el área es 24 (claro, seis caras de 2x2 son 6 por 2x2=24).

Pero con el modelo que tengo que es una escultura de 8m de alto me dice que la superficie de la malla es 42.107.579 (es decir si trabajo en metros, 4 hectareas).

Y lo que me extraña es que la malla me la dieron en milímetros, la escalé por 0,001 para trabajar en pregunta y el área sigue midiendo lo mismo.

Claro si pienso en 42.107.579mm2 la cosa cuadra bastante, porque serían 42m2 que para una escultura de 8m de alto podría ser. Pero me gustaría entender cómo lo hace.
Caronte - 25/02/2009 13:21
Claro, ya se ha hablado en muchas ocasiones de eso, las medidas en Blender son unidades y esas unidades tú las puedes llamar como quieras (milímetros, hectareas, leguas.) siempre que no cambies de unidad de medida dentro de la misma escena para que todo esté acorde.
pnc - 25/02/2009 18:52
No es éso. Un ejemplo: hago dos cubos de lado 2. Si superficio cada uno, miden 24. Desde Edit Mode[/i], escalo uno (selecciono todas las caras y las escalo) a un 50% de su tamaño. Lo superficio y mide 6 (lógico: 6 caras de 1x1).

Desde
object mode[/i], escalo el otro, y lo hago del 50% de tamaño: lo superficio y mide 24.

No lo entiendo, supongo que, por un lado está la definición de la malla, y que lo de escalar es un modificador, que cambia el objeto (instancia) como comentabas en el otro mensaje del [i]decimator[/i]. ([url]https://www.foro3d.com/f24/blender-reducir-la-resolucion-de-una-malla-dxf-71188.html[/url]).
¿Es eso?
StormRider - 25/02/2009 19:54
Creo que en modo objeto cambias el tamaño visual, no las medidas. En el modo editar es donde cambias las medidas realmente.
Pepius - 25/02/2009 20:30
Efectivamente, como dice Stormrider, la superficie es relativa al tamaño del objeto. Así que para comparar dos objetos estas deben tener el mismo tamaño (como objeto, por supuesto). Para hacer esto, puedes pulsar Alt+s para resetear el escalado de todos los objetos y a partir de ahí ya ajustar su tamaño en Edit Mode.
Pepius - 25/02/2009 20:47
Prueba esta modificación y dime que tal te va. Ahora tiene en cuenta el tamaño del objeto, pero, eso sí, debe ser igual de grande en x, en y, y en z (hablamos del objeto, claro, no de la malla).
[code]from Blender import scene, Mesh, window.

Scn= scene. Getcurrent().

Ob= scn, getactiveobject().

Me= ob, getdata (Mesh=1).

Area_t = 0.

For f in me, Faces:
Area_t += f, Area*(ob, getsize ()[0])*(ob, getsize ()[0]).

Print area_t[/code]
pnc - 25/02/2009 21:12

Prueba esta modificación y dime que tal te va. Ahora tiene en cuenta el tamaño del objeto, pero, eso sí, debe ser igual de grande en x, en y, y en z (hablamos del objeto, claro, no de la malla).

Funciona: la superficie de las caras de un cubo de 2x2x2 escalado al 50% (es decir, de 1x1x1) es 6, independientemente de si es escalado como malla (Edit Mode[/i]) o cómo objeto (object mode[/i]). Gracias.
Pepius - 25/02/2009 21:24
Genial. De nada, a mandar.
pnc - 26/02/2009 13:04
Estoy desmelenado. Me he atrevido a programar en Python:
[code]from Blender import scene, Mesh, window. Scn= scene. Getcurrent().

Ob= scn, getactiveobject().

Me= ob, getdata (Mesh=1).

Area_t = 0.

For f in me, Faces:
Area_t += f, área.

Print area_t.

Print (ob, getsize ()[0]).

Print area_t*(ob, getsize ()[0])*(ob, getsize ()[0])[/code]

En vez de multiplicar dos veces el factor de proporción del objeto en cada área, lo hago sólo al final. Y así puedo dar tres datos: la superficie total de la malla original, lo escalado que está en esa instancia, y la superficie total del objeto una vez escalado.

El cambio es tonto en el código, pero es mi primera intervención en un código en Python:
Pepius - 28/02/2009 12:52
De eso se trata.