CAPÍTULO 15

44
1 VRML 2.0 con Java CAPÍTULO 12 Curvas y Superficies Nurbs

Transcript of CAPÍTULO 15

Page 1: CAPÍTULO  15

1

VRML 2.0 con Java CAPÍTULO 12

Curvas y Superficies Nurbs

Page 2: CAPÍTULO  15

2

VRML 2.0 con Java CAPÍTULO 12

Contenido CAPÍTULO 14

     • Introducción a NURBS      • Acondicionamiento      • Curvas Paramétricas      • Superficies Paramétricas      • Aplicación      • Ejemplos      • Utilización      • Más trabajo 

Page 3: CAPÍTULO  15

3

VRML 2.0 con Java CAPÍTULO 12

Introducción a NURBS 

Durante mucho tiempo (varios años), ha habido peticiones de la lista de correo para VRML NURBS nodos. NURBS se quedaron fuera de VRML 1.0 y VRML 2.0 no porque no eran útiles-lejos de ello. Que quedaron fuera simplemente porque eran difíciles de aplicar, y el grupo no quiere frenar la disponibilidad de los navegadores de VRML y herramientas de modelación por algunos difíciles de aplicar partes. Esto no fue motivo de gran preocupación, ya que cualquier cosa que pueda ser modelada con una NURBS puede ser modelada con otros nodos en la actualidad el pliego de condiciones. Sin embargo, el precio pagado fue en los tiempos de descarga, la precisión y el rendimiento. 

NURBS son mucho más pequeñas que la curva de facetas o descripciones de la superficie, por lo que se reduce el tamaño del archivo. A NURBS es una representación matemática de la curva o superficie, por lo que es mucho más precisa que piecewise una aproximación lineal a la curva o superficie, como pueden ver en la Figura 15.1. Y desde NURBS son representaciones matemáticas, el grado de mosaico se puede determinar sobre la marcha, por lo que un navegador puede calcular la mayor cantidad de puntos a lo largo de una curva o como muchas caras sobre una superficie, como es necesario. Un navegador de VRML utilizando una descripción matemática, por lo tanto, pueden seleccionar sobre la marcha el número de puntos, líneas y polígonos para dibujar sobre la base de la distancia al objeto (nivel de detalle), la carga de la CPU, y las capacidades de los gráficos subsistema. 

Figura 15.1 (a) El buen curva (b) Piecewise lineal utilizando una aproximación IndexedLineSet (c) Piecewise-utilizando una aproximación poligonal cúbico (NurbsCurve) 

Tenga en cuenta que la aproximación lineal puede ser arbitrariamente precisa que el número de segmentos aumenta, y la aproximación spline puede ser arbitrariamente precisa como el grado de la spline aumenta. 

De este modo, una descripción matemática nos permite hacer en cualquier resolución que necesitan para obtener la mejor calidad. Este tipo de resolución independiente de la descripción de una curva o superficie es familiar desde otros formatos PostScript y que el apoyo "vector" de gráficos. Otro efecto secundario de la suerte de tener una descripción matemática de un usuario es que la manipulación de la curva o superficie sólo necesitan hacer frente a un número limitado 

Page 4: CAPÍTULO  15

4

VRML 2.0 con Java CAPÍTULO 12

de parámetros, no todos y cada segmento o cara. 

Acondicionamiento 

Para empezar a entender NURBS, vamos a examinar en primer lugar el problema general de ajuste de curvas. Dado un conjunto de puntos, queremos encontrar una curva que representa mejor estos puntos. Podemos utilizar dicha curva para predecir donde se encuentran otros puntos. Por ejemplo, si los trabajadores en una fábrica puede producir 10 gizmos cada uno en turnos de 4 horas, y 20 gizmos en un turno de 8 horas, se puede predecir que después de un turno de 6 horas cada uno hubiera hecho 15 gizmos. Pero usted no puede predecir que después de un turno de 16 horas cada uno hubiera hecho 40 gizmos, ya que asumiría una curva lineal, donde, de hecho, la productividad es casi seguro descenso después de 8 horas en el trabajo. Con el fin de predecir con precisión, tenemos que hacer una hipótesis sobre la forma de la curva: es una línea, una curva cuadrática, una campana de Gauss? Luego de minimizar la desviación entre nuestros asumió la curva y los puntos (la diferencia es simplemente la distancia entre cada uno de los puntos y la curva de suponer). 

Los valores de la curva de los parámetros que nos dan la mínima desviación de definir el "mejor ajuste de curva." Por supuesto, si la curva no era el tipo adecuado (por ejemplo, los datos se cuadrático pero en condiciones de una línea), el ajuste no puede ser todo lo que bien. Piecewise instalación puede acercarse. En particular, como el número de piezas aumenta, piecewise una curva lineal que caben todas las curvas de orden superior. El truco es tener un pacto aún precisa un ajuste y que sólo requiere una pequeña cantidad de tiempo de cálculo. Este ajuste es una descripción matemática de la curva, lo que nos permite representar la curva con una ecuación simple en lugar de una gran colección de puntos. 

Curvas paramétricas 

