3013 lines
89 KiB
Text
3013 lines
89 KiB
Text
B1. Object Files (.obj)
|
|
|
|
Object files define the geometry and other properties for objects in
|
|
Wavefront's Advanced Visualizer. Object files can also be used to
|
|
transfer geometric data back and forth between the Advanced Visualizer
|
|
and other applications.
|
|
|
|
Object files can be in ASCII format (.obj) or binary format (.mod).
|
|
This appendix describes the ASCII format for object files. These files
|
|
must have the extension .obj.
|
|
|
|
In this release, the .obj file format supports both polygonal objects
|
|
and free-form objects. Polygonal geometry uses points, lines, and faces
|
|
to define objects while free-form geometry uses curves and surfaces.
|
|
|
|
About this section
|
|
|
|
The .obj appendix is for those who want to use the .obj format to
|
|
translate geometric data from other software applications to Wavefront
|
|
products. It also provides information for Advanced Visualizer users
|
|
who want detailed information on the Wavefront .obj file format.
|
|
|
|
If you are a 2.11 user and want to understand the significance of the
|
|
3.0 release and how it affects your existing files, you may be
|
|
especially interested in the section called "Superseded statements" at
|
|
the end of the appendix. The section, "Patches and free-form surfaces,"
|
|
gives examples of how 2.11 patches look in 3.0.
|
|
|
|
How this section is organized
|
|
|
|
Most of this appendix describes the different parts of an .obj file and
|
|
how those parts are arranged in the file. The three sections at the end
|
|
of the appendix provide background information on the 3.0 release of
|
|
the .obj format.
|
|
|
|
The .obj appendix includes the following sections:
|
|
|
|
o File structure
|
|
|
|
o General statement
|
|
|
|
o Vertex data
|
|
|
|
o Specifying free-form curves/surfaces
|
|
|
|
o Free-form curve/surface attributes
|
|
|
|
o Elements
|
|
|
|
o Free-form curve/surface body statements
|
|
|
|
o Connectivity between free-form surfaces
|
|
|
|
o Grouping
|
|
|
|
o Display/render attributes
|
|
|
|
o Comments
|
|
|
|
o Mathematics for free-form curves/surfaces
|
|
|
|
o Superseded statements
|
|
|
|
o Patches and free-form surfaces
|
|
|
|
---------------
|
|
|
|
The curve and surface extensions to the .obj file format were
|
|
developed in conjunction with mental images GmbH&Co.KG, Berlin,
|
|
Germany, as part of a joint development project to incorporate
|
|
free-form surfaces into Wavefront's Advanced Visualizer.
|
|
|
|
File structure
|
|
|
|
The following types of data may be included in an .obj file. In this
|
|
list, the keyword (in parentheses) follows the data type.
|
|
|
|
Vertex data
|
|
|
|
o geometric vertices (v)
|
|
|
|
o texture vertices (vt)
|
|
|
|
o vertex normals (vn)
|
|
|
|
o parameter space vertices (vp)
|
|
Free-form curve/surface attributes
|
|
|
|
o rational or non-rational forms of curve or surface type:
|
|
basis matrix, Bezier, B-spline, Cardinal, Taylor (cstype)
|
|
|
|
o degree (deg)
|
|
|
|
o basis matrix (bmat)
|
|
|
|
o step size (step)
|
|
|
|
Elements
|
|
|
|
o point (p)
|
|
|
|
o line (l)
|
|
|
|
o face (f)
|
|
|
|
o curve (curv)
|
|
|
|
o 2D curve (curv2)
|
|
|
|
o surface (surf)
|
|
|
|
Free-form curve/surface body statements
|
|
|
|
o parameter values (parm)
|
|
|
|
o outer trimming loop (trim)
|
|
|
|
o inner trimming loop (hole)
|
|
|
|
o special curve (scrv)
|
|
|
|
o special point (sp)
|
|
|
|
o end statement (end)
|
|
|
|
Connectivity between free-form surfaces
|
|
|
|
|
|
o connect (con)
|
|
|
|
Grouping
|
|
|
|
o group name (g)
|
|
|
|
o smoothing group (s)
|
|
|
|
o merging group (mg)
|
|
|
|
o object name (o)
|
|
|
|
Display/render attributes
|
|
|
|
o bevel interpolation (bevel)
|
|
|
|
o color interpolation (c_interp)
|
|
|
|
o dissolve interpolation (d_interp)
|
|
|
|
o level of detail (lod)
|
|
|
|
o material name (usemtl)
|
|
|
|
o material library (mtllib)
|
|
|
|
o shadow casting (shadow_obj)
|
|
|
|
o ray tracing (trace_obj)
|
|
|
|
o curve approximation technique (ctech)
|
|
|
|
o surface approximation technique (stech)
|
|
|
|
|
|
The following diagram shows how these parts fit together in a typical
|
|
.obj file.
|
|
|
|
Figure B1-1. Typical .obj file structure
|
|
|
|
General statement
|
|
|
|
call filename.ext arg1 arg2 . . .
|
|
|
|
Reads the contents of the specified .obj or .mod file at this
|
|
location. The call statement can be inserted into .obj files using
|
|
a text editor.
|
|
|
|
filename.ext is the name of the .obj or .mod file to be read. You
|
|
must include the extension with the filename.
|
|
|
|
arg1 arg2 . . . specifies a series of optional integer arguments
|
|
that are passed to the called file. There is no limit to the number
|
|
of nested calls that can be made.
|
|
|
|
Arguments passed to the called file are substituted in the same way
|
|
as in UNIX scripts; for example, $1 in the called file is replaced
|
|
by arg1, $2 in the called file is replaced by arg2, and so on.
|
|
|
|
If the frame number is needed in the called file for variable
|
|
substitution, "$1" must be used as the first argument in the call
|
|
statement. For example:
|
|
|
|
call filename.obj $1
|
|
|
|
Then the statement in the called file,
|
|
|
|
scmp filename.pv $1
|
|
|
|
will work as expected. For more information on the scmp statement,
|
|
see appendix C, Variable Substitution for more information.
|
|
|
|
Another method to do the same thing is:
|
|
|
|
scmp filename.pv $1
|
|
|
|
call filename.obj
|
|
|
|
Using this method, the scmp statement provides the .pv file for all
|
|
subsequently called .obj or .mod files.
|
|
|
|
csh command
|
|
|
|
csh -command
|
|
|
|
Executes the requested UNIX command. If the UNIX command returns an
|
|
error, the parser flags an error during parsing.
|
|
|
|
If a dash (-) precedes the UNIX command, the error is ignored.
|
|
|
|
command is the UNIX command.
|
|
|
|
Vertex data
|
|
|
|
Vertex data provides coordinates for:
|
|
|
|
o geometric vertices
|
|
|
|
o texture vertices
|
|
|
|
o vertex normals
|
|
|
|
For free-form objects, the vertex data also provides:
|
|
|
|
o parameter space vertices
|
|
|
|
The vertex data is represented by four vertex lists; one for each type
|
|
of vertex coordinate. A right-hand coordinate system is used to specify
|
|
the coordinate locations.
|
|
|
|
The following sample is a portion of an .obj file that contains the
|
|
four types of vertex information.
|
|
|
|
v -5.000000 5.000000 0.000000
|
|
v -5.000000 -5.000000 0.000000
|
|
v 5.000000 -5.000000 0.000000
|
|
v 5.000000 5.000000 0.000000
|
|
vt -5.000000 5.000000 0.000000
|
|
vt -5.000000 -5.000000 0.000000
|
|
vt 5.000000 -5.000000 0.000000
|
|
vt 5.000000 5.000000 0.000000
|
|
vn 0.000000 0.000000 1.000000
|
|
vn 0.000000 0.000000 1.000000
|
|
vn 0.000000 0.000000 1.000000
|
|
vn 0.000000 0.000000 1.000000
|
|
vp 0.210000 3.590000
|
|
vp 0.000000 0.000000
|
|
vp 1.000000 0.000000
|
|
vp 0.500000 0.500000
|
|
|
|
|
|
|
|
When vertices are loaded into the Advanced Visualizer, they are
|
|
sequentially numbered, starting with 1. These reference numbers are
|
|
used in element statements.
|
|
|
|
Syntax
|
|
|
|
The following syntax statements are listed in order of complexity.
|
|
|
|
v x y z w
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies a geometric vertex and its x y z coordinates. Rational
|
|
curves and surfaces require a fourth homogeneous coordinate, also
|
|
called the weight.
|
|
|
|
x y z are the x, y, and z coordinates for the vertex. These are
|
|
floating point numbers that define the position of the vertex in
|
|
three dimensions.
|
|
|
|
w is the weight required for rational curves and surfaces. It is
|
|
not required for non-rational curves and surfaces. If you do not
|
|
specify a value for w, the default is 1.0.
|
|
|
|
NOTE: A positive weight value is recommended. Using zero or
|
|
negative values may result in an undefined point in a curve or
|
|
surface.
|
|
|
|
vp u v w
|
|
|
|
Free-form geometry statement.
|
|
|
|
Specifies a point in the parameter space of a curve or surface.
|
|
|
|
The usage determines how many coordinates are required. Special
|
|
points for curves require a 1D control point (u only) in the
|
|
parameter space of the curve. Special points for surfaces require a
|
|
2D point (u and v) in the parameter space of the surface. Control
|
|
points for non-rational trimming curves require u and v
|
|
coordinates. Control points for rational trimming curves require u,
|
|
v, and w (weight) coordinates.
|
|
|
|
u is the point in the parameter space of a curve or the first
|
|
coordinate in the parameter space of a surface.
|
|
|
|
v is the second coordinate in the parameter space of a surface.
|
|
|
|
w is the weight required for rational trimming curves. If you do
|
|
not specify a value for w, it defaults to 1.0.
|
|
|
|
NOTE: For additional information on parameter vertices, see the
|
|
curv2 and sp statements
|
|
|
|
vn i j k
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies a normal vector with components i, j, and k.
|
|
|
|
Vertex normals affect the smooth-shading and rendering of geometry.
|
|
For polygons, vertex normals are used in place of the actual facet
|
|
normals. For surfaces, vertex normals are interpolated over the
|
|
entire surface and replace the actual analytic surface normal.
|
|
|
|
When vertex normals are present, they supersede smoothing groups.
|
|
|
|
i j k are the i, j, and k coordinates for the vertex normal. They
|
|
are floating point numbers.
|
|
|
|
vt u v w
|
|
|
|
Vertex statement for both polygonal and free-form geometry.
|
|
|
|
Specifies a texture vertex and its coordinates. A 1D texture
|
|
requires only u texture coordinates, a 2D texture requires both u
|
|
and v texture coordinates, and a 3D texture requires all three
|
|
coordinates.
|
|
|
|
u is the value for the horizontal direction of the texture.
|
|
|
|
v is an optional argument.
|
|
|
|
v is the value for the vertical direction of the texture. The
|
|
default is 0.
|
|
|
|
w is an optional argument.
|
|
|
|
w is a value for the depth of the texture. The default is 0.
|
|
|
|
Specifying free-form curves/surfaces
|
|
|
|
There are three steps involved in specifying a free-form curve or
|
|
surface element.
|
|
|
|
o Specify the type of curve or surface (basis matrix, Bezier,
|
|
B-spline, Cardinal, or Taylor) using free-form curve/surface
|
|
attributes.
|
|
|
|
o Describe the curve or surface with element statements.
|
|
|
|
o Supply additional information, using free-form curve/surface
|
|
body statements
|
|
|
|
The next three sections of this appendix provide detailed information
|
|
on each of these steps.
|
|
|
|
Data requirements for curves and surfaces
|
|
|
|
All curves and surfaces require a certain set of data. This consists of
|
|
the following:
|
|
|
|
Free-form curve/surface attributes
|
|
|
|
o All curves and surfaces require type data, which is given with
|
|
the cstype statement.
|
|
|
|
o All curves and surfaces require degree data, which is given
|
|
with the deg statement.
|
|
|
|
o Basis matrix curves or surfaces require a bmat statement.
|
|
|
|
o Basis matrix curves or surfaces also require a step size, which
|
|
is given with the step statement.
|
|
|
|
Elements
|
|
|
|
o All curves and surfaces require control points, which are
|
|
referenced in the curv, curv2, or surf statements.
|
|
|
|
o 3D curves and surfaces require a parameter range, which is
|
|
given in the curv and surf statements, respectively.
|
|
|
|
Free-form curve/surface body statements
|
|
|
|
o All curves and surfaces require a set of global parameters or a
|
|
knot vector, both of which are given with the parm statement.
|
|
|
|
o All curves and surfaces body statements require an explicit end
|
|
statement.
|
|
|
|
Error checks
|
|
|
|
The above set of data starts out empty with no default values when
|
|
reading of an .obj file begins. While the file is being read,
|
|
statements are encountered, information is accumulated, and some errors
|
|
may be reported.
|
|
|
|
When the end statement is encountered, the following error checks,
|
|
which involve consistency between various statements, are performed:
|
|
|
|
o All required information is present.
|
|
|
|
o The number of control points, number of parameter values
|
|
(knots), and degree are consistent with the curve or surface
|
|
type. If the type is bmatrix, the step size is also consistent.
|
|
(For more information, refer to the parameter vector equations
|
|
in the section, "Mathematics of free-form curves/ surfaces" at
|
|
the end of appendix B1.)
|
|
|
|
o If the type is bmatrix and the degree is n, the size of the
|
|
basis matrix is (n + 1) x (n + 1).
|
|
|
|
Note that any information given by the state-setting statements remains
|
|
in effect from one curve or surface to the next. Information given
|
|
within a curve or surface body is only effective for the curve or
|
|
surface it is given with.
|
|
|
|
|
|
|
|
Free-form curve/surface attributes
|
|
|
|
Five types of free-form geometry are available in the .obj file
|
|
format:
|
|
|
|
o Bezier
|
|
|
|
o basis matrix
|
|
|
|
o B-spline
|
|
|
|
o Cardinal
|
|
|
|
o Taylor
|
|
|
|
You can apply these types only to curves and surfaces. Each of these
|
|
five types can be rational or non-rational.
|
|
|
|
In addition to specifying the type, you must define the degree for the
|
|
curve or surface. For basis matrix curve and surface elements, you must
|
|
also specify the basis matrix and step size.
|
|
|
|
All free-form curve and surface attribute statements are state-setting.
|
|
This means that once an attribute statement is set, it applies to all
|
|
elements that follow until it is reset to a different value.
|
|
|
|
Syntax
|
|
|
|
The following syntax statements are listed in order of use.
|
|
|
|
cstype rat type
|
|
|
|
Free-form geometry statement.
|
|
|
|
Specifies the type of curve or surface and indicates a rational or
|
|
non-rational form.
|
|
|
|
rat is an optional argument.
|
|
|
|
rat specifies a rational form for the curve or surface type. If rat
|
|
is not included, the curve or surface is non-rational
|
|
|
|
type specifies the curve or surface type. Allowed types are:
|
|
|
|
bmatrix basis matrix
|
|
|
|
bezier Bezier
|
|
|
|
bspline B-spline
|
|
|
|
cardinal Cardinal
|
|
|
|
taylor Taylor
|
|
|
|
There is no default. A value must be supplied.
|
|
|
|
deg degu degv
|
|
|
|
Free-form geometry statement.
|
|
|
|
Sets the polynomial degree for curves and surfaces.
|
|
|
|
degu is the degree in the u direction. It is required for both
|
|
curves and surfaces.
|
|
|
|
degv is the degree in the v direction. It is required only for
|
|
surfaces. For Bezier, B-spline, Taylor, and basis matrix, there is
|
|
no default; a value must be supplied. For Cardinal, the degree is
|
|
always 3. If some other value is given for Cardinal, it will be
|
|
ignored.
|
|
|
|
bmat u matrix
|
|
|
|
bmat v matrix
|
|
|
|
Free-form geometry statement.
|
|
|
|
Sets the basis matrices used for basis matrix curves and surfaces.
|
|
The u and v values must be specified in separate bmat statements.
|
|
|
|
NOTE: The deg statement must be given before the bmat statements
|
|
and the size of the matrix must be appropriate for the degree.
|
|
|
|
u specifies that the basis matrix is applied in the u direction.
|
|
|
|
v specifies that the basis matrix is applied in the v direction.
|
|
|
|
matrix lists the contents of the basis matrix with column subscript
|
|
j varying the fastest. If n is the degree in the given u or v
|
|
direction, the matrix (i,j) should be of size (n + 1) x (n + 1).
|
|
|
|
There is no default. A value must be supplied.
|
|
|
|
NOTE: The arrangement of the matrix is different from that commonly
|
|
found in other references. For more information, see the examples
|
|
at the end of this section and also the section, "Mathematics for
|
|
free-form curves and surfaces."
|
|
|
|
step stepu stepv
|
|
|
|
Free-form geometry statement.
|
|
|
|
Sets the step size for curves and surfaces that use a basis
|
|
matrix.
|
|
|
|
stepu is the step size in the u direction. It is required for both
|
|
curves and surfaces that use a basis matrix.
|
|
|
|
stepv is the step size in the v direction. It is required only for
|
|
surfaces that use a basis matrix. There is no default. A value must
|
|
be supplied.
|
|
|
|
When a curve or surface is being evaluated and a transition from
|
|
one segment or patch to the next occurs, the set of control points
|
|
used is incremented by the step size. The appropriate step size
|
|
depends on the representation type, which is expressed through the
|
|
basis matrix, and on the degree.
|
|
|
|
That is, suppose we are given a curve with k control points:
|
|
{v , ... v }
|
|
1 k
|
|
|
|
If the curve is of degree n, then n + 1 control points are needed
|
|
for each polynomial segment. If the step size is given as s, then
|
|
the ith polynomial segment, where i = 0 is the first segment, will
|
|
use the control points:
|
|
{v ,...,v }
|
|
is+1 is+n+1
|
|
|
|
For example, for Bezier curves, s = n .
|
|
|
|
For surfaces, the above description applies independently to each
|
|
parametric direction.
|
|
|
|
When you create a file which uses the basis matrix type, be sure to
|
|
specify a step size appropriate for the current curve or surface
|
|
representation.
|
|
|
|
Examples
|
|
|
|
1. Cubic Bezier surface made with a basis matrix
|
|
|
|
To create a cubic Bezier surface:
|
|
|
|
cstype bmatrix
|
|
deg 3 3
|
|
step 3 3
|
|
bmat u 1 -3 3 -1 \
|
|
0 3 -6 3 \
|
|
0 0 3 -3 \
|
|
0 0 0 1
|
|
bmat v 1 -3 3 -1 \
|
|
0 3 -6 3 \
|
|
0 0 3 -3 \
|
|
0 0 0 1
|
|
|
|
2. Hermite curve made with a basis matrix
|
|
|
|
To create a Hermite curve:
|
|
|
|
cstype bmatrix
|
|
deg 3
|
|
step 2
|
|
bmat u 1 0 -3 2 0 0 3 -2 \
|
|
0 1 -2 1 0 0 -1 1
|
|
|
|
3. Bezier in u direction with B-spline in v direction;
|
|
made with a basis matrix
|
|
|
|
To create a surface with a cubic Bezier in the u direction and
|
|
cubic uniform B-spline in the v direction:
|
|
|
|
cstype bmatrix
|
|
deg 3 3
|
|
step 3 1
|
|
bmat u 1 -3 3 -1 \
|
|
0 3 -6 3 \
|
|
0 0 3 -3 \
|
|
0 0 0 1
|
|
bmat v 0.16666 -0.50000 0.50000 -0.16666 \
|
|
0.66666 0.00000 -1.00000 0.50000 \
|
|
0.16666 0.50000 0.50000 -0.50000 \
|
|
0.00000 0.00000 0.00000 0.16666
|
|
|
|
|
|
|
|
Elements
|
|
|
|
For polygonal geometry, the element types available in the .obj file
|
|
are:
|
|
|
|
o points
|
|
|
|
o lines
|
|
|
|
o faces
|
|
|
|
For free-form geometry, the element types available in the .obj file
|
|
are:
|
|
|
|
o curve
|
|
|
|
o 2D curve on a surface
|
|
|
|
o surface
|
|
|
|
All elements can be freely intermixed in the file.
|
|
|
|
Referencing vertex data
|
|
|
|
For all elements, reference numbers are used to identify geometric
|
|
vertices, texture vertices, vertex normals, and parameter space
|
|
vertices.
|
|
|
|
Each of these types of vertices is numbered separately, starting with
|
|
1. This means that the first geometric vertex in the file is 1, the
|
|
second is 2, and so on. The first texture vertex in the file is 1, the
|
|
second is 2, and so on. The numbering continues sequentially throughout
|
|
the entire file. Frequently, files have multiple lists of vertex data.
|
|
This numbering sequence continues even when vertex data is separated by
|
|
other data.
|
|
|
|
In addition to counting vertices down from the top of the first list in
|
|
the file, you can also count vertices back up the list from an
|
|
element's position in the file. When you count up the list from an
|
|
element, the reference numbers are negative. A reference number of -1
|
|
indicates the vertex immediately above the element. A reference number
|
|
of -2 indicates two references above and so on.
|
|
|
|
Referencing groups of vertices
|
|
|
|
Some elements, such as faces and surfaces, may have a triplet of
|
|
numbers that reference vertex data.These numbers are the reference
|
|
numbers for a geometric vertex, a texture vertex, and a vertex normal.
|
|
|
|
Each triplet of numbers specifies a geometric vertex, texture vertex,
|
|
and vertex normal. The reference numbers must be in order and must
|
|
separated by slashes (/).
|
|
|
|
o The first reference number is the geometric vertex.
|
|
|
|
o The second reference number is the texture vertex. It follows
|
|
the first slash.
|
|
|
|
o The third reference number is the vertex normal. It follows the
|
|
second slash.
|
|
|
|
There is no space between numbers and the slashes. There may be more
|
|
than one series of geometric vertex/texture vertex/vertex normal
|
|
numbers on a line.
|
|
|
|
The following is a portion of a sample file for a four-sided face
|
|
element:
|
|
|
|
f 1/1/1 2/2/2 3/3/3 4/4/4
|
|
|
|
Using v, vt, and vn to represent geometric vertices, texture vertices,
|
|
and vertex normals, the statement would read:
|
|
|
|
f v/vt/vn v/vt/vn v/vt/vn v/vt/vn
|
|
|
|
If there are only vertices and vertex normals for a face element (no
|
|
texture vertices), you would enter two slashes (//). For example, to
|
|
specify only the vertex and vertex normal reference numbers, you would
|
|
enter:
|
|
|
|
f 1//1 2//2 3//3 4//4
|
|
|
|
When you are using a series of triplets, you must be consistent in the
|
|
way you reference the vertex data. For example, it is illegal to give
|
|
vertex normals for some vertices, but not all.
|
|
|
|
The following is an example of an illegal statement.
|
|
|
|
f 1/1/1 2/2/2 3//3 4//4
|
|
|
|
Syntax
|
|
|
|
The following syntax statements are listed in order of complexity of
|
|
geometry.
|
|
|
|
p v1 v2 v3 . . .
|
|
|
|
Polygonal geometry statement.
|
|
|
|
Specifies a point element and its vertex. You can specify multiple
|
|
points with this statement. Although points cannot be shaded or
|
|
rendered, they are used by other Advanced Visualizer programs.
|
|
|
|
v is the vertex reference number for a point element. Each point
|
|
element requires one vertex. Positive values indicate absolute
|
|
vertex numbers. Negative values indicate relative vertex numbers.
|
|
|
|
l v1/vt1 v2/vt2 v3/vt3 . . .
|
|
|
|
Polygonal geometry statement.
|
|
|
|
Specifies a line and its vertex reference numbers. You can
|
|
optionally include the texture vertex reference numbers. Although
|
|
lines cannot be shaded or rendered, they are used by other Advanced
|
|
Visualizer programs.
|
|
|
|
The reference numbers for the vertices and texture vertices must be
|
|
separated by a slash (/). There is no space between the number and
|
|
the slash.
|
|
|
|
v is a reference number for a vertex on the line. A minimum of two
|
|
vertex numbers are required. There is no limit on the maximum.
|
|
Positive values indicate absolute vertex numbers. Negative values
|
|
indicate relative vertex numbers.
|
|
|
|
vt is an optional argument.
|
|
|
|
vt is the reference number for a texture vertex in the line
|
|
element. It must always follow the first slash.
|
|
|
|
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 . . .
|
|
|
|
Polygonal geometry statement.
|
|
|
|
Specifies a face element and its vertex reference number. You can
|
|
optionally include the texture vertex and vertex normal reference
|
|
numbers.
|
|
|
|
The reference numbers for the vertices, texture vertices, and
|
|
vertex normals must be separated by slashes (/). There is no space
|
|
between the number and the slash.
|
|
|
|
v is the reference number for a vertex in the face element. A
|
|
minimum of three vertices are required.
|
|
|
|
vt is an optional argument.
|
|
|
|
vt is the reference number for a texture vertex in the face
|
|
element. It always follows the first slash.
|
|
|
|
vn is an optional argument.
|
|
|
|
vn is the reference number for a vertex normal in the face element.
|
|
It must always follow the second slash.
|
|
|
|
Face elements use surface normals to indicate their orientation. If
|
|
vertices are ordered counterclockwise around the face, both the
|
|
face and the normal will point toward the viewer. If the vertex
|
|
ordering is clockwise, both will point away from the viewer. If
|
|
vertex normals are assigned, they should point in the general
|
|
direction of the surface normal, otherwise unpredictable results
|
|
may occur.
|
|
|
|
If a face has a texture map assigned to it and no texture vertices
|
|
are assigned in the f statement, the texture map is ignored when
|
|
the element is rendered.
|
|
|
|
NOTE: Any references to fo (face outline) are no longer valid as of
|
|
version 2.11. You can use f (face) to get the same results.
|
|
References to fo in existing .obj files will still be read,
|
|
however, they will be written out as f when the file is saved.
|
|
|
|
curv u0 u1 v1 v2 . . .
|
|
|
|
Element statement for free-form geometry.
|
|
|
|
Specifies a curve, its parameter range, and its control vertices.
|
|
Although curves cannot be shaded or rendered, they are used by
|
|
other Advanced Visualizer programs.
|
|
|
|
u0 is the starting parameter value for the curve. This is a
|
|
floating point number.
|
|
|
|
u1 is the ending parameter value for the curve. This is a floating
|
|
point number.
|
|
|
|
v is the vertex reference number for a control point. You can
|
|
specify multiple control points. A minimum of two control points
|
|
are required for a curve.
|
|
|
|
For a non-rational curve, the control points must be 3D. For a
|
|
rational curve, the control points are 3D or 4D. The fourth
|
|
coordinate (weight) defaults to 1.0 if omitted.
|
|
|
|
curv2 vp1 vp2 vp3. . .
|
|
|
|
Free-form geometry statement.
|
|
|
|
Specifies a 2D curve on a surface and its control points. A 2D
|
|
curve is used as an outer or inner trimming curve, as a special
|
|
curve, or for connectivity.
|
|
|
|
vp is the parameter vertex reference number for the control point.
|
|
You can specify multiple control points. A minimum of two control
|
|
points is required for a 2D curve.
|
|
|
|
The control points are parameter vertices because the curve must
|
|
lie in the parameter space of some surface. For a non-rational
|
|
curve, the control vertices can be 2D. For a rational curve, the
|
|
control vertices can be 2D or 3D. The third coordinate (weight)
|
|
defaults to 1.0 if omitted.
|
|
|
|
surf s0 s1 t0 t1 v1/vt1/vn1 v2/vt2/vn2 . . .
|
|
|
|
Element statement for free-form geometry.
|
|
|
|
Specifies a surface, its parameter range, and its control vertices.
|
|
The surface is evaluated within the global parameter range from s0
|
|
to s1 in the u direction and t0 to t1 in the v direction.
|
|
|
|
s0 is the starting parameter value for the surface in the u
|
|
direction.
|
|
|
|
s1 is the ending parameter value for the surface in the u
|
|
direction.
|
|
|
|
t0 is the starting parameter value for the surface in the v
|
|
direction.
|
|
|
|
t1 is the ending parameter value for the surface in the v
|
|
direction.
|
|
|
|
v is the reference number for a control vertex in the surface.
|
|
|
|
vt is an optional argument.
|
|
|
|
vt is the reference number for a texture vertex in the surface. It
|
|
must always follow the first slash.
|
|
|
|
vn is an optional argument.
|
|
|
|
vn is the reference number for a vertex normal in the surface. It
|
|
must always follow the second slash.
|
|
|
|
For a non-rational surface, the control vertices are 3D. For a
|
|
rational surface the control vertices can be 3D or 4D. The fourth
|
|
coordinate (weight) defaults to 1.0 if ommitted.
|
|
|
|
NOTE: For more information on the ordering of control points for
|
|
survaces, refer to the section on surfaces and control points in
|
|
"mathematics of free-form curves/surfaces" at the end of this
|
|
appendix.
|
|
|
|
|
|
|
|
|
|
Examples
|
|
|
|
These are examples for polygonal geometry.
|
|
|
|
For examples using free-form geometry, see the examples at the end of
|
|
the next section, "Free-form curve/surface body statements."
|
|
|
|
1. Square
|
|
|
|
This example shows a square that measures two units on each side and
|
|
faces in the positive direction (toward the camera). Note that the
|
|
ordering of the vertices is counterclockwise. This ordering determines
|
|
that the square is facing forward.
|
|
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
f 1 2 3 4
|
|
|
|
2. Cube
|
|
|
|
This is a cube that measures two units on each side. Each vertex is
|
|
shared by three different faces.
|
|
|
|
v 0.000000 2.000000 2.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
f 1 2 3 4
|
|
f 8 7 6 5
|
|
f 4 3 7 8
|
|
f 5 1 4 8
|
|
f 5 6 2 1
|
|
f 2 6 7 3
|
|
|
|
3. Cube with negative reference numbers
|
|
|
|
This is a cube with negative vertex reference numbers. Each element
|
|
references the vertices stored immediately above it in the file. Note
|
|
that vertices are not shared.
|
|
|
|
v 0.000000 2.000000 2.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
f -4 -3 -2 -1
|
|
|
|
v 2.000000 2.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 0.000000 2.000000 0.000000
|
|
f -4 -3 -2 -1
|
|
|
|
v 2.000000 2.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
f -4 -3 -2 -1
|
|
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 2.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
v 2.000000 2.000000 0.000000
|
|
f -4 -3 -2 -1
|
|
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 0.000000 2.000000 2.000000
|
|
f -4 -3 -2 -1
|
|
|
|
v 0.000000 0.000000 2.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 2.000000
|
|
f -4 -3 -2 -1
|
|
|
|
|
|
|
|
Free-form curve/surface body statements
|
|
|
|
You can specify additional information for free-form curve and surface
|
|
elements using a series of statements called body statements. The
|
|
series is concluded by an end statement.
|
|
|
|
Body statements are valid only when they appear between the free-form
|
|
element statement (curv, curv2, surf) and the end statement. If they
|
|
are anywhere else in the .obj file, they do not have any effect.
|
|
|
|
You can use body statements to specify the following values:
|
|
|
|
o parameter
|
|
|
|
o knot vector
|
|
|
|
o trimming loop
|
|
|
|
o hole
|
|
|
|
o special curve
|
|
|
|
o special point
|
|
|
|
You cannot use any other statements between the free-form curve or
|
|
surface statement and the end statement. Using any other of type of
|
|
statement may cause unpredictable results.
|
|
|
|
This portion of a sample file shows the knot vector values for a
|
|
rational B-spline surface with a trimming loop. Notice the end
|
|
statement to conclude the body statements.
|
|
|
|
cstype rat bspline
|
|
deg 2 2
|
|
surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
|
|
parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
|
|
parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00
|
|
trim 0.0 2.0 1
|
|
end
|
|
|
|
Parameter values and knot vectors
|
|
|
|
All curve and surface elements require a set of parameter values.
|
|
|
|
For polynomial curves and surfaces, this specifies global parameter
|
|
values. For B-spline curves and surfaces, this specifies the knot
|
|
vectors.
|
|
|
|
For surfaces, the parameter values must be specified for both the u and
|
|
v directions. For curves, the parameter values must be specified for
|
|
only the u direction.
|
|
|
|
If multiple parameter value statements for the same parametric
|
|
direction are used inside a single curve or surface body, the last
|
|
statement is used.
|
|
|
|
Trimming loops and holes
|
|
|
|
The trimming loop statement builds a single outer trimming loop as a
|
|
sequence of curves which lie on a given surface.
|
|
|
|
The hole statement builds a single inner trimming loop as a sequence of
|
|
curves which lie on a given surface. The inner loop creates a hole.
|
|
|
|
The curves are referenced by number in the same way vertices are
|
|
referenced by face elements.
|
|
|
|
The individual curves must lie end-to-end to form a closed loop which
|
|
does not intersect itself and which lies within the parameter range
|
|
specified for the surface. The loop as a whole may be oriented in
|
|
either direction (clockwise or counterclockwise).
|
|
|
|
To cut one or more holes in a region, use a trim statement followed by
|
|
one or more hole statements. To introduce another trimmed region in the
|
|
same surface, use another trim statement followed by one or more hole
|
|
statements. The ordering that associates holes and the regions they cut
|
|
is important and must be maintained.
|
|
|
|
If the first trim statement in the sequence is omitted, the enclosing
|
|
outer trimming loop is taken to be the parameter range of the surface.
|
|
If no trim or hole statements are specified, then the surface is
|
|
trimmed at its parameter range.
|
|
|
|
This portion of a sample file shows a non-rational Bezier surface with
|
|
two regions, each with a single hole:
|
|
|
|
cstype bezier
|
|
deg 1 1
|
|
surf 0.0 2.0 0.0 2.0 1 2 3 4
|
|
parm u 0.00 2.00
|
|
parm v 0.00 2.00
|
|
trim 0.0 4.0 1
|
|
hole 0.0 4.0 2
|
|
trim 0.0 4.0 3
|
|
hole 0.0 4.0 4
|
|
end
|
|
|
|
Special curve
|
|
|
|
A special curve statement builds a single special curve as a sequence
|
|
of curves which lie on a given surface.
|
|
|
|
The curves are referenced by number in the same way vertices are
|
|
referenced by face elements.
|
|
|
|
A special curve is guaranteed to be included in any triangulation of
|
|
the surface. This means that the line formed by approximating the
|
|
special curve with a sequence of straight line segments will actually
|
|
appear as a sequence of triangle edges in the final triangulation.
|
|
|
|
Special point
|
|
|
|
A special point statement specifies that special geometric points are
|
|
to be associated with a curve or surface. For space curves and trimming
|
|
curves, the parameter vertices must be 1D. For surfaces, the parameter
|
|
vertices must be 2D.
|
|
|
|
These special points will be included in any linear approximation of
|
|
the curve or surface.
|
|
|
|
For space curves, this means that the point corresponding to the given
|
|
curve parameter is included as one of the vertices in an approximation
|
|
consisting of a sequence of line segments.
|
|
|
|
For surfaces, this means that the point corresponding to the given
|
|
surface parameters is included as a triangle vertex in the
|
|
triangulation.
|
|
|
|
For trimming curves, the treatment is slightly different: a special
|
|
point on a trimming curve is essentially the same as a special point on
|
|
the surface it trims.
|
|
|
|
The following portion of a sample files shows special points for a
|
|
rational Bezier 2D curve on a surface.
|
|
|
|
vp -0.675 1.850 3.000
|
|
vp 0.915 1.930
|
|
vp 2.485 0.470 2.000
|
|
vp 2.485 -1.030
|
|
vp 1.605 -1.890 10.700
|
|
vp -0.745 -0.654 0.500
|
|
cstype rat bezier
|
|
curv2 -6 -5 -4 -3 -2 -1 -6
|
|
parm u 0.00 1.00 2.00
|
|
sp 2 3
|
|
end
|
|
|
|
Syntax
|
|
|
|
The following syntax statement are listed in order of normal use.
|
|
|
|
parm u p1 p2 p3. . .
|
|
|
|
parm v p1 p2 p3 . . .
|
|
|
|
Body statement for free-form geometry.
|
|
|
|
Specifies global parameter values. For B-spline curves and
|
|
surfaces, this specifies the knot vectors.
|
|
|
|
u is the u direction for the parameter values.
|
|
|
|
v is the v direction for the parameter values.
|
|
|
|
To set u and v values, use separate command lines.
|
|
|
|
p is the global parameter or knot value. You can specify multiple
|
|
values. A minimum of two parameter values are required. Parameter
|
|
values must increase monotonically. The type of surface and the
|
|
degree dictate the number of values required.
|
|
|
|
trim u0 u1 curv2d u0 u1 curv2d . . .
|
|
|
|
Body statement for free-form geometry.
|
|
|
|
Specifies a sequence of curves to build a single outer trimming
|
|
loop.
|
|
|
|
u0 is the starting parameter value for the trimming curve curv2d.
|
|
|
|
u1 is the ending parameter value for the trimming curve curv2d.
|
|
|
|
curv2d is the index of the trimming curve lying in the parameter
|
|
space of the surface. This curve must have been previously defined
|
|
with the curv2 statement.
|
|
|
|
hole u0 u1 curv2d u0 u1 curv2d . . .
|
|
|
|
Body statement for free-form geometry.
|
|
|
|
Specifies a sequence of curves to build a single inner trimming
|
|
loop (hole).
|
|
|
|
u0 is the starting parameter value for the trimming curve curv2d.
|
|
|
|
u1 is the ending parameter value for the trimming curve curv2d.
|
|
|
|
curv2d is the index of the trimming curve lying in the parameter
|
|
space of the surface. This curve must have been previously defined
|
|
with the curv2 statement.
|
|
|
|
scrv u0 u1 curv2d u0 u1 curv2d . . .
|
|
|
|
Body statement for free-form geometry.
|
|
|
|
Specifies a sequence of curves which lie on the given surface to
|
|
build a single special curve.
|
|
|
|
u0 is the starting parameter value for the special curve curv2d.
|
|
|
|
u1 is the ending parameter value for the special curve curv2d.
|
|
|
|
curv2d is the index of the special curve lying in the parameter
|
|
space of the surface. This curve must have been previously defined
|
|
with the curv2 statement.
|
|
|
|
sp vp1 vp. . .
|
|
|
|
Body statement for free-form geometry.
|
|
|
|
Specifies special geometric points to be associated with a curve or
|
|
surface. For space curves and trimming curves, the parameter
|
|
vertices must be 1D. For surfaces, the parameter vertices must be
|
|
2D.
|
|
|
|
vp is the reference number for the parameter vertex of a special
|
|
point to be associated with the parameter space point of the curve
|
|
or surface.
|
|
|
|
end
|
|
|
|
Body statement for free-form geometry.
|
|
|
|
Specifies the end of a curve or surface body begun by a curv,
|
|
curv2, or surf statement.
|
|
|
|
Examples
|
|
|
|
1. Taylor curve
|
|
|
|
For creating a single-segment Taylor polynomial curve of the form:
|
|
|
|
2 3 4
|
|
x = 3.00 + 2.30t + 7.98t + 8.30t + 6.34t
|
|
|
|
2 3 4
|
|
y = 1.00 - 10.10t + 5.40t - 4.70t + 2.03t
|
|
|
|
2 3 4
|
|
z = -2.50 + 0.50t - 7.00t + 18.10t + 0.08t
|
|
|
|
|
|
and evaluated between the global parameters 0.5 and 1.6:
|
|
|
|
v 3.000 1.000 -2.500
|
|
v 2.300 -10.100 0.500
|
|
v 7.980 5.400 -7.000
|
|
v 8.300 -4.700 18.100
|
|
v 6.340 2.030 0.080
|
|
cstype taylor
|
|
deg 4
|
|
curv 0.500 1.600 1 2 3 4 5
|
|
parm u 0.000 2.000
|
|
end
|
|
|
|
2. Bezier curve
|
|
|
|
This example shows a non-rational Bezier curve with 13 control points.
|
|
|
|
v -2.300000 1.950000 0.000000
|
|
v -2.200000 0.790000 0.000000
|
|
v -2.340000 -1.510000 0.000000
|
|
v -1.530000 -1.490000 0.000000
|
|
v -0.720000 -1.470000 0.000000
|
|
v -0.780000 0.230000 0.000000
|
|
v 0.070000 0.250000 0.000000
|
|
v 0.920000 0.270000 0.000000
|
|
v 0.800000 -1.610000 0.000000
|
|
v 1.620000 -1.590000 0.000000
|
|
v 2.440000 -1.570000 0.000000
|
|
v 2.690000 0.670000 0.000000
|
|
v 2.900000 1.980000 0.000000
|
|
# 13 vertices
|
|
|
|
cstype bezier
|
|
ctech cparm 1.000000
|
|
deg 3
|
|
curv 0.000000 4.000000 1 2 3 4 5 6 7 8 9 10 \
|
|
11 12 13
|
|
parm u 0.000000 1.000000 2.000000 3.000000 \
|
|
4.000000
|
|
end
|
|
# 1 element
|
|
|
|
|
|
|
|
3. B-spline surface
|
|
|
|
This is an example of a cubic B-spline surface.
|
|
|
|
g bspatch
|
|
v -5.000000 -5.000000 -7.808327
|
|
v -5.000000 -1.666667 -7.808327
|
|
v -5.000000 1.666667 -7.808327
|
|
v -5.000000 5.000000 -7.808327
|
|
v -1.666667 -5.000000 -7.808327
|
|
v -1.666667 -1.666667 11.977780
|
|
v -1.666667 1.666667 11.977780
|
|
v -1.666667 5.000000 -7.808327
|
|
v 1.666667 -5.000000 -7.808327
|
|
v 1.666667 -1.666667 11.977780
|
|
v 1.666667 1.666667 11.977780
|
|
v 1.666667 5.000000 -7.808327
|
|
v 5.000000 -5.000000 -7.808327
|
|
v 5.000000 -1.666667 -7.808327
|
|
v 5.000000 1.666667 -7.808327
|
|
v 5.000000 5.000000 -7.808327
|
|
# 16 vertices
|
|
|
|
cstype bspline
|
|
stech curv 0.5 10.000000
|
|
deg 3 3
|
|
8surf 0.000000 1.000000 0.000000 1.000000 13 14 \ 15 16 9 10 11 12 5 6
|
|
7 8 1 2 3 4
|
|
parm u -3.000000 -2.000000 -1.000000 0.000000 \
|
|
1.000000 2.000000 3.000000 4.000000
|
|
parm v -3.000000 -2.000000 -1.000000 0.000000 \
|
|
1.000000 2.000000 3.000000 4.000000
|
|
end
|
|
# 1 element
|
|
|
|
|
|
4. Cardinal surface
|
|
|
|
This example shows a Cardinal surface.
|
|
|
|
v -5.000000 -5.000000 0.000000
|
|
v -5.000000 -1.666667 0.000000
|
|
v -5.000000 1.666667 0.000000
|
|
v -5.000000 5.000000 0.000000
|
|
v -1.666667 -5.000000 0.000000
|
|
v -1.666667 -1.666667 0.000000
|
|
v -1.666667 1.666667 0.000000
|
|
v -1.666667 5.000000 0.000000
|
|
v 1.666667 -5.000000 0.000000
|
|
v 1.666667 -1.666667 0.000000
|
|
v 1.666667 1.666667 0.000000
|
|
v 1.666667 5.000000 0.000000
|
|
v 5.000000 -5.000000 0.000000
|
|
v 5.000000 -1.666667 0.000000
|
|
v 5.000000 1.666667 0.000000
|
|
v 5.000000 5.000000 0.000000
|
|
# 16 vertices
|
|
|
|
cstype cardinal
|
|
stech cparma 1.000000 1.000000
|
|
deg 3 3
|
|
surf 0.000000 1.000000 0.000000 1.000000 13 14 \
|
|
15 16 9 10 11 12 5 6 7 8 1 2 3 4
|
|
parm u 0.000000 1.000000
|
|
parm v 0.000000 1.000000
|
|
end
|
|
# 1 element
|
|
|
|
|
|
5. Rational B-spline surface
|
|
|
|
This example creates a second-degree, rational B-spline surface using
|
|
open, uniform knot vectors. A texture map is applied to the surface.
|
|
|
|
v -1.3 -1.0 0.0
|
|
v 0.1 -1.0 0.4 7.6
|
|
v 1.4 -1.0 0.0 2.3
|
|
v -1.4 0.0 0.2
|
|
v 0.1 0.0 0.9 0.5
|
|
v 1.3 0.0 0.4 1.5
|
|
v -1.4 1.0 0.0 2.3
|
|
v 0.1 1.0 0.3 6.1
|
|
v 1.1 1.0 0.0 3.3
|
|
vt 0.0 0.0
|
|
vt 0.5 0.0
|
|
vt 1.0 0.0
|
|
vt 0.0 0.5
|
|
vt 0.5 0.5
|
|
vt 1.0 0.5
|
|
vt 0.0 1.0
|
|
vt 0.5 1.0
|
|
vt 1.0 1.0
|
|
cstype rat bspline
|
|
deg 2 2
|
|
surf 0.0 1.0 0.0 1.0 1/1 2/2 3/3 4/4 5/5 6/6 \
|
|
7/7 8/8 9/9
|
|
parm u 0.0 0.0 0.0 1.0 1.0 1.0
|
|
parm v 0.0 0.0 0.0 1.0 1.0 1.0
|
|
end
|
|
|
|
|
|
6. Trimmed NURB surface
|
|
|
|
This is a complete example of a file containing a trimmed NURB surface
|
|
with negative reference numbers for vertices.
|
|
|
|
# trimming curve
|
|
vp -0.675 1.850 3.000
|
|
vp 0.915 1.930
|
|
vp 2.485 0.470 2.000
|
|
vp 2.485 -1.030
|
|
vp 1.605 -1.890 10.700
|
|
vp -0.745 -0.654 0.500
|
|
cstype rat bezier
|
|
deg 3
|
|
curv2 -6 -5 -4 -3 -2 -1 -6
|
|
parm u 0.00 1.00 2.00
|
|
end
|
|
# surface
|
|
v -1.350 -1.030 0.000
|
|
v 0.130 -1.030 0.432 7.600
|
|
v 1.480 -1.030 0.000 2.300
|
|
v -1.460 0.060 0.201
|
|
v 0.120 0.060 0.915 0.500
|
|
v 1.380 0.060 0.454 1.500
|
|
v -1.480 1.030 0.000 2.300
|
|
v 0.120 1.030 0.394 6.100
|
|
v 1.170 1.030 0.000 3.300
|
|
cstype rat bspline
|
|
deg 2 2
|
|
surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
|
|
parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
|
|
parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00
|
|
trim 0.0 2.0 1
|
|
end
|
|
|
|
|
|
7. Two trimming regions with a hole
|
|
|
|
This example shows a Bezier surface with two trimming regions, each
|
|
with a hole in them.
|
|
|
|
# outer loop of first region
|
|
deg 1
|
|
cstype bezier
|
|
vp 0.100 0.100
|
|
vp 0.900 0.100
|
|
vp 0.900 0.900
|
|
vp 0.100 0.900
|
|
curv2 1 2 3 4 1
|
|
parm u 0.00 1.00 2.00 3.00 4.00
|
|
end
|
|
# hole in first region
|
|
vp 0.300 0.300
|
|
vp 0.700 0.300
|
|
vp 0.700 0.700
|
|
vp 0.300 0.700
|
|
curv2 5 6 7 8 5
|
|
parm u 0.00 1.00 2.00 3.00 4.00
|
|
end
|
|
# outer loop of second region
|
|
vp 1.100 1.100
|
|
vp 1.900 1.100
|
|
vp 1.900 1.900
|
|
vp 1.100 1.900
|
|
curv2 9 10 11 12 9
|
|
parm u 0.00 1.00 2.00 3.00 4.00
|
|
end
|
|
# hole in second region
|
|
vp 1.300 1.300
|
|
vp 1.700 1.300
|
|
vp 1.700 1.700
|
|
vp 1.300 1.700
|
|
curv2 13 14 15 16 13
|
|
parm u 0.00 1.00 2.00 3.00 4.00
|
|
end
|
|
# surface
|
|
v 0.000 0.000 0.000
|
|
v 1.000 0.000 0.000
|
|
v 0.000 1.000 0.000
|
|
v 1.000 1.000 0.000
|
|
deg 1 1
|
|
cstype bezier
|
|
surf 0.0 2.0 0.0 2.0 1 2 3 4
|
|
parm u 0.00 2.00
|
|
parm v 0.00 2.00
|
|
trim 0.0 4.0 1
|
|
hole 0.0 4.0 2
|
|
trim 0.0 4.0 3
|
|
hole 0.0 4.0 4
|
|
end
|
|
|
|
|
|
8. Trimming with a special curve
|
|
This example is similar to the trimmed NURB surface example (6), except
|
|
there is a special curve on the surface. This example uses negative
|
|
vertex numbers.
|
|
|
|
# trimming curve
|
|
vp -0.675 1.850 3.000
|
|
vp 0.915 1.930
|
|
vp 2.485 0.470 2.000
|
|
vp 2.485 -1.030
|
|
vp 1.605 -1.890 10.700
|
|
vp -0.745 -0.654 0.500
|
|
cstype rat bezier
|
|
deg 3
|
|
curv2 -6 -5 -4 -3 -2 -1 -6
|
|
parm u 0.00 1.00 2.00
|
|
end
|
|
# special curve
|
|
vp -0.185 0.322
|
|
vp 0.214 0.818
|
|
vp 1.652 0.207
|
|
vp 1.652 -0.455
|
|
curv2 -4 -3 -2 -1
|
|
parm u 2.00 10.00
|
|
end
|
|
# surface
|
|
v -1.350 -1.030 0.000
|
|
v 0.130 -1.030 0.432 7.600
|
|
v 1.480 -1.030 0.000 2.300
|
|
v -1.460 0.060 0.201
|
|
v 0.120 0.060 0.915 0.500
|
|
v 1.380 0.060 0.454 1.500
|
|
v -1.480 1.030 0.000 2.300
|
|
v 0.120 1.030 0.394 6.100
|
|
v 1.170 1.030 0.000 3.300
|
|
cstype rat bspline
|
|
deg 2 2
|
|
surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
|
|
parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
|
|
parm v -2.00 -2.00 -2.00 2.00 2.00 2.00
|
|
trim 0.0 2.0 1
|
|
scrv 4.2 9.7 2
|
|
end
|
|
|
|
|
|
9. Trimming with special points
|
|
|
|
This example extends the trimmed NURB surface example (6) to include
|
|
special points on both the trimming curve and surface. A space curve
|
|
with a special point is also included. This example uses negative
|
|
vertex numbers.
|
|
|
|
# special point and space curve data
|
|
vp 0.500
|
|
vp 0.700
|
|
vp 1.100
|
|
vp 0.200 0.950
|
|
v 0.300 1.500 0.100
|
|
v 0.000 0.000 0.000
|
|
v 1.000 1.000 0.000
|
|
v 2.000 1.000 0.000
|
|
v 3.000 0.000 0.000
|
|
cstype bezier
|
|
deg 3
|
|
curv 0.2 0.9 -4 -3 -2 -1
|
|
sp 1
|
|
parm u 0.00 1.00
|
|
end
|
|
# trimming curve
|
|
vp -0.675 1.850 3.000
|
|
vp 0.915 1.930
|
|
vp 2.485 0.470 2.000
|
|
vp 2.485 -1.030
|
|
vp 1.605 -1.890 10.700
|
|
vp -0.745 -0.654 0.500
|
|
cstype rat bezier
|
|
curv2 -6 -5 -4 -3 -2 -1 -6
|
|
parm u 0.00 1.00 2.00
|
|
sp 2 3
|
|
end
|
|
# surface
|
|
v -1.350 -1.030 0.000
|
|
v 0.130 -1.030 0.432 7.600
|
|
v 1.480 -1.030 0.000 2.300
|
|
v -1.460 0.060 0.201
|
|
v 0.120 0.060 0.915 0.500
|
|
v 1.380 0.060 0.454 1.500
|
|
v -1.480 1.030 0.000 2.300
|
|
v 0.120 1.030 0.394 6.100
|
|
v 1.170 1.030 0.000 3.300
|
|
cstype rat bspline
|
|
deg 2 2
|
|
surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
|
|
parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
|
|
parm v -2.00 -2.00 -2.00 2.00 2.00 2.00
|
|
trim 0.0 2.0 1
|
|
sp 4
|
|
end
|
|
|
|
Connectivity between free-form surfaces
|
|
|
|
Connectivity connects two surfaces along their trimming curves.
|
|
|
|
The con statement specifies the first surface with its trimming curve
|
|
and the second surface with its trimming curve. This information is
|
|
useful for edge merging. Without this surface and curve data,
|
|
connectivity must be determined numerically at greater expense and with
|
|
reduced accuracy using the mg statement.
|
|
|
|
Connectivity between surfaces in different merging groups is ignored.
|
|
Also, although connectivity which crosses points of C1discontinuity in
|
|
trimming curves is legal, it is not recommended. Instead, use two
|
|
connectivity statements which meet at the point of discontinuity.
|
|
|
|
The two curves and their starting and ending parameters should all map
|
|
to the same curve and starting and ending points in object space.
|
|
|
|
Syntax
|
|
|
|
con surf_1 q0_1 q1_1 curv2d_1 surf_2 q0_2 q1_2 curv2d_2
|
|
|
|
Free-form geometry statement.
|
|
|
|
Specifies connectivity between two surfaces.
|
|
|
|
surf_1 is the index of the first surface.
|
|
|
|
q0_1 is the starting parameter for the curve referenced by
|
|
curv2d_1.
|
|
|
|
q1_1 is the ending parameter for the curve referenced by curv2d_1.
|
|
|
|
curv2d_1 is the index of a curve on the first surface. This curve
|
|
must have been previously defined with the curv2 statement.
|
|
|
|
surf_2 is the index of the second surface.
|
|
|
|
q0_2 is the starting parameter for the curve referenced by
|
|
curv2d_2.
|
|
|
|
q1_2 is the ending parameter for the curve referenced by curv2d_2.
|
|
|
|
curv2d_2 is the index of a curve on the second surface. This curve
|
|
must have been previously defined with the curv2 statement.
|
|
|
|
Example
|
|
|
|
1. Connectivity between two surfaces
|
|
|
|
This example shows the connectivity between two surfaces with trimming
|
|
curves.
|
|
|
|
cstype bezier
|
|
deg 1 1
|
|
|
|
v 0 0 0
|
|
v 1 0 0
|
|
v 0 1 0
|
|
v 1 1 0
|
|
|
|
vp 0 0
|
|
vp 1 0
|
|
vp 1 1
|
|
vp 0 1
|
|
|
|
curv2 1 2 3 4 1
|
|
parm u 0.0 1.0 2.0 3.0 4.0
|
|
end
|
|
|
|
surf 0.0 1.0 0.0 1.0 1 2 3 4
|
|
parm u 0.0 1.0
|
|
parm v 0.0 1.0
|
|
trim 0.0 4.0 1
|
|
end
|
|
|
|
v 1 0 0
|
|
v 2 0 0
|
|
v 1 1 0
|
|
v 2 1 0
|
|
|
|
surf 0.0 1.0 0.0 1.0 5 6 7 8
|
|
parm u 0.0 1.0
|
|
parm v 0.0 1.0
|
|
trim 0.0 4.0 1
|
|
end
|
|
|
|
con 1 2.0 2.0 1 2 4.0 3.0 1
|
|
|
|
|
|
Grouping
|
|
|
|
There are four statements in the .obj file to help you manipulate groups
|
|
of elements:
|
|
|
|
o Gropu name statements are used to organize collections of
|
|
elements and simplify data manipulation for operations in
|
|
Model.
|
|
|
|
o Smoothing group statements let you identify elements over which
|
|
normals are to be interpolated to give those elements a smooth,
|
|
non-faceted appearance. This is a quick way to specify vertex
|
|
normals.
|
|
|
|
o Merging group statements are used to ideneify free-form elements
|
|
that should be inspected for adjacency detection. You can also
|
|
use merging groups to exclude surfaces which are close enough to
|
|
be considered adjacent but should not be merged.
|
|
|
|
o Object name statements let you assign a name to an entire object
|
|
in a single file.
|
|
|
|
All grouping statements are state-setting. This means that once a
|
|
group statement is set, it alpplies to all elements that follow
|
|
until the next group statement.
|
|
|
|
This portion of a sample file shows a single element which belongs to
|
|
three groups. The smoothing group is turned off.
|
|
|
|
g square thing all
|
|
s off
|
|
f 1 2 3 4
|
|
|
|
This example shows two surfaces in merging group 1 with a merge
|
|
resolution of 0.5.
|
|
|
|
mg 1 .5
|
|
surf 0.0 1.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
|
surf 0.0 1.0 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
|
|
|
Syntax
|
|
|
|
g group_name1 group_name2 . . .
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies the group name for the elements that follow it. You can
|
|
have multiple group names. If there are multiple groups on one
|
|
line, the data that follows belong to all groups. Group information
|
|
is optional.
|
|
|
|
group_name is the name for the group. Letters, numbers, and
|
|
combinations of letters and numbers are accepted for group names.
|
|
The default group name is default.
|
|
|
|
s group_number
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Sets the smoothing group for the elements that follow it. If you do
|
|
not want to use a smoothing group, specify off or a value of 0.
|
|
|
|
To display with smooth shading in Model and PreView, you must
|
|
create vertex normals after you have assigned the smoothing groups.
|
|
You can create vertex normals with the vn statement or with the
|
|
Model program.
|
|
|
|
To smooth polygonal geometry for rendering with Image, it is
|
|
sufficient to put elements in some smoothing group. However, vertex
|
|
normals override smoothing information for Image.
|
|
|
|
group_number is the smoothing group number. To turn off smoothing
|
|
groups, use a value of 0 or off. Polygonal elements use group
|
|
numbers to put elements in different smoothing groups. For
|
|
free-form surfaces, smoothing groups are either turned on or off;
|
|
there is no difference between values greater than 0.
|
|
|
|
mg group_number res
|
|
|
|
Free-form geometry statement.
|
|
|
|
Sets the merging group and merge resolution for the free-form
|
|
surfaces that follow it. If you do not want to use a merging group,
|
|
specify off or a value of 0.
|
|
|
|
Adjacency detection is performed only within groups, never between
|
|
groups. Connectivity between surfaces in different merging groups
|
|
is not allowed. Surfaces in the same merging group are merged
|
|
together along edges that are within the distance res apart.
|
|
|
|
NOTE: Adjacency detection is an expensive numerical comparison
|
|
process. It is best to restrict this process to as small a domain
|
|
as possible by using small merging groups.
|
|
|
|
group_number is the merging group number. To turn off adjacency
|
|
detection, use a value of 0 or off.
|
|
|
|
res is the maximum distance between two surfaces that will be
|
|
merged together. The resolution must be a value greater than 0.
|
|
This is a required argument only when using merging groups.
|
|
|
|
o object_name
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Optional statement; it is not processed by any Wavefront programs.
|
|
It specifies a user-defined object name for the elements defined
|
|
after this statement.
|
|
|
|
object_name is the user-defined object name. There is no default.
|
|
|
|
Examples
|
|
|
|
1. Cube with group names
|
|
|
|
The following example is a cube with each of its faces placed in a
|
|
separate group. In addition, all elements belong to the group cube.
|
|
|
|
v 0.000000 2.000000 2.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
# 8 vertices
|
|
|
|
g front cube
|
|
f 1 2 3 4
|
|
g back cube
|
|
f 8 7 6 5
|
|
g right cube
|
|
f 4 3 7 8
|
|
g top cube
|
|
f 5 1 4 8
|
|
g left cube
|
|
f 5 6 2 1
|
|
g bottom cube
|
|
f 2 6 7 3
|
|
# 6 elements
|
|
|
|
|
|
2. Two adjoining squares with a smoothing group
|
|
|
|
This example shows two adjoining squares that share a common edge. The
|
|
squares are placed in a smoothing group to ensure that their common
|
|
edge will be smoothed when rendered with Image.
|
|
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
v 4.000000 0.000000 -1.255298
|
|
v 4.000000 2.000000 -1.255298
|
|
# 6 vertices
|
|
|
|
g all
|
|
s 1
|
|
f 1 2 3 4
|
|
f 4 3 5 6
|
|
# 2 elements
|
|
|
|
|
|
3. Two adjoining squares with vertex normals
|
|
|
|
This example also shows two squares that share a common edge. Vertex
|
|
normals have been added to the corners of each square to ensure that
|
|
their common edge will be smoothed during display in Model and PreView
|
|
and when rendered with Image.
|
|
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
v 4.000000 0.000000 -1.255298
|
|
v 4.000000 2.000000 -1.255298
|
|
vn 0.000000 0.000000 1.000000
|
|
vn 0.000000 0.000000 1.000000
|
|
vn 0.276597 0.000000 0.960986
|
|
vn 0.276597 0.000000 0.960986
|
|
vn 0.531611 0.000000 0.846988
|
|
vn 0.531611 0.000000 0.846988
|
|
# 6 vertices
|
|
|
|
# 6 normals
|
|
|
|
g all
|
|
s 1
|
|
f 1//1 2//2 3//3 4//4
|
|
f 4//4 3//3 5//5 6//6
|
|
# 2 elements
|
|
|
|
|
|
4. Merging group
|
|
|
|
This example shows two Bezier surfaces that meet at a common edge. They
|
|
have both been placed in the same merging group to ensure continuity at
|
|
the edge where they meet. This prevents "cracks" from appearing along
|
|
the seam between the two surfaces during rendering. Merging groups will
|
|
be ignored during flat-shading, smooth-shading, and material shading of
|
|
the surface.
|
|
|
|
v -4.949854 -5.000000 0.000000
|
|
v -4.949854 -1.666667 0.000000
|
|
v -4.949854 1.666667 0.000000
|
|
v -4.949854 5.000000 0.000000
|
|
v -1.616521 -5.000000 0.000000
|
|
v -1.616521 -1.666667 0.000000
|
|
v -1.616521 1.666667 0.000000
|
|
v -1.616521 5.000000 0.000000
|
|
v 1.716813 -5.000000 0.000000
|
|
v 1.716813 -1.666667 0.000000
|
|
v 1.716813 1.666667 0.000000
|
|
v 1.716813 5.000000 0.000000
|
|
v 5.050146 -5.000000 0.000000
|
|
v 5.050146 -1.666667 0.000000
|
|
v 5.050146 1.666667 0.000000
|
|
v 5.050146 5.000000 0.000000
|
|
v -15.015566 -4.974991 0.000000
|
|
v -15.015566 -1.641658 0.000000
|
|
v -15.015566 1.691675 0.000000
|
|
v -15.015566 5.025009 0.000000
|
|
v -11.682233 -4.974991 0.000000
|
|
v -11.682233 -1.641658 0.000000
|
|
v -11.682233 1.691675 0.000000
|
|
v -11.682233 5.025009 0.000000
|
|
v -8.348900 -4.974991 0.000000
|
|
v -8.348900 -1.641658 0.000000
|
|
v -8.348900 1.691675 0.000000
|
|
v -8.348900 5.025009 0.000000
|
|
v -5.015566 -4.974991 0.000000
|
|
v -5.015566 -1.641658 0.000000
|
|
v -5.015566 1.691675 0.000000
|
|
v -5.015566 5.025009 0.000000
|
|
|
|
mg 1 0.500000
|
|
|
|
cstype bezier
|
|
deg 3 3
|
|
surf 0.000000 1.000000 0.000000 1.000000 13 14 \
|
|
15 16 9 10 11 12 5 6 7 8 1 2 3 4
|
|
parm u 0.000000 1.000000
|
|
parm v 0.000000 1.000000
|
|
end
|
|
surf 0.000000 1.000000 0.000000 1.000000 29 30 31 32 25 26 27 28 21 22 \
|
|
23 24 17 18 19 20
|
|
parm u 0.000000 1.000000
|
|
parm v 0.000000 1.000000
|
|
end
|
|
|
|
|
|
Display/render attributes
|
|
|
|
Display and render attributes describe how an object looks when
|
|
displayed in Model and PreView or when rendered with Image.
|
|
|
|
Some attributes apply to both free-form and polygonal geometry, such as
|
|
material name and library, ray tracing, and shadow casting.
|
|
Interpolation attributes apply only to polygonal geometry. Curve and
|
|
surface resolutions are used for only free-form geometry.
|
|
|
|
The following chart shows the display and render statements available
|
|
for polygonal and free-form geometry.
|
|
|
|
Table B1-1. Display and render attributes
|
|
|
|
polygonal only polygonal or free-form free-form only
|
|
-------------- ---------------------- --------------
|
|
bevel lod ctech
|
|
c_interp usemtl stech
|
|
d_interp mtllib
|
|
shadow_obj
|
|
trace_obj
|
|
|
|
All display and render attribute statements are state-setting. This
|
|
means that once an attribute statement is set, it applies to all
|
|
elements that follow until it is reset to a different value.
|
|
|
|
The following sample shows rendering and display statements for a face
|
|
element.:
|
|
|
|
s 1
|
|
usemtl blue
|
|
usemap marble
|
|
f 1 2 3 4
|
|
|
|
Syntax
|
|
|
|
The following syntax statements are listed by the type of geometry.
|
|
First are statements for polygonal geometry. Second are statements for
|
|
both free-form and polygonal geometry. Third are statements for
|
|
free-form geometry only.
|
|
|
|
bevel on/off
|
|
|
|
Polygonal geometry statement.
|
|
|
|
Sets bevel interpolation on or off. It works only with beveled
|
|
objects, that is, objects with sides separated by beveled faces.
|
|
|
|
Bevel interpolation uses normal vector interpolation to give an
|
|
illusion of roundness to a flat bevel. It does not affect the
|
|
smoothing of non-bevelled faces.
|
|
|
|
Bevel interpolation does not alter the geometry of the original
|
|
object.
|
|
|
|
on turns on bevel interpolation.
|
|
|
|
off turns off bevel interpolation. The default is off.
|
|
|
|
NOTE: Image cannot render bevel-interpolated elements that have
|
|
vertex normals.
|
|
|
|
c_interp on/off
|
|
|
|
Polygonal geometry statement.
|
|
|
|
Sets color interpolation on or off.
|
|
|
|
Color interpolation creates a blend across the surface of a polygon
|
|
between the materials assigned to its vertices. This creates a
|
|
blending of colors across a face element.
|
|
|
|
To support color interpolation, materials must be assigned per
|
|
vertex, not per element. The illumination models for all materials
|
|
of vertices attached to the polygon must be the same. Color
|
|
interpolation applies to the values for ambient (Ka), diffuse (Kd),
|
|
specular (Ks), and specular highlight (Ns) material properties.
|
|
|
|
on turns on color interpolation.
|
|
|
|
off turns off color interpolation. The default is off.
|
|
|
|
d_interp on/off
|
|
|
|
Polygonal geometry statement.
|
|
|
|
Sets dissolve interpolation on or off.
|
|
|
|
Dissolve interpolation creates an interpolation or blend across a
|
|
polygon between the dissolve (d) values of the materials assigned
|
|
to its vertices. This feature is used to create effects exhibiting
|
|
varying degrees of apparent transparency, as in glass or clouds.
|
|
|
|
To support dissolve interpolation, materials must be assigned per
|
|
vertex, not per element. All the materials assigned to the vertices
|
|
involved in the dissolve interpolation must contain a dissolve
|
|
factor command to specify a dissolve.
|
|
|
|
on turns on dissolve interpolation.
|
|
|
|
off turns off dissolve interpolation. The default is off.
|
|
|
|
lod level
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Sets the level of detail to be displayed in a PreView animation.
|
|
The level of detail feature lets you control which elements of an
|
|
object are displayed while working in PreView.
|
|
|
|
level is the level of detail to be displayed. When you set the
|
|
level of detail to 0 or omit the lod statement, all elements are
|
|
displayed. Specifying an integer between 1 and 100 sets the level
|
|
of detail to be displayed when reading the .obj file.
|
|
|
|
maplib filename1 filename2 . . .
|
|
|
|
This is a rendering identifier that specifies the map library file
|
|
for the texture map definitions set with the usemap identifier. You
|
|
can specify multiple filenames with maplib. If multiple filenames
|
|
are specified, the first file listed is searched first for the map
|
|
definition, the second file is searched next, and so on.
|
|
|
|
When you assign a map library using the Model program, Model allows
|
|
only one map library per .obj file. You can assign multiple
|
|
libraries using a text editor.
|
|
|
|
filename is the name of the library file where the texture maps are
|
|
defined. There is no default.
|
|
|
|
usemap map_name/off
|
|
|
|
This is a rendering identifier that specifies the texture map name
|
|
for the element following it. To turn off texture mapping, specify
|
|
off instead of the map name.
|
|
|
|
If you specify texture mapping for a face without texture vertices,
|
|
the texture map will be ignored.
|
|
|
|
map_name is the name of the texture map.
|
|
|
|
off turns off texture mapping. The default is off.
|
|
|
|
usemtl material_name
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies the material name for the element following it. Once a
|
|
material is assigned, it cannot be turned off; it can only be
|
|
changed.
|
|
|
|
material_name is the name of the material. If a material name is
|
|
not specified, a white material is used.
|
|
|
|
mtllib filename1 filename2 . . .
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies the material library file for the material definitions
|
|
set with the usemtl statement. You can specify multiple filenames
|
|
with mtllib. If multiple filenames are specified, the first file
|
|
listed is searched first for the material definition, the second
|
|
file is searched next, and so on.
|
|
|
|
When you assign a material library using the Model program, only
|
|
one map library per .obj file is allowed. You can assign multiple
|
|
libraries using a text editor.
|
|
|
|
filename is the name of the library file that defines the
|
|
materials. There is no default.
|
|
|
|
shadow_obj filename
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies the shadow object filename. This object is used to cast
|
|
shadows for the current object. Shadows are only visible in a
|
|
rendered image; they cannot be seen using hardware shading. The
|
|
shadow object is invisible except for its shadow.
|
|
|
|
An object will cast shadows only if it has a shadow object. You can
|
|
use an object as its own shadow object. However, a simplified
|
|
version of the original object is usually preferable for shadow
|
|
objects, since shadow casting can greatly increase rendering time.
|
|
|
|
filename is the filename for the shadow object. You can enter any
|
|
valid object filename for the shadow object. The object file can be
|
|
an .obj or .mod file. If a filename is given without an extension,
|
|
an extension of .obj is assumed.
|
|
|
|
Only one shadow object can be stored in a file. If more than one
|
|
shadow object is specified, the last one specified will be used.
|
|
|
|
trace_obj filename
|
|
|
|
Polygonal and free-form geometry statement.
|
|
|
|
Specifies the ray tracing object filename. This object will be used
|
|
in generating reflections of the current object on reflective
|
|
surfaces. Reflections are only visible in a rendered image; they
|
|
cannot be seen using hardware shading.
|
|
|
|
An object will appear in reflections only if it has a trace object.
|
|
You can use an object as its own trace object. However, a
|
|
simplified version of the original object is usually preferable for
|
|
trace objects, since ray tracing can greatly increase rendering
|
|
time.
|
|
|
|
filename is the filename for the ray tracing object. You can enter
|
|
any valid object filename for the trace object. You can enter any
|
|
valid object filename for the shadow object. The object file can be
|
|
an .obj or .mod file. If a filename is given without an extension,
|
|
an extension of .obj is assumed.
|
|
|
|
Only one trace object can be stored in a file. If more than one is
|
|
specified, the last one is used.
|
|
|
|
ctech technique resolution
|
|
|
|
Free-form geometry statement.
|
|
|
|
Specifies a curve approximation technique. The arguments specify
|
|
the technique and resolution for the curve.
|
|
|
|
You must select from one of the following three techniques.
|
|
|
|
ctech cparm res
|
|
|
|
Specifies a curve with constant parametric subdivision using
|
|
one resolution parameter. Each polynomial segment of the curve
|
|
is subdivided n times in parameter space, where n is the
|
|
resolution parameter multiplied by the degree of the curve.
|
|
|
|
res is the resolution parameter. The larger the value, the
|
|
finer the resolution. If res has a value of 0, each polynomial
|
|
curve segment is represented by a single line segment.
|
|
|
|
ctech cspace maxlength
|
|
|
|
Specifies a curve with constant spatial subdivision. The curve
|
|
is approximated by a series of line segments whose lengths in
|
|
real space are less than or equal to the maxlength.
|
|
|
|
maxlength is the maximum length of the line segments. The
|
|
smaller the value, the finer the resolution.
|
|
|
|
ctech curv maxdist maxangle
|
|
|
|
Specifies curvature-dependent subdivision using separate
|
|
resolution parameters for the maximum distance and the maximum
|
|
angle.
|
|
|
|
The curve is approximated by a series of line segments in which
|
|
1) the distance in object space between a line segment and the
|
|
actual curve must be less than the maxdist parameter and 2) the
|
|
angle in degrees between tangent vectors at the ends of a line
|
|
segment must be less than the maxangle parameter.
|
|
|
|
maxdist is the distance in real space between a line segment
|
|
and the actual curve.
|
|
|
|
maxangle is the angle (in degrees) between tangent vectors at
|
|
the ends of a line segment.
|
|
|
|
The smaller the values for maxdist and maxangle, the finer the
|
|
resolution.
|
|
|
|
NOTE: Approximation information for trimming, hole, and special
|
|
curves is stored in the corresponding surface. The ctech statement
|
|
for the surface is used, not the ctech statement applied to the
|
|
curv2 statement. Although untrimmed surfaces have no explicit
|
|
trimming loop, a loop is constructed which bounds the legal
|
|
parameter range. This implicit loop follows the same rules as any
|
|
other loop and is approximated according to the ctech information
|
|
for the surface.
|
|
|
|
stech technique resolution
|
|
|
|
Free-form geometry statement.
|
|
|
|
Specifies a surface approximation technique. The arguments specify
|
|
the technique and resolution for the surface.
|
|
|
|
You must select from one of the following techniques:
|
|
|
|
stech cparma ures vres
|
|
|
|
Specifies a surface with constant parametric subdivision using
|
|
separate resolution parameters for the u and v directions. Each
|
|
patch of the surface is subdivided n times in parameter space,
|
|
where n is the resolution parameter multiplied by the degree of
|
|
the surface.
|
|
|
|
ures is the resolution parameter for the u direction.
|
|
|
|
vres is the resolution parameter for the v direction.
|
|
|
|
The larger the values for ures and vres, the finer the
|
|
resolution. If you enter a value of 0 for both ures and vres,
|
|
each patch is approximated by two triangles.
|
|
|
|
stech cparmb uvres
|
|
|
|
Specifies a surface with constant parametric subdivision, with
|
|
refinement using one resolution parameter for both the u and v
|
|
directions.
|
|
|
|
An initial triangulation is performed using only the points on
|
|
the trimming curves. This triangulation is then refined until
|
|
all edges are of an appropriate length. The resulting triangles
|
|
are not oriented along isoparametric lines as they are in the
|
|
cparma technique.
|
|
|
|
uvres is the resolution parameter for both the u and v
|
|
directions. The larger the value, the finer the resolution.
|
|
|
|
stech cspace maxlength
|
|
|
|
Specifies a surface with constant spatial subdivision.
|
|
|
|
The surface is subdivided in rectangular regions until the
|
|
length in real space of any rectangle edge is less than the
|
|
maxlength. These rectangular regions are then triangulated.
|
|
|
|
maxlength is the length in real space of any rectangle edge.
|
|
The smaller the value, the finer the resolution.
|
|
|
|
stech curv maxdist maxangle
|
|
|
|
Specifies a surface with curvature-dependent subdivision using
|
|
separate resolution parameters for the maximum distance and the
|
|
maximum angle.
|
|
|
|
The surface is subdivided in rectangular regions until 1) the
|
|
distance in real space between the approximating rectangle and
|
|
the actual surface is less than the maxdist (approximately) and
|
|
2) the angle in degrees between surface normals at the corners
|
|
of the rectangle is less than the maxangle. Following
|
|
subdivision, the regions are triangulated.
|
|
|
|
maxdist is the distance in real space between the approximating
|
|
rectangle and the actual surface.
|
|
|
|
maxangle is the angle in degrees between surface normals at the
|
|
corners of the rectangle.
|
|
|
|
The smaller the values for maxdist and maxangle, the finer the
|
|
resolution.
|
|
|
|
Examples
|
|
|
|
1. Cube with materials
|
|
|
|
This cube has a different material applied to each of its faces.
|
|
|
|
mtllib master.mtl
|
|
|
|
v 0.000000 2.000000 2.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
# 8 vertices
|
|
|
|
g front
|
|
usemtl red
|
|
f 1 2 3 4
|
|
g back
|
|
usemtl blue
|
|
f 8 7 6 5
|
|
g right
|
|
usemtl green
|
|
f 4 3 7 8
|
|
g top
|
|
usemtl gold
|
|
f 5 1 4 8
|
|
g left
|
|
usemtl orange
|
|
f 5 6 2 1
|
|
g bottom
|
|
usemtl purple
|
|
f 2 6 7 3
|
|
# 6 elements
|
|
|
|
|
|
2. Cube casting a shadow
|
|
|
|
In this example, the cube casts a shadow on the other objects when it
|
|
is rendered with Image. The cube, which is stored in the file cube.obj,
|
|
references itself as the shadow object.
|
|
|
|
mtllib master.mtl
|
|
shadow_obj cube.obj
|
|
|
|
v 0.000000 2.000000 2.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
# 8 vertices
|
|
|
|
g front
|
|
usemtl red
|
|
f 1 2 3 4
|
|
g back
|
|
usemtl blue
|
|
f 8 7 6 5
|
|
g right
|
|
usemtl green
|
|
f 4 3 7 8
|
|
g top
|
|
usemtl gold
|
|
f 5 1 4 8
|
|
g left
|
|
usemtl orange
|
|
f 5 6 2 1
|
|
g bottom
|
|
usemtl purple
|
|
f 2 6 7 3
|
|
# 6 elements
|
|
|
|
|
|
3. Cube casting a reflection
|
|
|
|
This cube casts its reflection on any reflective objects when it is
|
|
rendered with Image. The cube, which is stored in the file cube.obj,
|
|
references itself as the trace object.
|
|
|
|
mtllib master.mtl
|
|
trace_obj cube.obj
|
|
|
|
v 0.000000 2.000000 2.000000
|
|
v 0.000000 0.000000 2.000000
|
|
v 2.000000 0.000000 2.000000
|
|
v 2.000000 2.000000 2.000000
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
# 8 vertices
|
|
|
|
g front
|
|
usemtl red
|
|
f 1 2 3 4
|
|
g back
|
|
usemtl blue
|
|
f 8 7 6 5
|
|
g right
|
|
usemtl green
|
|
f 4 3 7 8
|
|
g top
|
|
usemtl gold
|
|
f 5 1 4 8
|
|
g left
|
|
usemtl orange
|
|
f 5 6 2 1
|
|
g bottom
|
|
usemtl purple
|
|
f 2 6 7 3
|
|
# 6 elements
|
|
|
|
|
|
|
|
4. Texture-mapped square
|
|
|
|
This example describes a 2 x 2 square. It is mapped with a 1 x 1 square
|
|
texture. The texture is stretched to fit the square exactly.
|
|
|
|
mtllib master.mtl
|
|
|
|
v 0.000000 2.000000 0.000000
|
|
v 0.000000 0.000000 0.000000
|
|
v 2.000000 0.000000 0.000000
|
|
v 2.000000 2.000000 0.000000
|
|
vt 0.000000 1.000000 0.000000
|
|
vt 0.000000 0.000000 0.000000
|
|
vt 1.000000 0.000000 0.000000
|
|
vt 1.000000 1.000000 0.000000
|
|
# 4 vertices
|
|
|
|
usemtl wood
|
|
f 1/1 2/2 3/3 4/4
|
|
# 1 element
|
|
|
|
5. Approximation technique for a surface
|
|
|
|
This example shows a B-spline surface which will be approximated using
|
|
curvature-dependent subdivision specified by the stech command.
|
|
|
|
g bspatch
|
|
v -5.000000 -5.000000 -7.808327
|
|
v -5.000000 -1.666667 -7.808327
|
|
v -5.000000 1.666667 -7.808327
|
|
v -5.000000 5.000000 -7.808327
|
|
v -1.666667 -5.000000 -7.808327
|
|
v -1.666667 -1.666667 11.977780
|
|
v -1.666667 1.666667 11.977780
|
|
v -1.666667 5.000000 -7.808327
|
|
v 1.666667 -5.000000 -7.808327
|
|
v 1.666667 -1.666667 11.977780
|
|
v 1.666667 1.666667 11.977780
|
|
v 1.666667 5.000000 -7.808327
|
|
v 5.000000 -5.000000 -7.808327
|
|
v 5.000000 -1.666667 -7.808327
|
|
v 5.000000 1.666667 -7.808327
|
|
v 5.000000 5.000000 -7.808327
|
|
# 16 vertices
|
|
|
|
g bspatch
|
|
cstype bspline
|
|
stech curv 0.5 10.000000
|
|
deg 3 3
|
|
surf 0.000000 1.000000 0.000000 1.000000 13 14 \ 15 16 9 10 11 12 5 6 7
|
|
8 1 2 3 4
|
|
parm u -3.000000 -2.000000 -1.000000 0.000000 \
|
|
1.000000 2.000000 3.000000 4.000000
|
|
parm v -3.000000 -2.000000 -1.000000 0.000000 \
|
|
1.000000 2.000000 3.000000 4.000000
|
|
end
|
|
# 1 element
|
|
|
|
|
|
|
|
6. Approximation technique for a curve
|
|
|
|
This example shows a Bezier curve which will be approximated using
|
|
constant parametric subdivision specified by the ctech command.
|
|
|
|
v -2.300000 1.950000 0.000000
|
|
v -2.200000 0.790000 0.000000
|
|
v -2.340000 -1.510000 0.000000
|
|
v -1.530000 -1.490000 0.000000
|
|
v -0.720000 -1.470000 0.000000
|
|
v -0.780000 0.230000 0.000000
|
|
v 0.070000 0.250000 0.000000
|
|
v 0.920000 0.270000 0.000000
|
|
v 0.800000 -1.610000 0.000000
|
|
v 1.620000 -1.590000 0.000000
|
|
v 2.440000 -1.570000 0.000000
|
|
v 2.690000 0.670000 0.000000
|
|
v 2.900000 1.980000 0.000000
|
|
# 13 vertices
|
|
|
|
g default
|
|
cstype bezier
|
|
ctech cparm 1.000000
|
|
deg 3
|
|
curv 0.000000 4.000000 1 2 3 4 5 6 7 8 9 10 \
|
|
11 12 13
|
|
parm u 0.000000 1.000000 2.000000 3.000000 \
|
|
4.000000
|
|
end
|
|
# 1 element
|
|
|
|
|
|
|
|
Comments
|
|
|
|
Comments can appear anywhere in an .obj file. They are used to annotate
|
|
the file; they are not processed.
|
|
|
|
Here is an example:
|
|
|
|
# this is a comment
|
|
|
|
The Model program automatically inserts comments when it creates .obj
|
|
files. For example, it reports the number of geometric vertices,
|
|
texture vertices, and vertex normals in a file.
|
|
|
|
# 4 vertices
|
|
# 4 texture vertices
|
|
# 4 normals
|
|
|
|
Mathematics for free-form curves/surfaces
|
|
|
|
[I apologize but this section will make absolutely no sense whatsoever
|
|
without the equations and diagrams and there was just no easy way to
|
|
include them in a pure ASCII document. You should probably just skip
|
|
ahead to the section "Superseded statements." -Jim]
|
|
|
|
General forms
|
|
|
|
Rational and non-rational curves and surfaces
|
|
|
|
In general, any non-rational curve segment may be written as:
|
|
|
|
where
|
|
|
|
K + 1 is the number of control points
|
|
|
|
di are the control points
|
|
|
|
n is the degree of the curve
|
|
|
|
Ni,n(t) are the degree n basis functions
|
|
|
|
Extending this to the bivariate case, any non-rational surface patch
|
|
may be written as:
|
|
|
|
where:
|
|
|
|
K1 + 1 is the number of control points in the u direction
|
|
|
|
K2 + 1 is the number of control points in the v direction
|
|
|
|
di,j are the control points
|
|
|
|
m is the degree of the surface in the u direction
|
|
|
|
n is the degree of the surface in the v direction
|
|
|
|
Ni,m(u) are the degree m basis functions in the u direction
|
|
|
|
Nj,n(v) are the degree n basis functions in the v direction
|
|
|
|
NOTE: The front of the surface is defined as the side where the u
|
|
parameter increases to the right and the v parameter increases upward.
|
|
|
|
We may extend this curve to the rational case as:
|
|
|
|
|
|
|
|
where wi are the weights associated with the control points di.
|
|
Similarly, a rational surface may be expressed as:
|
|
|
|
where wi,j are the weights associated with the control points di,j.
|
|
|
|
NOTE: If a curve or surface in an .obj file is rational, it must use
|
|
the rat option with the cstype statement and it requires some weight
|
|
values for each control point.
|
|
|
|
|
|
|
|
The weights for the rational form are given as a third control point
|
|
coordinate (for trimming curves) or fourth coordinate (for space curves
|
|
and surfaces). These weights are optional and default to 1.0 if not
|
|
given.
|
|
|
|
|
|
|
|
This default weight is only reasonable for curves and surfaces whose
|
|
basis functions sum to 1.0, such as Bezier, Cardinal, and NURB. It does
|
|
not make sense for Taylor and may or may not make sense for a
|
|
representation given in basis-matrix form.
|
|
|
|
For all forms other than B-spline, the final curve or surface is
|
|
constructed by piecing together the individual curve segments or
|
|
surface patches. A global parameter space is then defined over the
|
|
entire composite curve or surface using the parameter vector given with
|
|
the parm statement.
|
|
|
|
The parameter vector for a curve is a list of p global parameter values
|
|
{t1, . . . , tp}. If t1 t < ti+1 is a point in global parameter space,
|
|
then:
|
|
|
|
is the corresponding point in local parameter space for the ith
|
|
polynomial segment. It is this t which is used when evaluating a given
|
|
segment of the piecewise curve. For surfaces, this mapping from global
|
|
to local parameter space is applied independently in both the u and v
|
|
parametric directions.
|
|
|
|
B-splines require a knot vector rather than a parameter vector,
|
|
although this is also given with the parm statement. Refer to the
|
|
description of B-splines below.
|
|
|
|
The following discussion of each type is expressed in terms of the
|
|
above definitions.
|
|
|
|
NOTE: The maximum degree for all curve and surface types is currently
|
|
set at 20, which is high enough for most purposes.
|
|
|
|
|
|
|
|
Free-form curve and surface types
|
|
|
|
B-spline
|
|
|
|
Type bspline specifies arbitrary degree non-uniform B-splines which are
|
|
commonly referred to as NURBs in their rational form. The basis
|
|
functions are defined by the Cox-deBoor recursion formulas as:
|
|
|
|
and:
|
|
|
|
where, by convention, 0/0 = 0.
|
|
|
|
The xi {x0, . . . ,xq} form a set known as the knot vector which is
|
|
given by the parm statement. It is required that
|
|
|
|
1. xi xi + 1,
|
|
|
|
2. x0 < xn + 1,
|
|
|
|
3. xq -n -1 < xq,
|
|
|
|
4. xi < xi + n for 0 < i < q - n - 1,
|
|
|
|
5. xn t min < tmax xK+ 1, where [tmin, tmax] is the parameter
|
|
over which the B-spline is to be evaluated, and
|
|
|
|
6. K = q - n - 1.
|
|
|
|
A knot is said to be of multiplicity r if its value is repeated r times
|
|
in the knot vector. The second through fourth conditions above restrict
|
|
knots to be of at most multiplicity n + 1 at the ends of the vector and
|
|
at most n everywhere else.
|
|
|
|
The last condition requires that the number of control points is equal
|
|
to one less than the number of knots minus the degree. For surfaces,
|
|
all of the above conditions apply independently for the u and v
|
|
parametric directions.
|
|
|
|
Bezier
|
|
|
|
Type bezier specifies arbitrary degree Bezier curves and surfaces. This
|
|
basis function is defined as:
|
|
|
|
where:
|
|
|
|
When using type bezier, the number of global parameter values given
|
|
with the parm statement must be K/n + 1, where K is the number of
|
|
control points. For surfaces, this requirement applies independently
|
|
for the u and v parametric directions.
|
|
|
|
Cardinal
|
|
|
|
Type cardinal specifies a cubic, first derivative, continuous curve or
|
|
surface. For curves, this interpolates all but the first and last
|
|
control points. For surfaces, all but the first and last row and column
|
|
of control points are interpolated.
|
|
|
|
Cardinal splines, also known as Catmull-Rom splines, are best
|
|
understood by considering the conversion from Cardinal to Bezier
|
|
control points for a single curve segment:
|
|
|
|
Here, the ci variables are the Cardinal control points and the bi
|
|
variables are the Bezier control points. We see that the second and
|
|
third Cardinal points are the beginning and ending points for the
|
|
segment, respectively. Also, the beginning tangent lies along the
|
|
vector from the first to the third point, and the ending tangent along
|
|
the vector from the second to the last point.
|
|
|
|
If we let Bi(t) be the cubic Bezier basis functions (i.e. what was
|
|
given above for Bezier as Ni,n(t) with n = 3), then we may write the
|
|
Cardinal basis functions as:
|
|
|
|
Note that Cardinal splines are only defined for the cubic case.
|
|
|
|
When using type cardinal, the number of global parameter values given
|
|
with the parm statement must be K - n + 2, where K is the number of
|
|
control points. For surfaces, this requirement applies independently
|
|
for the u and v parametric directions.
|
|
|
|
Taylor
|
|
|
|
Type taylor specifies arbitrary degree Taylor polynomial curves and
|
|
surfaces. The basis function is simply:
|
|
|
|
NOTE: The control points in this case are the polynomial coefficients
|
|
and have no obvious geometric significance.
|
|
|
|
When using type taylor, the number of global parameter values given
|
|
with the parm statement must be (K + 1)/(n + 1) + 1, where K is the
|
|
number of control points. For surfaces, this requirement applies
|
|
independently for the u and v parametric directions.
|
|
|
|
Basis matrix
|
|
|
|
Type bmatrix specifies general, arbitrary-degree curves defined through
|
|
the use of a basis matrix rather than an explicit type such as Bezier.
|
|
The basis functions are defined as:
|
|
|
|
where the basis matrix is the bi,j. In order to make the matrix nature
|
|
of this more obvious, we may also write:
|
|
|
|
When constructing basis matrices, you should keep this definition in
|
|
mind, as different authors write this in different ways. A more common
|
|
matrix representation is:
|
|
|
|
To use such matrices in the .obj file, simply transpose the matrix and
|
|
reverse the column ordering.
|
|
|
|
When using type basis, the number of global parameter values given with
|
|
the parm statement must be (K - n)/s + 2, where K is the number of
|
|
control points and s is the step size given with the step statement.
|
|
For surfaces, this requirement applies independently for the u and v
|
|
parametric directions.
|
|
|
|
Surface vertex data
|
|
|
|
Control points
|
|
|
|
The control points for a surface consisting of a single patch are
|
|
listed in the order i = 0 to K1 for j = 0, followed by i = 0 to K1 for
|
|
j = 1, and so on until j = K2.
|
|
|
|
For surfaces made up of many patches, which is the usual case, the
|
|
control points are ordered as if the surface were a single large patch.
|
|
For example, the control points for a bicubic Bezier surface consisting
|
|
of four patches would be arranged as follows:
|
|
|
|
where (m, n) is the global parameter space of the surface and the
|
|
numbers indicate the ordering of the vertex indices in the surf
|
|
statement.
|
|
|
|
Texture vertices and texture mapping
|
|
|
|
When texture vertices are not supplied, the original surface
|
|
parameterization is used for texture mapping. However, if texture
|
|
vertices are supplied, they are interpreted as additional information
|
|
to be interpolated or approximated separately from, but using the same
|
|
interpolation functions as the control vertices.
|
|
|
|
That is, whereas the surface itself, in the non-rational case, was
|
|
given in the section "Rational and non-rational curves and surfaces"
|
|
as:
|
|
|
|
|
|
|
|
the texture vertices are interpolated or approximated by:
|
|
|
|
where ti,j are the texture vertices and the basis functions are the
|
|
same as for S(u,v). It is T(u,v), rather than the surface
|
|
parameterization (u,v), which is used when a texture map is applied.
|
|
|
|
Vertex normals and normal mapping
|
|
|
|
Vertex normals are treated exactly like texture vertices. When vertex
|
|
normals are not supplied, the true surface normals are used. If vertex
|
|
normals are supplied, they are calculated as:
|
|
|
|
where qi,j are the vertex normals and the basis functions are the same
|
|
as for S(u,v) and T(u,v).
|
|
|
|
NOTE: Vertex normals do not affect the shape of the surface; they are
|
|
simply associated with the triangle vertices in the final
|
|
triangulation. As with faces, supplying vertex normals only affects
|
|
lighting calculations for the surface.
|
|
|
|
The treatment of both texture vertices and vertex normals in the case
|
|
of rational surfaces is identical. It is important to notice that even
|
|
when the surface S(u,v) is rational, the texture and normal surfaces,
|
|
T(u,v) and Q(u,v), are not rational. This is because the control points
|
|
(the texture vertices and vertex normals) are never rational.
|
|
|
|
Curve and surface operations
|
|
|
|
Special points
|
|
|
|
The following equations give a more precise description of special
|
|
points for space curves and discuss the extension to trimming curves
|
|
and surfaces.
|
|
|
|
Let C(t) be a space curve with the global parameter t. We can
|
|
approximate this curve by a set of k-1 line segments which connect the
|
|
points:
|
|
|
|
for some set of k global parameter values {t1,...,tk}
|
|
|
|
Given a special point ts in the parameter space of the curve
|
|
(referenced by vp), we guarantee that ts {t1, . . . ,tk}. More
|
|
specifically, we approximate the curve by:
|
|
|
|
where, at the point i where ts is inserted, we have ti ts < ti+1.
|
|
|
|
Special curves
|
|
|
|
The following equations give a more precise description of a special
|
|
curve.
|
|
|
|
Let T(t) be a special curve with the global parameter t. We have:
|
|
|
|
where (m,n) is a point in the global parameter space of a surface. We
|
|
can approximate this curve by a set of k-1 line segments which connect
|
|
the points:
|
|
|
|
for some set of k global parameter values.
|
|
|
|
Let S(m,n) be a surface with the global parameters m and n. We can
|
|
approximate this surface by a triangulation of a set of p points.
|
|
|
|
which lie on the surface. We further define E as the set of all edges
|
|
such that ei,j E implies that S(mi,ni) and S(mj,nj) are connected in
|
|
the triangulation. Finally, we guarantee that there exists some subset
|
|
of E:
|
|
|
|
such that the points:
|
|
|
|
are connected in the triangulation.
|
|
|
|
Connectivity
|
|
|
|
Recall that the syntax of the con statement is:
|
|
|
|
con surf_1 q0_1 q1_1 curv2d_1 surf_2 q0_2 q1_2 curv2d_2
|
|
|
|
If we let:
|
|
|
|
T1(t1) be the curve referenced by curv2d_1
|
|
|
|
S1(m1, n1) be the surface referenced by surf1 on which T1(t1) lies
|
|
|
|
T2(t2) be the curve referenced by curv2d_2
|
|
|
|
S2(m2, n2) be the surface referenced by surf2 on which T2(t2) lies
|
|
|
|
then S1(T1(t1)), S2(T2(t2)) must be identical up to reparameterization.
|
|
Moreover, it must be the case that:
|
|
|
|
S1(T1(q0_1)) = S2(T2(q0_2))
|
|
|
|
and:
|
|
|
|
S1(T1(q1_1)) = S2(T2(q1_2))
|
|
|
|
It is along the curve S1(T1(t1)) between t1 = q0_1 and t1 = q1_1, and
|
|
the curve S2(T2(t2)) between t2 = q0_2 and t2 = q1_2 that the surface
|
|
S1(m1, n1) is connected to the surface S2(m2, n2).
|
|
|
|
|
|
|
|
Superseded statements
|
|
|
|
The new .obj file format has eliminated the need for several patch and
|
|
curve statements. These statements have been replaced by free-form
|
|
geometry statements.
|
|
|
|
In the 3.0 release, the following keywords have been superseded:
|
|
|
|
o bsp
|
|
|
|
o bzp
|
|
|
|
o cdc
|
|
|
|
o cdp
|
|
|
|
o res
|
|
|
|
You can still read these statements in this version 3.0, however, the
|
|
system will no longer write files in this format.
|
|
|
|
This release is the last release that will read these statements. If
|
|
you want to save any data from this format, read in the file and write
|
|
it out. The system will convert the data to the new .obj format.
|
|
|
|
For more information on the new syntax statements, see "Specifying
|
|
free-form curves and surfaces."
|
|
|
|
Syntax
|
|
|
|
The following syntax statements are for the superseded keywords.
|
|
|
|
bsp v1 v2 . . . v16
|
|
|
|
Specifies a B-spline patch. B-spline patches have sixteen control
|
|
points, defined as vertices. Only four of the control points are
|
|
distributed over the surface of the patch; the remainder are
|
|
distributed around the perimeter of the patch.
|
|
|
|
Patches must be tessellated in Model before they can be correctly
|
|
shaded or rendered.
|
|
|
|
v is the vertex number for a control point. Sixteen vertex numbers
|
|
are required. Positive values indicate absolute vertex numbers.
|
|
Negative values indicate relative vertex numbers.
|
|
|
|
bzp v1 v2 . . . v16
|
|
|
|
Specifies a Bezier patch. Bezier patches have sixteen control
|
|
points, defined as vertices. The control points are distributed
|
|
uniformly over its surface.
|
|
|
|
Patches must be tessellated in Model before they can be correctly
|
|
shaded or rendered.
|
|
|
|
v is the vertex number for a control point. Sixteen vertex numbers
|
|
are required. Positive values indicate absolute vertex numbers.
|
|
Negative values indicate relative vertex numbers.
|
|
|
|
cdc v1 v2 v3 v4 v5 . . .
|
|
|
|
Specifies a Cardinal curve. Cardinal curves have a minimum of four
|
|
control points, defined as vertices.
|
|
|
|
Cardinal curves cannot be correctly shaded or rendered. They can be
|
|
tessellated and then extruded in Model to create 3D shapes.
|
|
|
|
v is the vertex number for a control point. A minimum of four
|
|
vertex numbers are required. There is no limit on the maximum.
|
|
Positive values indicate absolute vertex numbers. Negative values
|
|
indicate relative vertex numbers.
|
|
|
|
cdp v1 v2 v3 . . . v16
|
|
|
|
Specifies a Cardinal patch. Cardinal patches have sixteen control
|
|
points, defined as vertices. Four of the control points are
|
|
attached to the corners of the patch.
|
|
|
|
Patches must be tessellated in Model before they can be correctly
|
|
shaded or rendered.
|
|
|
|
v is the vertex number for a control point. Sixteen vertex numbers
|
|
are required. Positive values indicate absolute vertex numbers.
|
|
Negative values indicate relative vertex numbers.
|
|
|
|
res useg vseg
|
|
|
|
Reference and display statement.
|
|
|
|
Sets the number of segments for Bezier, B-spline and Cardinal
|
|
patches that follow it.
|
|
|
|
useg is the number of segments in the u direction (horizontal or x
|
|
direction). The minimum setting is 3 and the maximum setting is
|
|
120. The default is 4.
|
|
|
|
vseg is the number of segments in the v direction (vertical or y
|
|
direction). The minimum setting is 3 and the maximum setting is
|
|
120. The default is 4.
|
|
|
|
Comparison of 2.11 and 3.0 syntax
|
|
|
|
Cardinal curve
|
|
|
|
The following example shows the 2.11 syntax and the 3.0 syntax for the
|
|
same Cardinal curve.
|
|
|
|
2.11 Cardinal curve
|
|
|
|
# 2.11 Cardinal Curve
|
|
|
|
v 2.570000 1.280000 0.000000
|
|
v 0.940000 1.340000 0.000000
|
|
v -0.670000 0.820000 0.000000
|
|
v -0.770000 -0.940000 0.000000
|
|
v 1.030000 -1.350000 0.000000
|
|
v 3.070000 -1.310000 0.000000
|
|
# 6 vertices
|
|
|
|
cdc 1 2 3 4 5 6
|
|
|
|
|
|
3.0 Cardinal curve
|
|
|
|
# 3.0 Cardinal curve
|
|
|
|
v 2.570000 1.280000 0.000000
|
|
v 0.940000 1.340000 0.000000
|
|
v -0.670000 0.820000 0.000000
|
|
v -0.770000 -0.940000 0.000000
|
|
v 1.030000 -1.350000 0.000000
|
|
v 3.070000 -1.310000 0.000000
|
|
# 6 vertices
|
|
|
|
cstype cardinal
|
|
deg 3
|
|
curv 0.000000 3.000000 1 2 3 4 5 6
|
|
parm u 0.000000 1.000000 2.000000 3.000000
|
|
end
|
|
# 1 element
|
|
|
|
Bezier patch
|
|
|
|
The following example shows the 2.11 syntax and the 3.0 syntax for the
|
|
same Bezier patch.
|
|
|
|
2.11 Bezier patch
|
|
|
|
# 2.11 Bezier Patch
|
|
v -5.000000 -5.000000 0.000000
|
|
v -5.000000 -1.666667 0.000000
|
|
v -5.000000 1.666667 0.000000
|
|
v -5.000000 5.000000 0.000000
|
|
v -1.666667 -5.000000 0.000000
|
|
v -1.666667 -1.666667 0.000000
|
|
v -1.666667 1.666667 0.000000
|
|
v -1.666667 5.000000 0.000000
|
|
v 1.666667 -5.000000 0.000000
|
|
v 1.666667 -1.666667 0.000000
|
|
v 1.666667 1.666667 0.000000
|
|
v 1.666667 5.000000 0.000000
|
|
v 5.000000 -5.000000 0.000000
|
|
v 5.000000 -1.666667 0.000000
|
|
v 5.000000 1.666667 0.000000
|
|
v 5.000000 5.000000 0.000000
|
|
# 16 vertices
|
|
|
|
bzp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
|
# 1 element
|
|
|
|
3.0 Bezier patch
|
|
|
|
# 3.0 Bezier patch
|
|
|
|
v -5.000000 -5.000000 0.000000
|
|
v -5.000000 -1.666667 0.000000
|
|
v -5.000000 1.666667 0.000000
|
|
v -5.000000 5.000000 0.000000
|
|
v -1.666667 -5.000000 0.000000
|
|
v -1.666667 -1.666667 0.000000
|
|
v -1.666667 1.666667 0.000000
|
|
v -1.666667 5.000000 0.000000
|
|
v 1.666667 -5.000000 0.000000
|
|
v 1.666667 -1.666667 0.000000
|
|
v 1.666667 1.666667 0.000000
|
|
v 1.666667 5.000000 0.000000
|
|
v 5.000000 -5.000000 0.000000
|
|
v 5.000000 -1.666667 0.000000
|
|
v 5.000000 1.666667 0.000000
|
|
v 5.000000 5.000000 0.000000
|
|
# 16 vertices
|
|
|
|
cstype bezier
|
|
deg 3 3
|
|
surf 0.000000 1.000000 0.000000 1.000000 13 14 \
|
|
15 16 9 10 11 12 5 6 7 8 1 2 3 4
|
|
parm u 0.000000 1.000000
|
|
parm v 0.000000 1.000000
|
|
end
|
|
# 1 element
|
|
|