KevinLastra 9 Report post Posted August 4, 2020 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 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]. y después calcular el largo del cateto perpendicular al angulo. gracias por su ayuda!!! Share this post Link to post Share on other sites
Igor 337 Report post Posted August 4, 2020 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
KevinLastra 9 Report post Posted August 4, 2020 en 3d, quiero hacer un simulador de aviones, estoy aburrido y quiero complicarme la vida xD Share this post Link to post Share on other sites
Igor 337 Report post Posted August 4, 2020 (edited) 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 August 4, 2020 by Igor Share this post Link to post Share on other sites
KevinLastra 9 Report post Posted August 4, 2020 una imagen dice mas que mil palabras, en azul represento el "aire" impactando al avion produciendo resistencia al movimiento v. 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
Igor 337 Report post Posted August 4, 2020 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
KevinLastra 9 Report post Posted August 4, 2020 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
iRobb 776 Report post Posted August 5, 2020 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 1 Share this post Link to post Share on other sites
francoe1 536 Report post Posted August 5, 2020 1 hour ago, iRobb said: 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 Share this post Link to post Share on other sites
Igor 337 Report post Posted August 5, 2020 46 minutes ago, francoe1 said: si, el otro dia pense lo mismo. 1 Share this post Link to post Share on other sites
KevinLastra 9 Report post Posted August 5, 2020 @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
KevinLastra 9 Report post Posted August 6, 2020 (edited) 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 August 6, 2020 by KevinLastra 1 Share this post Link to post Share on other sites