Las curvas NURBS se definen como las curvas paramétricas. Paramétrico significa simplemente que la curva no se define como f (x, y, z), es decir, en función de las habituales coordenadas X, Y y Z. Por el contrario, la curva se define como f (t), donde t es un parámetro que está relacionado con la distancia a lo largo de la curva. (De hecho, representa el "tiempo variable, por lo que el uso t.) La distinción es sutil pero importante. Vamos a considerar el caso de una curva en dos dimensiones, el círculo. La no-paramétricos ecuaciones que describen un círculo son los siguientes: 

Page 5: CAPÍTULO  15

5

VRML 2.0 con Java CAPÍTULO 12

donde x e y son las habituales coordenadas cartesianas y r es el radio del círculo. Hay dos problemas evidentes con esta formulación. La primera es que se trata de una función multivalued; para cada uno y ambos x y-x satisfacer esta ecuación. En segundo lugar, la tangente a la curva, dt / dx, es infinito en x = ± R. Por estas y otras razones (no hay manera de representar a una parte del círculo, por ejemplo, sin recurrir a las condiciones externas en la ecuación anterior), es más conveniente y más simple matemáticamente a introducir un parámetro y no definir el círculo como un función de este parámetro. Por lo tanto, las ecuaciones de convertirse en nuestro círculo: 

     x (t) = rsin (t)      y (t) = rcos (t)      z (t) = constante 

En este caso, el parámetro no corresponde a la variable θ polares familiares. Usted puede ver que hemos resuelto nuestros problemas, hay una y sólo una (x, y) para cada t, y la derivada de las ecuaciones con respecto a todo el mundo no es finito. 

Polinomio de Expansión 

Podemos generalizar este concepto y afirmar que toda la curva en tres dimensiones puede ser representado por un polinomio de expansión en el parámetro t: 

En el polinomio de expansión, el grado de la curva es igual a la máxima exponente que figura en el polinomio, mientras que el orden del polinomio es igual al número de términos. Una relación importante es entonces: 

fin de grado 1 = 

Page 6: CAPÍTULO  15

6

VRML 2.0 con Java CAPÍTULO 12

A pesar de todo este debate (y el código de acompañamiento), se aplica a las curvas de cualquier orden, se suele tomar como ejemplos cúbicos curvas, es decir, curvas de grado 3, el orden 4. 

Una expansión de un polinomio cúbico curva se vería así: 

       x (t) = a0 A1T a2t2 a3t3        y (t) = b0 b1t b2t2 b3t3        z (t) = c0 c1t c2t2 c3t3 

Sin embargo, las curvas no son normalmente representados por gráficos de computadora con ecuaciones como éstas, porque los coeficientes de las funciones paramétricas no tienen representación visual o intuitivo que un usuario puede trabajar con, son poco adecuados para el modelado. NURBS ofrecer una solución a estos problemas. 

Forma NURBS 

Ahora estamos listos para asumir NURBS. Como se señaló anteriormente, NURBS significa no uniforme de Rational B-Spline ", que es una generalización de las curvas polinomiales donde los coeficientes del polinomio de expansión han sido sustituidos por los puntos de control y un nudo secuencia. La derivación matemática de NURBS está fuera del alcance de la obra, véase las referencias al final de este capítulo para obtener información detallada. En esta sección vamos a ser menos rigurosa y que se concentran en la introducción de los términos que usted necesita saber. 

A NURBS es una parametrización de una curva en términos de un conjunto particular de funciones de base. Funciones de base son un conjunto de funciones que se pueden añadir, junto con varios pesos para formar otras funciones. Probablemente el más conocido de este caso es una serie de Fourier, lo que representa una curva arbitraria por una superposición lineal de las funciones seno y coseno. En el caso de las NURBS, las funciones de base son un tipo de curva conocida como B-spline. 

La localización de los puntos de control regulan la forma de la curva. Cada punto de control añade una función de base a la forma de la curva. La manera en que estas funciones se superponen base depende de los valores de los parámetros en el nudo secuencia. Es decir, el nudo de la secuencia de los controles que se ponen las funciones base, mientras que los puntos de control regulan la cantidad de funciones de base que hay. 

A diferencia de la serie de Fourier, donde cada función afecta a la base toda la curva, la base de funciones de una curva NURBS se superponen de tal manera que el número de funciones de base que afectan a un punto en una curva NURBS es exactamente igual a la orden de la curva. En 

Page 7: CAPÍTULO  15

7

VRML 2.0 con Java CAPÍTULO 12

consecuencia, el orden, el número de nudos, y el número de puntos de control son todos los de esta manera: 

fin = numKnots - numControlPoints 

Cambios en los puntos de control sólo tiene una influencia en la curva-una gran ventaja para los usuarios de programas de dibujo NURBS. Esta es una de las formas en que NURBS son más intuitivas y mejor adaptada a la modelación. 

Secuencia de nudo 

Un nudo secuencia consta de un conjunto de valores de los parámetros almacenados en no nondecreasing fin. El número de veces que un determinado nudo parámetro aparece en la secuencia se llama su multiplicidad, la máxima multiplicidad de parámetros de cualquier nudo es igual a la orden de la curva. Cúbicos para una curva, esto significa que nuestra máxima multiplicidad es igual a 4. Repetición de nudo los valores es necesaria para especificar el grado de continuidad de la NURBS o no y si la curva pasa a través de un punto de control. 

El "no uniforme" significa que en NURBS los nudos valores no son equidistantes en el parámetro t. Un espaciado no uniforme permite a los NURBS forma de ser más expresivo que una spline uniforme. 

Puntos de Control 

Un punto de control tiene cuatro componentes: x, y, z, y w (generalmente conocido como el peso). Juntos, estos cuatro valores constituyen un conjunto homogéneo de coordinar. A tal punto, el punto correspondiente en 3-D es el espacio (x / w, y / w, z / w). Pesos son siempre un número positivo, para un peso igual a uno, a coordinar un conjunto homogéneo es el mismo como un espacio familiar de 3 coordinar. Un B-spline racional curva es una curva con puntos de control que tienen un peso distinto. 

Un nudo secuencia es un conjunto de valores del parámetro t que rigen la forma en los puntos de control afecta a la última curva. Los nudos y los puntos de control en conjunto son simplemente una manera diferente de expresar los coeficientes del polinomio de expansión. Vamos a ver un ejemplo concreto de esto en la siguiente sección, cuando hablamos de curvas de Bézier. 

Los puntos de control en forma de la curva 3-espacio mediante la ponderación de las contribuciones de las funciones de base en esos lugares. Una manera útil de pensar en los puntos de control, sin embargo, es la imagen como la formación de un duro "esbozo" de su 

Page 8: CAPÍTULO  15

8

VRML 2.0 con Java CAPÍTULO 12

curva. Bien, todas las transformaciones en NURBS, como escalado, rotación, traducción, transformación y de la perspectiva, puede lograrse simplemente mediante la transformación de los puntos de control. La secuencia nudo no cambia en estas transformaciones, ni la forma de la curva.

Puntos de control forma un casco convexo de una curva. El casco convexo se define como el menor polígono convexo que se pueden extraer para abarcar los puntos de control. Normalmente, este se puede encontrar uniendo los puntos de control, dejando a algunos en el interior del polígono que le mantenga convexo. Un ejemplo se muestra en la Figura 15.2. 

Figura 15.2 Convexo casco (guiones) de un conjunto de puntos de control (pequeños cuadrados). La curva de NURBS también se indica. 

Esto significa que nos podemos conectar los puntos de control para obtener una aproximación de la curva o superficie. Cuanto más puntos de control, mejor será la aproximación. Nos ilustran este proceso de refinamiento en la Figura 15-3, con un círculo. 

Figura 15.3 (a) Un círculo dibujado con 9 puntos de control de rendimientos de un cuadrado. (b) Aumentar en un 11 puntos de control da lugar a un círculo rasgados (c) Aumentar en 100 puntos de control se obtiene un muy buen círculo 

A NURBS puede ser refinado mediante la adición de más puntos de control y nudos. Debido a la propiedad de casco convexo, los nuevos puntos de control estará más cerca de la verdadera curva. Para dictar, nos aprovechamos de ello y simplemente usar el refinado como vértices los puntos de control de segmentos de línea (en el caso de las curvas) o caras (en el caso de las superficies). Esta capacidad de simplemente añadir puntos de control y nudos de una NURBS es lo que hace posible este mosaico régimen y es también lo que diferencia splines NURBS de uniforme. 

Una manera más eficiente para afinar una NURBS sería añadir puntos de control donde son más necesarios: en las regiones de mayor curvatura. 

Curvas de Bézier 

Para nuestro caso especial de polinomios cúbicos, tres ecuaciones con cuatro coeficientes de cada medio 12 incógnitas, por lo que una curva puede ser únicamente por la determinación de estas 

Page 9: CAPÍTULO  15

9

VRML 2.0 con Java CAPÍTULO 12

incógnitas, en cualquier forma posible. Una forma es la especificación de los dos extremos de la curva (con tres coordenadas de cada uno, para un total de seis knowns) y especificar los vectores de la tangente en estos dos extremos (de nuevo, seis knowns). Este tipo de parametrización de una curva cúbica de Bézier es una curva y se muestra en la Figura 15.4. Programas de dibujo como Adobe Illustrator te permiten extraer las curvas de esta manera. Si cambia los parámetros, la curva de los cambios, si cambiar la tangente en el punto final, la curva de los cambios, y si cambia la magnitud de la tangente en el punto final, la curva de cambios. Todos estos cambios son deterministas, porque la curva se define a través de una ecuación matemática. 

Figura 15.4 Ejemplo de una curva de Bézier con sus cuatro puntos de control, mostrando cómo los puntos de control están relacionados con la tangente en los extremos 

Curvas de Bézier son un caso especial de las curvas NURBS, y son una forma particularmente útil. 

Continuidad 

La suavidad de una curva piecewise se pueden clasificar por su continuidad entre los segmentos. ¿Por qué la continuidad respecto? Debido a que el máximo de continuidad se relaciona con la orden, a fin de representar a las discontinuidades, ángulos agudos, o suavizar las curvas, tienes que recoger su pedido (y sus nudos) correctamente. 

Si los extremos de dos curvas no cumplen en absoluto, no hay continuidad. Pero si no cumplen sus criterios de valoración, podemos describir la forma en que la continuidad por enésima derivados de las curvas se comportan en todo el punto de unirse. Para la continuidad C0, cumplir los parámetros, es decir, la 0TH derivados de las dos curvas son iguales en el punto de unirse. C1 continuidad, la 0TH y la primera derivados son iguales, la primera derivada es la tangente a la curva en el punto de unirse. C2 continuidad añade el requisito de que los derivados de la segunda son iguales en el punto de unirse a la tangente, así que no sólo son iguales pero cambiando al mismo ritmo. Estos cuatro casos se muestran en la Figura 15.5. 

La continuidad de la Figura 15-5 cúbicos curvas: El punto de unirse a las curvas se indica con una pequeña plaza. (a) no continuidad (b) la continuidad C0 (c) la continuidad C1 (d) la continuidad C2 

Page 10: CAPÍTULO  15

10

VRML 2.0 con Java CAPÍTULO 12

Si, en ecuaciones paramétricas, t representa la variable tiempo, podemos considerar el primer ser derivado a la velocidad y la segunda derivada a la aceleración. Continuidad entonces corresponde a la posición (C0), velocidad (C1), y la aceleración (C2). 

El máximo alcanzable continuidad a través de la unión es igual a la orden de menos de dos (o un grado menos). Por lo tanto, en el caso de curvas cúbicos, podemos tener hasta C2 continuidad, lo que suele ser el más alto la continuidad que nos interesa desde un punto de vista gráfico. 

Curvas cúbicos 

Habida cuenta de la ruta por lo general encuentro entre precisión y eficiencia, la curva cúbicos es una de las más útiles en las curvas de los gráficos. ¿Por qué utilizar cúbicos curvas y no curvas de un orden superior o inferior? Curvas de orden inferior son lineales o cuadráticas. Con líneas, que apenas necesita una entidad independiente NURBS, y quadratics, aunque útiles, no puede tener más de continuidad a través de C1 pieza límites. Cuadrático curvas planas también en 3-D-tenemos que ir al cuarto orden (cúbico) para obtener nonplanar curvas. 

Curvas de orden superior permite una mayor continuidad, pero esto no suele ser necesario. Curvas de orden superior son más informáticos y empezar a sufrir de redondear errores al hacer las matemáticas de coma flotante.

El Prototipo NurbsCurve 

En Listado de 15.1, se muestra el nodo definición PROTO para NurbsCurve. Tenga en cuenta que PROTO "-es una" IndexedLineSet-es decir, desde el primer nodo es un IndexedLineSet, PROTO este puede ser usado sólo cuando un IndexedLineSet puede usarse. Así NurbsCurve sólo puede utilizarse en el ámbito de la geometría de una forma nodo. 

15.1 La lista de VRML Prototipo para una NurbsCurve Nodo 

PROTO NurbsCurve [campo de depuración SFBool FALSE          SFInt32 segmentos campo 20          campo MFFloat knotSequence 0          campo MFFloat controlPoints 0] {

   DEF ILS IndexedLineSet {    coord       Coordinar ()     coordIndex []     }

Page 11: CAPÍTULO  15

11

VRML 2.0 con Java CAPÍTULO 12

    DEF curva Guión{      SFBool materia de depuración de depuración se      campo SFInt32 segmentos segmentos ES      campo MFFloat knotSequence ES knotSequence      campo MFFloat controlPoints ES controlPoints      eventOut SFNode coord_changed      eventOut MFInt32 coordIndex_changed 

     url "NurbsCurve.class"      }

     VÍA curve.coord_changed A ILS.set_coord      VÍA curve.coordIndex_changed A ILS.set_coordIndex }

Este PROTO tiene cuatro campos: la depuración, segmentos, knotSequence, y controlPoints. La depuración de campo, que por defecto es FALSE, imprime la información que usted podría encontrar útil a la hora de aprender este prototipo funciona. Los segmentos de los controles sobre el terreno cómo suavizar la curva aparecerá especificando el número de segmentos de línea de hacer. El campo tiene knotSequence el conjunto de valores de nudo, y el campo controlPoints tiene la matriz de puntos de control (que interpretamos como cuatro valores de punto flotante por cada punto de control). 

IndexedLineSet El nodo es simplemente un vacío, sino que será atribuido por la secuencia de comandos. El nodo de secuencias de comandos y la ruta declaraciones hacer todo el trabajo. Las Rutas permitir la secuencia de comandos para establecer la coordinación y coordIndex campos del IndexedLineSet, mientras que la secuencia de comandos NurbsCurve.class como especifica el bytecode de Java que ejecuta la secuencia de comandos. Cuando ejecuta NurbsCurve.class, generará coord_changed y coordIndex_changed eventos. Los trazados a utilizar el nuevo coordIndex información y coordinación de estos eventos para llenar el vacío IndexedLineSet; los nuevos rellenos IndexedLineSet serán prestados por el navegador de VRML. 

Más adelante en el capítulo vamos a presentar el código fuente de NurbsCurve.class y mostrar la forma en que se invoca y la forma en que notifique a las rutas que ha creado nuestra NURBS para nosotros. Superficies paramétricas 

Todo lo aprendido sobre las curvas paramétricas es directamente aplicable a las superficies paramétricas, pero ahora tenemos dos parámetros en vez de uno. Estos suelen ser llamados u polinomio y c. La ampliación de una superficie paramétrico se puede escribir como sigue: 

Page 12: CAPÍTULO  15

12

VRML 2.0 con Java CAPÍTULO 12

Usted puede pensar que las coordenadas de estos parámetros como la textura similar a las coordenadas que se discutieron en el capítulo 10, la U y V, las coordenadas se limitan a la superficie, no importa cuán distorsionado o torcido que es. El real (x, y, z) el punto se encuentra conectando un (u, v) en las ecuaciones paramétricas y resolver, de la misma manera que el mapa de coordenadas de textura 3-puntos en el espacio. No tenemos que ir de nuevo sobre él, excepto para mostrar, en la Figura 15.6, lo que es una superficie paramétrico parece. 

Figura 15.6 Wire marco de la prestación de una superficie NURBS 

Forma NURBS 

Más que con las curvas paramétricas, los coeficientes del polinomio de superficie paramétrico expansión tienen poco significado intuitivo. Tratando de encontrar los coeficientes para generar la superficie que desea puede ser una pesadilla! NURBS de nuevo, pero nos proporcionan una manera más fácil, una vez más en términos de los nudos y los puntos de control. Con dos variables paramétricas que lidiar con, ahora tenemos dos secuencias de nudo y, por consiguiente, más puntos de control, pero el principio sigue siendo el mismo. Todas las relaciones se ha mencionado anteriormente para seguir celebrando cada una de las direcciones de forma independiente. Así pues, el orden en la dirección u más el número de puntos de control en la u es igual al número de u nudos. El número total de puntos de control es igual al producto del número de U y V, los puntos de control. El casco convexo de la superficie es ahora un piecewise lineal (facetas) de superficie.

Page 13: CAPÍTULO  15

13

VRML 2.0 con Java CAPÍTULO 12

Parches de Bézier 

Así como una curva de Bézier es un tipo especial de curva NURBS, un parche de Bézier es un tipo especial de superficie NURBS. Un parche de Bézier tiene dos curvas de Bézier perfil, uno en la U y una dirección en la dirección v. Tenemos que especificar las secuencias de dos nudos que tienen una multiplicidad nudo en cada extremo de la secuencia igual a la orden de la curva. El alambre se muestra en la Figura 15.6 es en realidad una superficie de Bézier. El Prototipo NurbsSurface 

La definición de PROTO VRML NurbsSurface se muestra en el Listado 15.2. 

15.2 La lista de VRML Prototipo para una NurbsSurface Nodo 

PROTO NurbsSurface [campo de depuración SFBool FALSE           campo SFInt32 uSegments 20           campo SFInt32 vSegments 20           campo MFFloat uKnotSequence 0           campo MFFloat vKnotSequence 0           campo SFInt32 numUControlPoints 0           campo SFInt32 numVControlPoints 0           campo MFFloat controlPoints 0           SFBool campo ccw TRUE           campo SFFloat creaseAngle 0,5           SFBool materia sólida FALSE] {

IFS IndexedFaceSet (DEF   coord     Coordinar {}  coordIndex []   ccw ES ccw   TRUE convexo   creaseAngle ES creaseAngle   sólido es sólido   }DEF superficie Guión {  SFBool materia de depuración de depuración se 

Page 14: CAPÍTULO  15

14

VRML 2.0 con Java CAPÍTULO 12

  SFInt32 uSegments campo se uSegments   SFInt32 vSegments campo se vSegments   campo MFFloat uKnotSequence ES uKnotSequence   campo MFFloat vKnotSequence ES vKnotSequence   SFInt32 numUControlPoints campo se numUControlPoints   SFInt32 numVControlPoints campo se numVControlPoints   campo MFFloat controlPoints ES controlPoints   eventOut SFNode coord_changed   eventOut MFInt32 coordIndex_changed 

  url "NurbsSurface.class"   }

  VÍA surface.coord_changed A IFS.set_coord   VÍA surface.coordIndex_changed A IFS.set_coordIndex }

Aparte de tener unos pocos más de los campos, esto es muy similar a la curva-nurbs PROTO. Nota, sin embargo, que este PROTO "es-un" IndexedFaceSet y no como un IndexedLineSet la NurbsCurve. Tenemos que generar una superficie (no una línea), por lo que necesitamos al nudo secuencia (uKnotSequence) y av nudo secuencia (vKnotSequence), y desde nuestros puntos de control se encuentran en una matriz de dos dimensiones, necesitamos saber la dimensión de u (numUControlPoints) y la dimensión v (numVControlPoints) en el punto de control conjunto. El vSegments campos uSegments y háganos saber cómo teselar finamente a la superficie en cada dirección. 

Esto también ha PROTO ccw, sólido, y creaseAngle campos, que se transmiten directamente a la creación IndexedFaceSet. Desde que están generando las caras algorithmically, podemos establecer con confianza el ámbito de la IndexedFaceSet convexa para ser verdad. 

Al igual que el NurbsCurve, un NurbsSurface sólo puede utilizarse en el ámbito de la geometría de una forma nodo. Esto no es una limitación, sino que nos permite especificar un aspecto nodo para que podamos NurbsSurface este color o aplicar un ImageTexture a ella, o hacer lo que haría normalmente a una forma (escala, traducir, rotar, y así sucesivamente) . 

El Prototipo NurbsRevolve 

Una superficie de revolución es un tipo especial de superficie paramétrico. El NurbsRevolve PROTO que genera una superficie de revolución se muestra en el Listado 15.3. 

15.3 La lista de VRML Prototipo para una NurbsRevolve Nodo 

Page 15: CAPÍTULO  15

15

VRML 2.0 con Java CAPÍTULO 12

PROTO NurbsRevolve [campo de depuración SFBool FALSE           SFInt32 segmentos campo 20           campo SFFloat minAngle 0           campo SFFloat maxAngle 6.2831853072           campo SFInt32 profileSegments 20           campo MFFloat profileKnotSequence 0           campo MFFloat profileControlPoints 0           SFBool campo ccw TRUE           campo SFFloat creaseAngle 0,5           SFBool materia sólida FALSE] {

   IFS IndexedFaceSet (DEF     coord       Coordinar ()     coordIndex []     ccw ES ccw     TRUE convexo     creaseAngle ES creaseAngle     sólido es sólido     }    DEF superficie Guión {     SFBool materia de depuración de depuración se      campo SFInt32 segmentos segmentos ES      SFInt32 profileSegments campo se profileSegments      campo MFFloat profileKnotSequence ES profileKnotSequence      campo MFFloat profileCcontrolPoints ES profileControlPoints      eventOut SFNode coord_changed      eventOut MFInt32 coordIndex_changed 

     url "NurbsRevolve.class"      }

     VÍA surface.coord_changed A IFS.set_coord      VÍA surface.coordIndex_changed A IFS.set_coordIndex }

En el NurbsRevolve PROTO, como en el NurbsSurface PROTO, estamos construyendo un IndexedFaceSet. Pero en este caso, estamos usando un solo nudo de secuencia y un conjunto de 

Page 16: CAPÍTULO  15

16

VRML 2.0 con Java CAPÍTULO 12

puntos de control para especificar el perfil de una curva. El perfil de la curva de barrido en torno a un círculo-cuando NurbsRevolve.class ejecuta este barrido se logra utilizando la utilidad de algunos de los métodos definidos en la clase nurbs (que vamos a cubrir en la próxima sección). Una vez más, la suavidad de la superficie tanto en el perfil de la dirección y la dirección de barrido es controlado por el usuario. Aplicación 

Ahora que sabes lo que son NURBS, veamos cómo podemos representarlos utilizando Java y aplicar un conjunto de clases y sus métodos que nos permitirán manipular NURBS para cualquier propósito (VRML incluido!). Luego, veremos cómo puede utilizar estas clases para aplicar el NurbsCurve, NurbsSurface, y NurbsRevolve prototipos que han sido definidos en la sección anterior. 

El paquete de NURBS 

Como se mencionó anteriormente en este capítulo, una NURBS puede ser descrita mediante una secuencia de nudo para la U y V, a lo largo de las direcciones con una gran variedad de puntos de control, cada uno de los cuales es coordinar un conjunto homogéneo. La representación más sencilla, entonces, se compone de cuatro clases: nurbs, nudo, ControlNet y Point4. Todas estas clases de la aplicación de la interfaz y Cloneable anular el clon () método para llevar a cabo un profundo (y no superficiales) una copia del objeto. Esto será útil para la copia y la reutilización de objetos nurbs. Además, cada clase sobreescribe el método toString () del objeto a imprimir una lectura de representación de la clase ejemplo. Esto será útil para la depuración y para cuando llegue la hora de escribir un VRML representación de la instancia. 

Ya que nuestro objetivo principal es proporcionar un uso general NURBS paquete, vamos a tratar de separar cualquier VRML-partes específicas. No vamos a tratar de describir la totalidad del paquete NURBS en este capítulo, toda la documentación de todas las clases y sus métodos se proporciona en el CD-ROM en forma de archivos HTML generada por javadoc. 

Nurbs 

La clase principal es la nurbs clase. Esta clase tiene dos referencias a objetos y un nudo ControlNet objeto. Nurbs el objeto no sabe nada acerca de la orden, el número de nudos en las direcciones U y V, o el número de puntos de control en las direcciones u y v-esta información está contenida en el nudo, ya sea de objetos o el objeto ControlNet. Ambos U y V nudo secuencias se almacenan independientemente de que el objeto nurbs representa una curva o una superficie, pero cuando se representa una curva de NURBS, la v contiene sólo un nudo, y el orden en la dirección v se pone a cero. Nurbs contiene la clase de métodos para la creación de objetos nurbs, como giran en () (que se utiliza para NurbsRevolve aplicación), la extrusión (), y teselar (), así como métodos de 

Page 17: CAPÍTULO  15

17

VRML 2.0 con Java CAPÍTULO 12

utilidad para operar en los objetos nurbs (transponer () , la escala (), y así sucesivamente) y los métodos para recuperar información acerca de los casos (como getUNumKnots ()). 

Nudo 

El nudo de clase tiene una serie de números de punto flotante para el nudo secuencia. También se almacenan enteros que contienen el número de puntos de control y el orden. Tenga en cuenta que esto crea una dependencia implícita entre el nudo y ControlNet. El número de nudos nunca es especificado de forma explícita, sino que se deduce de la suma de la orden y el número de puntos de control. Los controles se realizan para garantizar que el número de nudos inferirse es coherente con la longitud de la secuencia nudo matriz. Métodos que operan sobre nudo objetos, tales como unionKnots () y el intervalo (), también forman parte de esta clase. 

ControlNet 

ControlNet La clase tiene una matriz bidimensional de Point4 objetos, junto con dos enteros para celebrar la U y V dimensiones. Transformaciones geométricas (rotación (), traducir (), y así sucesivamente) en un nurbs puede ser llevada a cabo por explotación únicamente en el ControlNet usando métodos previstos. Además, una serie de métodos son proporcionados para el perfeccionamiento de la ControlNet. 

Point4 

El Point4 clase homogénea representa las coordenadas en el espacio 3-a través de cuatro números de punto flotante (x, y, z, w). La w se utiliza como coordinar un peso de curvas y superficies racionales. El peso es positivo definido y es igual a uno para no racional curvas y superficies. 

Los comandos de las clases 

Con el paquete nurbs definido, podemos utilizarlo para aplicar la nurbs-Curva, Superficie nurbs, y NurbsRevolve prototipos. 

NurbsCurve 

Como se puede ver en el Listado 15.4, NurbsCurve se extiende la clase de secuencias de comandos, según sea necesario; la construcción de la NURBS se realiza en su totalidad en el initialize (), método que se llama cada vez que el prototipo NurbsCurve cargado por el navegador.

Page 18: CAPÍTULO  15

18

VRML 2.0 con Java CAPÍTULO 12

Listado de 15,4 para NurbsCurve.java Código Fuente

importación vrml .*; importación vrml.field .*; importación vrml.node .*;

importación nurbs .*;

clase pública se extiende NurbsCurve Guión {

   SFBool privado de depuración;    SFInt32 sectores privados;    MFFloat knotSequence privado;    MFFloat controlPoints privado;

   MFInt32 coordIndex_changed privado;    SFNode coord_changed privado;

   public void inicializar () {     debug = (SFBool) getField ( "debug");      segmentos = (SFInt32) getField ( "segmentos");      knotSequence = (MFFloat) getField ( "knotSequence");      controlPoints = (MFFloat) getField ( "controlPoints");

     coordIndex_changed = (MFInt32) getEventOut ( "coordIndex_changed");      coord_changed = (SFNode) getEventOut ( "coord_changed");

     / /      / / En primer lugar crear el Nudos      / /      int numControlPoints = controlPoints.getSize () / 4;      int numKnots = knotSequence.getSize ();      int fin = numKnots - numControlPoints;

     flotado [] = new nudo flotar [numKnots];      for (int i = 0; i <numKnots, i) {        nudo [i] = knotSequence.get1Value (i);      }

     U = nuevo nudo nudo (auto, numControlPoints);

Page 19: CAPÍTULO  15

19

VRML 2.0 con Java CAPÍTULO 12

     u.setKnots (nudo);

     numControlPoints = 1;      numKnots = 1;      fin = 0; / / constante      nudo = new flotar [numKnots];      nudo [0] = 0.00f;

     V = new nudo nudo (auto, numControlPoints);      v.setKnots (nudo);

     / /      / / En segundo lugar crear la ControlNet      / /      Point4 [] [] = new Point4 puntos [u.getNumControlPoints ()]                         [v.getNumControlPoints ()];      for (int i = 0; i <u.getNumControlPoints (), i) {          for (int j = 0; j <v.getNumControlPoints (); j) {             / / Crea el Point4 objetos y les inicializa             int index = 4 * (i j * v.getNumControlPoints ());             puntos [i] [j] =                nuevo Point4 (controlPoints.get1Value (índice 0),                      controlPoints.get1Value (índice 1),                      controlPoints.get1Value (índice 2),                      controlPoints.get1Value (índice 3));          }     }     ControlNet ControlNet ControlNet = new (u.getNumControlPoints (),                             v.getNumControlPoints (),                             puntos);

     / /      / / Por último podemos construir la NURBS      / /      Nurbs temp = new nurbs (u, v, ControlNet);

     / /      / / Ahora a teselar suavidad deseada      / /      Nurbs curva = temp.tessellate (segments.getValue (), 0);      NewCOORD cadena = curve.toVRMLCoordinateNode ();      int [] newINDEX = curve.toVRMLCoordIndex ();

     / /      / / Enviar el eventOuts al nodo de secuencias de comandos      / /      try {

Page 20: CAPÍTULO  15

20

VRML 2.0 con Java CAPÍTULO 12

       coord_changed.setValue {              getBrowser (). createVrmlFromString (newCOORD) [0]);        coordIndex_changed.setValue (newINDEX);      }     de capturas (InvalidVRMLSyntaxException e) ()    }}

Después de inicializar las referencias a los valores del campo, nos preparamos para crear un objeto nurbs en primer lugar la creación de dos objetos nudo. U El nudo es inicializado usando los valores de la especificada por el usuario knotSequence campo, mientras que el nudo v es difícil-por cable a un punto de control y un nudo de valor (esto es porque estamos creando una curva y no una superficie).

Tenemos que declarar el 2-D gama de objetos y Point4 inicializarlas utilizando valores de la especificada por el usuario controlPoints campo. Una vez que tenemos la gama Point4, podemos crear un ControlNet, que a su vez se utiliza junto con los dos objetos de nudo para la construcción de la nurbs para esta curva. Todo lo que queda es perfeccionar la nurbs al número deseado de segmentos llamando teselar ().

Cuando el mosaico está completo, tenemos que coordinar el refinado y la conectividad de información de nuestra secuencia de comandos y en nuestro PROTO. Esto se realiza mediante el establecimiento de la coord_changed y coordIndex_changed eventOuts, que será utilizada por rutas en nuestro PROTO para establecer los valores de la IndexedLineSet que representará a esta curva. Coordinar el nuevo nodo para la coordinación sobre el terreno de la IndexedLineSet se crea usando createVrmlFromString () y pasar como argumento la cadena de regresar de la toVRMLCoordinateNode () método definido en la nurbs clase. El nuevo campo coordIndex del IndexedLineSet se crea a partir de una matriz entero devuelto por el toVRMLCoordIndex () método.

Para mayor claridad, el código que imprime información de depuración cuando la depuración es TRUE campo quedó fuera de Listado de 15.4. Es, sin embargo, incluido en la versión de NurbsCurve.java que aparece en el CD-ROM.

NurbsSurface

Aparte de unos nuevos campos que tenemos que tratar, NurbsSurface es muy similar a NurbsCurve. El código fuente para NurbsSurface.java se muestra en el Listado 15.5. Nosotros creamos dos objetos nudo como antes, pero esta vez ambos se inicializan de la especificada por el usuario campos. Y una vez más crear un ControlNet de valores en el campo controlPoints.

Listado de 15,5 para NurbsSurface.java Código Fuente 

Page 21: CAPÍTULO  15

21

VRML 2.0 con Java CAPÍTULO 12

importación vrml .*; importación vrml.field .*; importación vrml.node .*; 

importación nurbs .*; 

clase pública se extiende NurbsSurface Guión {

   SFBool privado de depuración;    SFInt32 uSegments privado;    SFInt32 vSegments privado;    MFFloat uKnotSequence privado;    MFFloat vKnotSequence privado;    SFInt32 numUControlPoints privado;    SFInt32 numVControlPoints privado;    MFFloat controlPoints privado; 

   MFInt32 coordIndex_changed privado;    SFNode coord_changed privado; 

   public void inicializar () {    debug = (SFBool) getField ( "debug");     uSegments = (SFInt32) getField ( "uSegments");     vSegments = (SFInt32) getField ( "vSegments");     uKnotSequence = (MFFloat) getField ( "uKnotSequence");     vKnotSequence = (MFFloat) getField ( "vKnotSequence");     numUControlPoints = (SFInt32) getField ( "numUControlPoints");     numVControlPoints = (SFInt32) getField ( "numVControlPoints");     controlPoints = (MFFloat) getField ( "controlPoints"); 

    coordIndex_changed = (MFInt32) getEventOut ( "coordIndex_changed");     coord_changed = (SFNode) getEventOut ( "coord_changed"); 

    / /     / / En primer lugar crear el Nudos     / /     int numControlPoints = numUControlPoints.getValue ();     int numKnots = uKnotSequence.getSize ();     int fin = numKnots - numControlPoints; 

    flotado [] = new nudo flotar [numKnots];     for (int i = 0; i <numKnots, i) {

Page 22: CAPÍTULO  15

22

VRML 2.0 con Java CAPÍTULO 12

      nudo [i] = uKnotSequence.get1Value (i);     }

    U = nuevo nudo nudo (auto, numControlPoints);     u.setKnots (nudo);     numControlPoints = numVControlPoints.getValue ();     numKnots = vKnotSequence.getSize ();     fin = numKnots - numControlPoints; 

    nudo = new flotar [numKnots];     for (int i = 0; i <numKnots, i) {      nudo [i] = vKnotSequence.get1Value (i);     }

    V = new nudo nudo (auto, numControlPoints);     v.setKnots (nudo); 

    / /     / / En segundo lugar crear la ControlNet     / /     Point4 [] [] = new Point4 puntos [u.getNumControlPoints ()]                        [v.getNumControlPoints ()];     for (int i = 0; i <u.getNumControlPoints (), i) {       for (int j = 0; j <v.getNumControlPoints (); j) {         / / Crea el Point4 objetos y les inicializa         int index = 4 * (i j * v.getNumControlPoints ());         puntos [i] [j] =            nuevo Point4 (controlPoints.get1Value (índice 0),                  controlPoints.get1Value (índice 1),                  controlPoints.get1Value (índice 2),                  controlPoints.get1Value (índice 3));         }      }      ControlNet ControlNet ControlNet = new (u.getNumControlPoints (),                              v.getNumControlPoints (),                              puntos); 

      / /       / / Por último podemos construir la NURBS       / /       Nurbs temp = new nurbs (u, v, ControlNet); 

Page 23: CAPÍTULO  15

23

VRML 2.0 con Java CAPÍTULO 12

      / /       / / Ahora a teselar suavidad deseada       / /       Nurbs temp.tessellate superficie = (uSegments.getValue (),                           vSegments.getValue ());       NewCOORD cadena = surface.toVRMLCoordinateNode ();       int [] newINDEX = surface.toVRMLCoordIndex (); 

      / /       / / Enviar el eventOuts al nodo de secuencias de comandos       / /       try {        coord_changed.setValue {               getBrowser (). createVrmlFromString (newCOORD) [0]);         coordIndex_changed.setValue (newINDEX);       }      de capturas (InvalidVRMLSyntaxException e) ()     }}

Los dos nudos y el ControlNet se utilizan para construir un nurbs, que después se transforma en las direcciones U y V a través de una llamada a teselar (). Como antes, la coord_changed y coordIndex eventOuts van a informar a la PROTO de nuevos valores para la IndexedFaceSet que representará a esta superficie. 

NurbsRevolve 

Por ahora está familiarizado con el proceso de creación de un nurbs y el envío de la información a la PROTO, por lo que no vamos a mostrar el código fuente de NurbsRevolve.java aquí (se puede encontrar en el CD-ROM). NurbsRevolve aplicación supone la creación de un nurbs para representar a la revolución de la curva de perfil (esto es exactamente igual que el NurbsCurve código), entonces se invoca la gira () método de nurbs, que se amplía tanto el nudo y el v ControlNet para dar cabida a una superficie. Luego afinar la superficie tanto en la U y V, las direcciones y configurar el eventOuts. Una cosa para notar es que giran en el () el método de proyectos de perfil de la curva en el plano xy antes de barrer la curva alrededor del eje z. 

Ejemplos 

Numerosos ejemplos de la utilización de NurbsCurve, NurbsSurface, y NurbsRevolve se incluyen en el CD-ROM, junto con todo el código fuente. Aquí vamos a presentar sólo un ejemplo de cómo 

Page 24: CAPÍTULO  15

24

VRML 2.0 con Java CAPÍTULO 12

utilizar cada uno de estos mundos en su VRML. 

Helix.wrl 

Nuestro primer ejemplo le mostrará cómo usar el prototipo NurbsCurve para crear una curva en tres dimensiones. El código de VRML se muestra en el Listado 15.6. 

Listado de 15.6 Ejemplo de la utilización NurbsCurve Prototipo para crear una curva en forma de espiral 

# VRML V2.0 utf8 

EXTERNPROTO NurbsCurve [SFBool materia de depuración            campo SFInt32 segmentos            MFFloat knotSequence campo            MFFloat controlPoints campo] "http://www.ocnus.com/NURBS/NurbsCurve.wrl" 

Punto de vista {   posición 0 3 15   orientación 0 0 1 0   fieldOfView 0.785398   descripción "NURBS Helix" }

Forma {  apariencia     Aspecto {       material        Material diffuseColor (1 1 0)     }  geometría     (# NurbsCurve Helix      100 segmentos      knotSequence [0, 0, 0, 0,               1, 2, 3, 4, 5, 6, 7, 8, 9,              10, 10, 10, 10,]      controlPoints [6,0 0,0 6,0 1,               -5,5 0,5 5,5 1,               -5,0 1,0 -5,0 1,                4,5 1,5 -4,5 1, 

Page 25: CAPÍTULO  15

25

VRML 2.0 con Java CAPÍTULO 12

               4,0 2,0 4,0 1,               -3,5 2,5 3,5 1,               -3,0 3,0 -3,0 1,                2,5 3,5 -2,5 1,                2,0 4,0 2,0 1,               -1,5 4,5 1,5 1,               -1,0 5,0 -1,0 1,                0,5 5,5 -0,5 1,                0,0 6,0 0,0 1,]      } }

Tenga en cuenta que el primer nodo en nuestro NurbsCurve PROTO es un IndexedLineSet, de modo que podemos utilizar un ejemplo de este PROTO un IndexedLineSet donde pueda utilizarse, a saber, en el ámbito de la geometría de una forma nodo. Así que todo lo que se necesita es una declaración EXTERNPROTO para que apunte a la aplicación de la NurbsCurve nodo, y una forma de celebrar el nodo NurbsCurve. El Mirador es opcional.

Aquí estamos especificando 17 nudos y 13 puntos de control, por lo que, recordando que para numKnots = - numControlPoints, podemos ver que la hélice es una curva con el orden 4. Esta es una curva cúbica, ya que el grado (= fin - 1) 3. Usted recordará que una cúbicos curva es la más baja para la curva-que puede representar una curva nonplanar. La secuencia tiene un nudo multiplicidad igual a su fin al principio y al final, por lo que la curva resultante se pasa por los dos extremos de control de puntos: (6, 0, 6) y (0, 6, 0).

La curva que los resultados de la utilización del prototipo de esta manera se muestra en la Figura 15.7.

Figura 15.7 Ejemplo NurbsCurve: Helix.wrl

BézierSurface.wrl

Para nuestro segundo ejemplo, le mostraremos el uso de la NurbsSurface prototipo para crear una textura de superficie de Bézier mapeados. El código de VRML se muestra en el Listado 15.7.

Page 26: CAPÍTULO  15

26

VRML 2.0 con Java CAPÍTULO 12

Listado de 15.7 Ejemplo de la utilización NurbsSurface Prototipo para crear una textura de superficie de Bézier-asignadas

# VRML V2.0 utf8

EXTERNPROTO NurbsSurface [SFBool materia de depuración            SFInt32 uSegments campo            SFInt32 vSegments campo            MFFloat uKnotSequence campo            MFFloat vKnotSequence campo            SFInt32 numUControlPoints campo            SFInt32 numVControlPoints campo            MFFloat controlPoints campo            SFBool campo ccw            campo SFFloat creaseAngle            SFBool sólidos sobre el terreno] "http://www.ocnus.com/NURBS/NurbsSurface.wrl"

Punto de vista {   posición 0 0 25    orientación 0 0 1 0    fieldOfView 0.785398    descripción "de Bezier NURBS Surface" }

Forma {   apariencia      Aspecto {       material         (Material diffuseColor .8 .8 .8)       textura         ImageTexture (url "quilt.gif")      }   geometría       (# NurbsSurface superficie de Bezier        depuración FALSE        creaseAngle 0,5        uSegments 20        vSegments 20        uKnotSequence [0, 0, 0, 0,                 1, 1, 1, 1,]        vKnotSequence [0, 0, 0, 0,                 1, 1, 1, 1,]        numUControlPoints 4        numVControlPoints 4        controlPoints [-9 -2 8 1,                -4 1 8 1,

Page 27: CAPÍTULO  15

27

VRML 2.0 con Java CAPÍTULO 12

                4 -3 6 1,                10 -1 8 1,                -6 3 4 1,                 0 -1 4 1,                 2 -1 4 1,                 6 2 4 1,               -10 -2 -2 1,                -4 -4 -2 1,                 4 -1 -2 1,                10 0 -2 1,                -9 2 -6 1,                -4 -4 -5 1,                 4 3 -5 1,                 9 -2 -6 1]        } }

