Professional Documents
Culture Documents
Contenido CAPÍTULO 14
2
• Introducción a NURBS
• Acondicionamiento
• Curvas Paramétricas
• Superficies Paramétricas
• Aplicación
• Ejemplos
• Utilización
• Más trabajo
Introducción a NURBS
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)
Acondicionamiento
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
Polinomio de Expansión
fin de grado 1 =
Forma NURBS
Secuencia de nudo
Puntos de Control
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
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
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
Curvas cúbicos
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
url "NurbsCurve.class"
}
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.
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
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
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"
}
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.
El Prototipo NurbsRevolve
url "NurbsRevolve.class"
}
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
Nurbs
La clase principal es la nurbs clase. Esta clase tiene dos referencias a objetos y
18
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
NurbsCurve
//
/ / En primer lugar crear el Nudos
20
//
int numControlPoints = controlPoints.getSize () / 4;
int numKnots = knotSequence.getSize ();
int fin = numKnots - numControlPoints;
numControlPoints = 1;
numKnots = 1;
fin = 0; / / constante
nudo = new flotar [numKnots];
nudo [0] = 0.00f;
//
/ / 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
//
/ / 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 ().
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
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.
//
/ / En primer lugar crear el Nudos
//
23
//
/ / 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
//
/ / 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
Ejemplos
Helix.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
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.
BézierSurface.wrl
Listado de 15.7 Ejemplo de la utilización NurbsSurface Prototipo para crear una textura de
superficie de Bézier-asignadas
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
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.
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
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
2 -1 0 1,
2,121320 -0,707107 0 0,707107,
3 0 0 1]
}
}
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
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.)
Más trabajo
En esta última sección de este capítulo, vamos sobre algunos temas que
32
Velocidad
Aplicación nativa
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
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.
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
Referencias
http://unix.hensa.ac.uk/.
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).