You are on page 1of 35

1

VRML 2.0 con Java CAPÍTULO 12

Curvas y Superficies Nurbs

Contenido CAPÍTULO 14
2

VRML 2.0 con Java CAPÍTULO 12

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

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
3

VRML 2.0 con Java CAPÍTULO 12

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 de parámetros, no todos y cada segmento o cara.
4

VRML 2.0 con Java CAPÍTULO 12

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:
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:
6

VRML 2.0 con Java CAPÍTULO 12

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 =

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
7

VRML 2.0 con Java CAPÍTULO 12

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 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.
8

VRML 2.0 con Java CAPÍTULO 12

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
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,
9

VRML 2.0 con Java CAPÍTULO 12

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 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.
10

VRML 2.0 con Java CAPÍTULO 12

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

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


11

VRML 2.0 con Java CAPÍTULO 12

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 []
}
DEF curva Guión{
SFBool materia de depuración de depuración se
campo SFInt32 segmentos segmentos ES
campo MFFloat knotSequence ES knotSequence
12

VRML 2.0 con Java CAPÍTULO 12

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:
13

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
14

VRML 2.0 con Java CAPÍTULO 12

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.

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
15

VRML 2.0 con Java CAPÍTULO 12

TRUE convexo
creaseAngle ES creaseAngle
sólido es sólido
}
DEF superficie Guión {
SFBool materia de depuración de depuración se
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) .
16

VRML 2.0 con Java CAPÍTULO 12

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

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
}
17

VRML 2.0 con Java CAPÍTULO 12

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 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
18

VRML 2.0 con Java CAPÍTULO 12

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 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.
19

VRML 2.0 con Java CAPÍTULO 12

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.

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
20

VRML 2.0 con Java CAPÍTULO 12

//
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);


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);

//
21

VRML 2.0 con Java CAPÍTULO 12

/ / 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 {
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.
22

VRML 2.0 con Java CAPÍTULO 12

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

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
//
23

VRML 2.0 con Java CAPÍTULO 12

int numControlPoints = numUControlPoints.getValue ();


int numKnots = uKnotSequence.getSize ();
int fin = numKnots - numControlPoints;

flotado [] = new nudo flotar [numKnots];


for (int i = 0; i <numKnots, i) {
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);

//
24

VRML 2.0 con Java CAPÍTULO 12

/ / Por último podemos construir la NURBS


//
Nurbs temp = new nurbs (u, v, ControlNet);

//
/ / 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.
25

VRML 2.0 con Java CAPÍTULO 12

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 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,]
26

VRML 2.0 con Java CAPÍTULO 12

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,
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


27

VRML 2.0 con Java CAPÍTULO 12

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.

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,
28

VRML 2.0 con Java CAPÍTULO 12

1, 1, 1, 1,]
numUControlPoints 4
numVControlPoints 4
controlPoints [-9 -2 8 1,
-4 1 8 1,
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.
29

VRML 2.0 con Java CAPÍTULO 12

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


de Torus

# VRML V2.0 utf8

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,
30

VRML 2.0 con Java CAPÍTULO 12

2 -1 0 1,
2,121320 -0,707107 0 0,707107,
3 0 0 1]
}
}

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.
31

VRML 2.0 con Java CAPÍTULO 12

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 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
32

VRML 2.0 con Java CAPÍTULO 12

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).

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
33

VRML 2.0 con Java CAPÍTULO 12

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 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.
34

VRML 2.0 con Java CAPÍTULO 12

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
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
35

VRML 2.0 con Java CAPÍTULO 12

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).

You might also like