Un parche de Bézier tiene dos curvas de Bézier perfil. Una imagen de una manta se utiliza como mapa de textura. Tenemos que especificar nudo secuencias y puntos de control tanto en la U y V, las direcciones, y también podrá especificar la suavidad en cada sentido por separado utilizando el uSegments y vSegments campos.

Esta superficie es bi-cúbico (cúbicos en U y V), como se puede ver porque para numKnots = - numControlPoints = 8 - 4 = 4). También interpola sus extremos, ya que la multiplicidad de nudo en cada extremo de la secuencia es igual a la orden de la curva. La superficie resultante se muestra en la Figura 15.8.

Figura 15.8 Ejemplo NurbsSurface: BezierCurve.wrl

Torus.wrl

Nuestro último ejemplo le mostrará cómo usar el prototipo NurbsRevolve para crear una superficie de revolución. En este caso, crear un toro de rotación por una sección circular. El CD-ROM contiene otros ejemplos.

Listado de 15.8 Ejemplo de la utilización NurbsRevolve para crear un prototipo de Torus 

# VRML V2.0 utf8 

Page 28: CAPÍTULO  15

28

VRML 2.0 con Java CAPÍTULO 12

EXTERNPROTO NurbsRevolve [SFBool materia de depuración            campo SFInt32 segmentos            campo SFFloat minAngle            campo SFFloat maxAngle            SFInt32 profileSegments campo            MFFloat profileKnotSequence campo            MFFloat profileControlPoints campo            SFBool campo ccw            campo SFFloat creaseAngle            SFBool sólidos sobre el terreno] "http://www.ocnus.com/NURBS/NurbsRevolve.wrl" 

