Al dibujar una elipse o un círculo con OpenGL, ¿Cuántos vértices debemos usar?

En caso de que ciegamente uso de 360 ​​vértices? 720 parece funcionar mejor, pero ¿dónde nos detendremos?


El usuario Stefano Borini respondió:

hasta la resolución que está utilizando requiere, o tantos como el resultado visual requiere una representación exacta. Es difícil de decir, y sobre todo depende de lo que queremos lograr. En un programa de CAD, que tiene un círculo visualmente similar a un octágono puede ser molesto. Por otro lado, si vas a programar un juego en el iPhone, si la rueda de un coche se parece a un octágono no es gran cosa.

Una posible estrategia que podría utilizar es el de evaluar la longitud de cada segmento con respecto a la resolución de la vista actual, y si ya que, por ejemplo, 3 píxeles, aumentar el número de vértices que utiliza, pero sólo para los segmentos visibles. De esta manera, aumentar la resolución al acercar el zoom, pero usted no tiene que describir vértices no se va a dibujar.


El usuario Dave respondió:

Depende de la cantidad de error que puede tolerar (es decir, la calidad visual) y el tamaño del círculo (elipse).Un círculo más grande tendrá más puntos para lograr la misma calidad. Usted puede saber exactamente cuántos puntos necesita para un error dado con un poco de matemáticas.

Si se tiene en cuenta el círculo representado por una serie de segmentos de línea, los extremos de los segmentos de línea se encuentran exactamente en el círculo (haciendo caso omiso de la cuadrícula de píxeles). La mayor desviación entre el círculo real y nuestra representación segmento de línea se produce en el centro de cada segmento de línea, y este error es el mismo para todos los segmentos de línea.

Mirando el primer segmento del eje X va hacia la izquierda, sus dos puntos finales son los siguientes:

 A = (r, 0) B = (r . cos(th), r . sin(th)) 

donde r es el radio del círculo y th es el ángulo recorrido por cada segmento de línea (por ejemplo, si tenemos 720 puntos luego de cada segmento de línea cubre 0,5 grados tan th sería de 0,5 grados).

El punto medio de este segmento se encuentra en

 M = A + (B - A) / 2 = (r, 0) + (r (cos(th) - 1) / 2, r . sin(th) / 2) = (r / 2) . (1 + cos(th), sin(th)) 

y la distancia desde el origen hasta el punto es

l = (r / 2). sqrt ((1 + cos (t)) ^ 2 + (sen (t)) ^ 2) = (r / 2). sqrt (2). sqrt (1 + cos (t)) 

Si nuestra representación segmento de línea eran perfectos entonces esta longitud debe ser igual al radio (el punto medio del segmento de línea debe caer en el círculo). Normalmente habrá algún error y este punto será ligeramente menor que el radio. El error es

 e = r - l = r . (1 - sqrt(2) . sqrt(1 + cos(th)) / 2) 

Reorganización de lo que hemos th en cuanto a e y r

 2 . e / r = 2 - sqrt(2) . sqrt(1 + cos(th)) sqrt(2) . sqrt(1 + cos(th)) = 2 . (1 - e / r) 1 + cos(th) = 2 . (1 - e / r)^2 th = arccos(2 . (1 - e / r)^2 - 1) 

Esto nos permite calcular el ángulo máximo que puede tener entre cada punto para lograr un cierto error. Por ejemplo, digamos que está dibujando un círculo con un radio de 100 píxeles y queremos un error máximo de 0,5 píxeles. Podemos calcular

 th = arccos(2 . (1 - 0.5 / 100)^2 - 1)) = 11.46 degrees 

Esto corresponde al ceil(360 / 11.46) = 32 puntos.Así que si trazamos un círculo de radio de 100 con 32 puntos de nuestro peor píxel se apagará en menos de la mitad que debería significar que cada píxel sorteo será en el lugar correcto (haciendo caso omiso de aliasing).

Este tipo de análisis se puede realizar para elipses también, pero en el espíritu de todas las matemáticas bueno que se deja como ejercicio para el lector;) (la única diferencia es determinar dónde se produce el error máximo).


Este texto ha sido obtenida de esta fuente original en Stackoverflow.com



Tags: openglquestions
| Date: 30-07-2012

Comentarios de los lectores: