Jump to content
KevinLastra

Obtener la superficie de una mesh especifica.

Recommended Posts

Hola a todos,

quisiera saber como puedo detectar la superficie de una mesh la cual sus caras estén viendo a una dirección especifica.

vector v = la direction que afecta la mesh

A = el total de superficie afectada

Sans titre.png

no se si se entiende xD,

osea primero seria detectar las caras de la mesh las cuales sus normales estén entre  [-v + 90 , -v - 90].Sans titre.png

y después calcular el largo del cateto perpendicular al angulo.Sans titre.png

gracias por su ayuda!!!

Share this post


Link to post
Share on other sites

es en 2d o en 3d?

si es en 2d puedes usar los vertices para crear un vector.

por ejemplo en la primera imagen:

porejemplo creas el vector "linea" con las posicion de dos los vertices del segmento de 10cm

(restando los dos vertices consiges el vector (punto1-punto2))

con Vector3.Cross puede hayar la perpendicular del vector "v"... y lo llama vectorPV

suponiendo que usas los ejes "X" y "Y" seria:

Vector3 linea = Vector3.Cross(v, new Vector3(0,0,1));

 

y con Vector3.Dot(vectorPV, linea) te daria lo que mide linea (float) mirandolo desde "v" (en tu ejemplo son 5cm) 

en 3d se complica un poco mas...

 

no se si se entiende... espero haberme explicado bien

Share this post


Link to post
Share on other sites

explicanos un poco mas que es lo que quieres hacer para que podamos ayudarte mejor...

calcular la superficie de un mesh tendrias que usar la formula del area de un triangulo iregular en cada de los triangulos que forman el mesh...

pero claro... tu quieres el area de triangulo proyectado respecto a un direction "v", no del triagulo real... 

entonces se complica mas... tendrias que recalcular cada arista (linea) parecido a como te he explicado antes.... para despues calcular el area...

tambien se me ocurre que puedes usar una camara "ortografica" (que solo grabe ese mesh) para conseguir una imagen de la proyeccion del mesh viendolo en la direccion "v"....  y entonces con esa imagen calcular la superficie haciendo recuento de pixeles (sabiendo el "size" del "orthographic" de la camara, claro) 

quieres hacerlo solo una vez en void Start... o quieres que sea algo que se ejecute todo el rato (en void Update)?

mira

he encontrado esto,

igual te sirve, aunque esta en Java... tendrias que cambiar el "var triangles" por "int[] triangles"... y el "var vertices" por "Vector3[] vertices"...

float CalculateFacingArea(Mesh mesh, Vector3 direction) {
    direction = direction.normalized;
    var triangles = mesh.triangles;
    var vertices = mesh.vertices;

    double sum = 0.0;

    for(int i = 0; i < triangles.Length; i += 3) {
        Vector3 corner = vertices[triangles[i]];
        Vector3 a = vertices[triangles[i + 1]] - corner;
        Vector3 b = vertices[triangles[i + 2]] - corner;

        float projection = Vector3.Dot(Vector3.Cross(b, a), direction);
        if (projection > 0f)
            sum += projection;
    }

    return (float)(sum/2.0);
}

 

si te fijas hace lo que te decia yo, hace "Vector3.Dot" del "Vector3.Cross"... 

Edited by Igor

Share this post


Link to post
Share on other sites

una imagen dice mas que mil palabras, en azul represento el "aire" impactando al avion produciendo resistencia al movimiento v.Sans titre.png

mi objetivo final es poder hacer volar el avion, en tiempo real simulando esta resistencia.

entonces tengo que calcular el area de cada cara afectada por esta resistencia representada por el vector V.

 

Share this post


Link to post
Share on other sites

prueba la funcion esa que he encontrado...

el rendimiento dependera de la cantidad de poligonos del avion...

si no te funciona ya intentaria escribirte la funcion yo mismo...

o prueba tu si quieres...

sino se me ocurre lo de la camara "orthographic"... no hace falta que tenga mucha resolucion... y puedes hacer el recuento de pixeles medio rapido...

Share this post


Link to post
Share on other sites

gracias por la ayuda, porfavor no me escribas el codigo, estoy aburrido en casa, no me espoilees  xD jajaja muchas gracias probare lo que me pusiste arriba

Share this post


Link to post
Share on other sites

Si es simulación, realmente el comportamiento de un avión no es con resistencia en su parte ventral. Es sustentación provocado en las alas por el efecto Bernoulli, el empuje de los motores y la modificación dinámica de la superficie alar.

https://es.wikipedia.org/wiki/Física_del_vuelo

 

  • Like 1

Share this post


Link to post
Share on other sites
46 minutes ago, francoe1 said:

{\displaystyle P_{+}{\tfrac {1}{2}}\rho (V_{1})^{2}=P_{2}+{\tfrac {1}{2}}\rho (V_{2})^{2}}

si, el otro dia pense lo mismo.

  • Thanks 1

Share this post


Link to post
Share on other sites

@iRobb lo que busco con calcular la resistencia al viento, es para poder simular los movimientos laterales y el uso de alerones.

Aun sigo pensando como simular este efecto de vacio.

Gracias a todos por los post!!!

estoy siguiendo un post de la nasa para obtener las diferentes formulas.

https://www.grc.nasa.gov/WWW/K-12/airplane/

 

Share this post


Link to post
Share on other sites

Edit: 

Si a alguien le interesa ya acabe el calculo de superficie dependiente de la perspectiva.

public float CalculateFacingArea()
    {
        int[] triangles = mesh.triangles;
        Vector3[] vertices = mesh.vertices;
        Vector3 a, b, c;
        double sum = 0;

        Vector3 normal_t = drag_angle - 2 * drag_angle;

        float c_ = drag_angle.x*normal_t.x + drag_angle.y * normal_t.y +drag_angle.z * normal_t.z;
        Vector3 pop1, pop2, pop3, V;
        for (int i = 0; i < triangles.Length; i += 3)
        {
            a = vertices[triangles[i]];
            b = vertices[triangles[i + 1]];
            c = vertices[triangles[i + 2]];

            if (Vector3.Dot(Vector3.Cross(b - a, c - a), drag_angle) > 0)
            {
                pop1 = PointOnPlane(normal_t, c_, a, drag_angle);
                pop2 = PointOnPlane(normal_t, c_, b, drag_angle);
                pop3 = PointOnPlane(normal_t, c_, c, drag_angle);

                V = Vector3.Cross(pop1 - pop2, pop1 - pop3);
                sum = V.magnitude * 0.5f;
            }
        }
        return (float)sum;
    }
    public Vector3 PointOnPlane(Vector3 plane, float p_c, Vector3 Va, Vector3 Vb)
    {
        float a = plane.x * Va.x + plane.y * Va.y + plane.z * Va.z;
        return Va + Vb*((p_c - a) / (plane.x * Vb.x + plane.y * Vb.y + plane.z * Vb.z));
    }

Añado un archivo geogebra por si quieren jugar con el modelo que utilise para entender lo que hacia (el punto D viene siendo el punto de observacion y los puntos de A a C representan el triangulo de la mesh).

 

geogebra-export.ggb

Edited by KevinLastra
  • Like 1

Share this post


Link to post
Share on other sites

×
×
  • Create New...