Punto de vista {   posición 0 0 5   orientación 0 0 1 0   fieldOfView 0.785398   descripción "NURBS Torus" }

Forma {   apariencia     Aspecto {      material        Material diffuseColor (1 1 0)     }  geometría     (# NurbsRevolve Torus      depuración FALSE      40 segmentos      profileSegments 40      profileKnotSequence [0.00, 0.0, 0.0, 0.25,                   0,25, 0,5, 0,5, 0,75,                   0,75, 1,0, 1,0, 1,00]      profileControlPoints [3 0 0 1,                   2,121320 0,707107 0 0,707107,                   2 1 0 1,                   0,707107 0,707107 0 0,707107,                   1 0 0 1,                   0,707107 -0,707107 0 0,707107,                   2 -1 0 1,                   2,121320 -0,707107 0 0,707107,                   3 0 0 1] 

Page 29: CAPÍTULO  15

29

VRML 2.0 con Java CAPÍTULO 12

     } }

En la creación de un toro, en primer lugar, definir el perfil de la curva a un círculo de radio unidad en el plano xy, compensado por dos unidades del eje y. Recuerde que el 3-D representado por un punto coordenado homogéneo se puede encontrar dividiendo cada uno de los componentes por el peso. Así, por ejemplo, el primer punto de control (3, 0, 0, 1) se encuentra en x = 3, y = z = 0. Asimismo, el segundo punto de control (2.121320, 0.707107, 0, 0.707107) se encuentra en (x = 3, y = 1, z = 0). Como puede ver, estos son sólo los puntos de control para un círculo desplazado dos unidades en la dirección x positiva. (Para comparar, véase Circle.wrl, que se encuentra en la unidad de CD-ROM.) Cuando utilice NurbsRevolve, recuerde que el perfil de la curva se prevé que el plano xy, antes de ser barridos. En este sentido, hemos obligado explícitamente el perfil que se curva en este plano mediante el establecimiento de todas las coordenadas-z a cero. La superficie resultante de la revolución se muestra en la Figura 15.9. 

Figura 15.9 Ejemplo NurbsRevolve: Torus.wrl 

El perfil de la curva de toro es una curva cuadrática, ya que la orden de 3 (12 nudos - 9 puntos de control). Todas las secciones cónicas, como el círculo aquí utilizado, puede ser exactamente representado por curvas cuadráticas. 

Si hubiera querido, podríamos haber especificado no los valores por defecto de minAngle y maxAngle de la revolución-esto podría hacer que nuestra superficie resultante parecen doblar el codo de una tubería, por ejemplo. 

Utilización 

NURBS puede ser confuso cosas. Esto se debe a que las matemáticas que se trata es un poco intimidante. Pero no deje que eso le disuadir; NURBS son de fácil e intuitivo de usar y le dan una notable ventaja. Es posible que ya tenga todo tipo de ideas de cómo utilizar estos nodos, si no, aquí hay unos pocos a la chispa de su imaginación. 

Si ya sabe cómo construir curvas y superficies NURBS, simplemente conecte su nudos y puntos de control y tiene curvas y superficies de VRML. No alboroto, ningún muss. Si no sabe, entonces experimento! 

Si usted tiene un 2-D o 3-D de modelado programa que puede utilizar las descripciones de salida spline puntos de control y nudos, el uso de los directamente en el NURBS prototipos presentados 

Page 30: CAPÍTULO  15

30

VRML 2.0 con Java CAPÍTULO 12

aquí. Algunas de las cifras que figuran en este capítulo se han creado como curvas de Bézier en Adobe Illustrator, los puntos de control se extrajeron de los archivos PostScript, y un nudo de secuencia se añadió. Una pantalla instantánea fue tomada luego de la rendición de VRML de la curva. 

Si usted está escribiendo un modelador 3-D, crear una interfaz de usuario para señalar a la splines en la pantalla y, a continuación, guardar el resultado de superficies curvas o el uso de estos prototipos. (Esto está previsto para una futura versión del modelador VermelGen que ha tropezado en el capítulo 12.) 

Escribir una geometría traductor? No se moleste en tratar de hacer su propia traducción de las curvas en spline VRML-nurbs utilizar el paquete y ahorrará mucho tiempo. 

Crear un nuevo nodo de prototipos utilizando el paquete nurbs. Las principales candidatas para los prototipos son 

     • Máscaras: Estirar una NurbsSurface entre dos NurbsCurves.      • extrusiones: Re-aplicar el VRML Extrusión nodo aceptar nurbs-Curvas de la columna vertebral y crossSection.      • Evaluadores: Nodos para devolver el valor de una curva o superficie NURBS dado el nudo parámetros. Estos pueden ser usados para la animación de fotogramas clave y de la interpolación. También se puede utilizar para devolver el valor de la enésima derivada, que se necesita para encontrar la dirección de viaje (primera derivada) en un punto determinado de la curva. NURBS son especialmente útiles para la cámara de animación, porque la continuidad de sus propiedades. 

Gire a la depuración en VRML para obtener una representación de la curva / superficie como un IndexedLineSet / IndexedFaceSet; esta es una manera fácil de realizar una sola vez la conversión entre una descripción y una NURBS indexados forma. 

Más trabajo 

En esta última sección de este capítulo, vamos sobre algunos temas que deberían tratarse en futuras versiones de la NURBS código presentado aquí algunas referencias y la lista de aquellos de ustedes que están interesados en aprender más sobre NURBS.

Velocidad 

Para una aplicación nativa de NurbsSurface y NurbsCurve, obviamente, cuestión de velocidad, ya que el navegador tendrá que resolver las ecuaciones para cada cambio en la visualización de la matriz (en orden de volver a NURBS teselar la pantalla actual dada su dimensión). 

Page 31: CAPÍTULO  15

31

VRML 2.0 con Java CAPÍTULO 12

Para nuestra aplicación, este mosaico se realiza una vez en el initialize () método, al leer en el archivo. Y es una operación muy rápida (aunque no lo suficientemente rápido para llevar a cabo a 24 cuadros por segundo). Ya que simplemente construir el IndexedLineSet o IndexedFaceSet, y luego dejan que sea el navegador para mostrar que la velocidad no es una consideración primordial. 

Aplicación nativa 

Para obtener el máximo beneficio de NURBS nodos en VRML, debemos ponerlas en práctica nativa en el navegador de VRML. Sólo entonces podremos alcanzar una óptima utilización de la prestación por código de máquina, y la aceleración por hardware (si existe). 

Para navegadores escrito usando OpenGL, es increíblemente fácil. OpenGL proporciona dos funciones para crear y hacer directamente NURBS a partir de la información en el prototipo (nudo secuencia, los puntos de control): gluNurbsCurve () y gluNurbsSurface (). OpenGL también tiene otras funciones relacionadas con NURBS para especificar NURBS propiedades (tales como la forma teselar finamente a la curva o superficie) y para la definición y aplicación de las curvas de corte para superficies NURBS (ver más abajo para obtener más información sobre el recorte). 

Pero el primer paso en el establecimiento de un nuevo nodo de VRML es para definir y aplicar la PROTO como lo hemos hecho aquí. Nativo de implementaciones en el navegador seguirá si estos prototipos popular. 

Algoritmos 

El mosaico algoritmo usado aquí es bastante eficiente, sino que rompe una curva añadiendo nudos y puntos de control de manera uniforme. Para obtener una curva o superficie más suave con menos segmentos, podríamos emplear un algoritmo que perfecciona la subdivisión recursiva utilizando NURBS a un nivel predeterminado. Recursivo subdivisión preferentemente añade nudos y puntos de control donde la curvatura es mayor, resultando en una curva suave con un menor número de segmentos. Un futuro aumento también podría permitir a un navegador para elegir el nivel de profundidad sobre la base de LD y podría proporcionar un modo de muy alta subdivisión para la impresión. 

Trim Curvas 

A menudo es útil para poder recortar una superficie NURBS. Recorte implica el uso de una curva NURBS para especificar una sección de la superficie a mantener o quitar. Por ejemplo, una superficie con un agujero en el que podría ser difícil de construir si se limita a la creación de la 

Page 32: CAPÍTULO  15

32

VRML 2.0 con Java CAPÍTULO 12

superficie de los parches NURBS solo. Y una superficie de tales parches sería difícil de modificar: cambiar la forma del agujero, y todos los parches adyacentes necesidad de cambio! Alternativamente, las curvas de NURBS puede ser usado para especificar una sección de la superficie que debe eliminarse o recortarse. Recortar las curvas se definen en la (u, v) coordinar el espacio de las superficies NURBS y, por tanto, las curvas en dos dimensiones. Recortar las curvas puede ser utilizado para la eliminación de las esquinas de las superficies NURBS y facilitar el mosaico de parches en la superficie NURBS compuesto superficies. 

Ajuste de curvas 

Hemos discutido generar NURBS desde cero, eligiendo los nudos y los puntos de control, ya que es así como herramientas de autoría de los trabajos. Juntos, los nudos y definir puntos de control de la forma matemática de la NURBS. Otro uso de este paquete es NURBS en los puntos de montaje existentes deducir los nudos y los puntos de control necesarios para reproducir los puntos con una NURBS. 

Una cosa que sería útil para la compresión es de formas geométricas. Si actualmente tiene un IndexedFaceSet compuesto de muchos puntos, lo más probable es una representación aproximada de una superficie lisa. Usted debe ser capaz de encontrar la superficie NURBS que interpola los puntos en que IndexedFaceSet; resultante NURBS se pueden almacenar más compacta que la IndexedFaceSet y puede utilizarse para reproducir la superficie arbitrariamente suavidad en cualquier momento. La cantidad de compresión aumenta de manera espectacular el número de caras en el original IndexedFaceSet aumenta. 

Interpolators 

Otro uso para la instalación es el de crear una NURBS que es una interpolación entre los puntos clave, por ejemplo, las posiciones y orientaciones de animación a lo largo de un camino. El nudo NURBS parámetro puede ser utilizado como un índice para determinar la posición y orientación en un punto arbitrario en el camino. De esta forma, movimiento suave se puede obtener. La continuidad de las propiedades NURBS son especialmente importantes cuando se desea buen movimiento, ya que C2 continuidad implica que las velocidades y aceleraciones son igualados en puntos unirse. 

Autoría 

Si ha intentado utilizar cualquiera de las presentadas hasta el momento el código para crear sus propias curvas o superficies, te das cuenta de que la elección de los nudos y los puntos de control para obtener la curva exacta que desea no es algo que usted puede hacer fácilmente a mano. NURBS realmente requieren una herramienta de autoría para ser utilizado de manera efectiva. La 

Page 33: CAPÍTULO  15

33

VRML 2.0 con Java CAPÍTULO 12

buena noticia es que cuando usted tiene una herramienta de autoría, la manipulación de NURBS es fácil e intuitiva, lo que le permite rápidamente complejo modelo de superficies curvas. 

Muchas herramientas están disponibles de autor que le permiten utilizar el modelo NURBS. Estas herramientas suelen guardar la descripción de las NURBS utilizando secuencias nudo y puntos de control, tal como se presenta en este capítulo. Después de haber desarrollado los prototipos aquí debe hacer la traducción al VRML fácil para usted. 

Cuando la comunidad de VRML a un consenso sobre las formas de los prototipos, y después de que los usuarios han adquirido experiencia con implementaciones como éste, NURBS será un candidato para su inclusión en la próxima gran versión de la especificación de VRML. 

Referencias 

Muchas de las mejoras están previstas para futuras versiones de la NURBS código. Asimismo, otros basados en NURBS prototipos se han previsto. Usted puede encontrar la versión más reciente del código de http://www.ocnus.com/NURBS/. 

El código Java en el presente capítulo se inspira en la API y los algoritmos en el paquete de dominio público y "El Procedimiento NURBS Biblioteca", escrito por D. WT Hewett y Yip. Su código original, escrito en C, puede obtenerse de http://unix.hensa.ac.uk/. 

Cualquier persona con un interés serio en temas gráficos de computadora, incluyendo NURBS, deberá tener una copia de Computación Gráfica: Principios y Práctica de Foley, van Dam, Feiner y Hughes (Addison-Wesley, 1990). Esta es la "biblia" de los gráficos por ordenador (aunque no el único "buen libro" disponible!). 

Otro libro muy útil, que es más específica al tema de las NURBS, es la Farin curvas y superficies de Diseño Asistido por Computadora geométrica: A Practical Guide (Academic Press, 1993).