1RTC_GEOMETRY_TYPE_*_CURVE(E3m)bree Ray Tracing KernelsRT3C_GEOMETRY_TYPE_*_CURVE(3)
2
3
4
5   NAME
6              RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE -
7                flat curve geometry with linear basis
8
9              RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE -
10                flat curve geometry with cubic Bézier basis
11
12              RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE -
13                flat curve geometry with cubic B-spline basis
14
15              RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE -
16                flat curve geometry with cubic Hermite basis
17
18              RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE -
19                flat curve geometry with Catmull-Rom basis
20
21              RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BEZIER_CURVE -
22                flat normal oriented curve geometry with cubic Bézier basis
23
24              RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BSPLINE_CURVE -
25                flat normal oriented curve geometry with cubic B-spline basis
26
27              RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_HERMITE_CURVE -
28                flat normal oriented curve geometry with cubic Hermite basis
29
30              RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_CATMULL_ROM_CURVE -
31                flat normal oriented curve geometry with Catmull-Rom basis
32
33              RTC_GEOMETRY_TYPE_CONE_LINEAR_CURVE -
34                capped cone curve geometry with linear basis - discontinous at edge boundaries
35
36              RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE -
37                capped cone curve geometry with linear basis and spherical ending
38
39              RTC_GEOMETRY_TYPE_ROUND_BEZIER_CURVE -
40                swept surface curve geometry with cubic Bézier basis
41
42              RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE -
43                swept surface curve geometry with cubic B-spline basis
44
45              RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE -
46                swept surface curve geometry with cubic Hermite basis
47
48              RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE -
49                swept surface curve geometry with Catmull-Rom basis
50
51   SYNOPSIS
52              #include <embree3/rtcore.h>
53
54              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE);
55              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE);
56              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE);
57              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE);
58              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE);
59              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BEZIER_CURVE);
60              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BSPLINE_CURVE);
61              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_HERMITE_CURVE);
62              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_CATMULL_ROM_CURVE);
63              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_CONE_LINEAR_CURVE);
64              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE);
65              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ROUND_BEZIER_CURVE);
66              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE);
67              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE);
68              rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE);
69
70   DESCRIPTION
71       Curves  with  per vertex radii are supported with linear, cubic Bézier,
72       cubic B-spline, and cubic Hermite bases.   Such  curve  geometries  are
73       created   by  passing  RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE,  RTC_GEOME‐
74       TRY_TYPE_FLAT_BEZIER_CURVE,       RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE,
75       RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE,       RTC_GEOMETRY_TYPE_FLAT_CAT‐
76       MULL_ROM_CURVE,    RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_FLAT_BEZIER_CURVE,
77       RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_FLAT_BSPLINE_CURVE,        RTC_GEOME‐
78       TRY_TYPE_NORMAL_ORIENTED_FLAT_HERMITE_CURVE,     RTC_GEOMETRY_TYPE_NOR‐
79       MAL_ORIENTED_FLAT_CATMULL_ROM_CURVE,        RTC_GEOMETRY_TYPE_CONE_LIN‐
80       EAR_CURVE,       RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE,       RTC_GEOME‐
81       TRY_TYPE_ROUND_BEZIER_CURVE,     RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE,
82       RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE, or  RTC_GEOMETRY_TYPE_ROUND_CAT‐
83       MULL_ROM_CURVE  to  the rtcNewGeometry function.  The curve indices can
84       be specified through an index buffer  (RTC_BUFFER_TYPE_INDEX)  and  the
85       curve  vertices  through a vertex buffer (RTC_BUFFER_TYPE_VERTEX).  For
86       the Hermite basis a tangent  buffer  (RTC_BUFFER_TYPE_TANGENT),  normal
87       oriented  curves a normal buffer (RTC_BUFFER_TYPE_NORMAL), and for nor‐
88       mal oriented  Hermite  curves  a  normal  derivative  buffer  (RTC_BUF‐
89       FER_TYPE_NORMAL_DERIVATIVE)  has  to  get  specified additionally.  See
90       rtcSetGeometryBuffer and rtcSetSharedGeometryBuffer for more details on
91       how to set buffers.
92
93       The  index  buffer contains an array of 32-bit indices (RTC_FORMAT_UINT
94       format), each pointing to the first control vertex in the  vertex  buf‐
95       fer,  but  also  to  the first tangent in the tangent buffer, and first
96       normal in the normal buffer if these buffers are present.
97
98       The vertex buffer stores each control vertex in the form  of  a  single
99       precision  position  and  radius stored in (x, y, z, r) order in memory
100       (RTC_FORMAT_FLOAT4 format).  The number of vertices  is  inferred  from
101       the  size  of  this buffer.  The radii may be smaller than zero but the
102       interpolated radii should always be greater or equal to zero.  Similar‐
103       ly, the tangent buffer stores the derivative of each control vertex (x,
104       y, z, r order and  RTC_FORMAT_FLOAT4  format)  and  the  normal  buffer
105       stores  a single precision normal per control vertex (x, y, z order and
106       RTC_FORMAT_FLOAT3 format).
107
108   Linear Basis
109       For the linear basis the indices point to the first  of  2  consecutive
110       control  points  in  the vertex buffer.  The first control point is the
111       start and the second control point the end of the line  segment.   When
112       constructing  hair  strands  in this basis, the end-point can be shared
113       with the start of the next line segment.
114
115       For the linear basis the user optionally can provide a flags buffer  of
116       type RTC_BUFFER_TYPE_FLAGS which contains bytes that encode if the left
117       neighbor  segment  (RTC_CURVE_FLAG_NEIGHBOR_LEFT  flag)  and/or   right
118       neighbor segment (RTC_CURVE_FLAG_NEIGHBOR_RIGHT flags) exist (see [RTC‐
119       CurveFlags]).  If this buffer is not set, than the left/right  neighbor
120       bits  are  automatically calculated base on the index buffer (left seg‐
121       ment exists if segment(id-1)+1 == segment(id) and right segment  exists
122       if segment(id+1)-1 == segment(id)).
123
124       A  left  neighbor  segment is assumed to end at the start vertex of the
125       current segement, and to start at the previous  vertex  in  the  vertex
126       buffer.   Similarly,  the right neighbor segment is assumed to start at
127       the end vertex of the current segment, and to end at the next vertex in
128       the vertex buffer.
129
130       Only  when  the  left and right bits are properly specified the current
131       segment can properly attach to the left and/or right  neighbor,  other‐
132       wise the touching area may not get rendererd properly.
133
134   Bézier Basis
135       For the cubic Bézier basis the indices point to the first of 4 consecu‐
136       tive control points in the vertex buffer.  These control points use the
137       cubic  Bézier basis, where the first control point represents the start
138       point of the curve, and the 4th control point  the  end  point  of  the
139       curve.   The  Bézier basis is interpolating, thus the curve does go ex‐
140       actly through the first and fourth control vertex.
141
142   B-spline Basis
143       For the cubic B-spline basis the indices point to the first of  4  con‐
144       secutive  control  points  in  the vertex buffer.  These control points
145       make up a cardinal cubic B-spline (implicit equidistant  knot  vector).
146       This  basis is not interpolating, thus the curve does in general not go
147       through any of the control points directly.  A big  advantage  of  this
148       basis  is that 3 control points can be shared for two continuous neigh‐
149       boring curve segments, e.g. the curves (p0,p1,p2,p3) and  (p1,p2,p3,p4)
150       are  C1 continuous.  This feature make this basis a good choise to con‐
151       struct continuous multi-segment curves, as memory  consumption  can  be
152       kept minimal.
153
154   Hermite Basis
155       For the cubic Hermite basis the indices point to the first of 2 consec‐
156       utive points in the vertex buffer, and the first of 2 consecutive  tan‐
157       gents in the tangent buffer.  These two points and two tangents make up
158       a cubic Hermite curve.  This basis is interpolating, thus does  exactly
159       go  through the first and second control point, and the first order de‐
160       rivative at the begin and end matches exactly the  value  specified  in
161       the tangent buffer.  When connecting two segments continuously, the end
162       point and tangent of the previous segment  can  be  shared.   Different
163       versions of Catmull-Rom splines can be easily constructed usig the Her‐
164       mite basis, by calculating a proper tangent  buffer  from  the  control
165       points.
166
167   Catmull-Rom Basis
168       For  the Catmull-Rom basis the indices point to the first of 4 consecu‐
169       tive control points in the vertex buffer.  This basis goes  through  p1
170       and p2, with tangents (p2-p0)/2 and (p3-p1)/2.
171
172   Flat Curves
173       The  RTC_GEOMETRY_TYPE_FLAT_* flat mode is a fast mode designed to ren‐
174       der distant hair.  In this mode the curve is rendered  as  a  connected
175       sequence  of ray facing quads.  Individual quads are considered to have
176       subpixel size, and zooming onto the curve might  show  geometric  arti‐
177       facts.   The number of quads to subdivide into can be specified through
178       the rtcSetGeometryTessellationRate function.  By default the  tessella‐
179       tion rate is 4.
180
181   Normal Oriented Curves
182       The RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_* mode is a mode designed to ren‐
183       der blades of grass.  In this mode a vertex spline has to get specified
184       as  for  the  previous  modes,  but additionally a normal spline is re‐
185       quired.  If the Hermite basis is used, the  RTC_BUFFER_TYPE_NORMAL  and
186       RTC_BUFFER_TYPE_NORMAL_DERIVATIVE buffers have both to be set.
187
188       The curve is rendered as a flat band whose center approximately follows
189       the provided vertex spline, whose half width approximately follows  the
190       provided radius spline, and whose normal orientation approximately fol‐
191       lows the provided normal spline.
192
193       To intersect the normal oriented curve,  we  perform  a  newton-raphson
194       style  intersection  of a ray with a tensor product surface of a linear
195       basis (perpendicular to the curve) and cubic Bézier  basis  (along  the
196       curve).  We use a guide curve and its derivatives to construct the con‐
197       trol points of that surface.  The guide curve is  defined  by  a  sweep
198       surface  defined by sweeping a line centered at the vertex spline loca‐
199       tion along the curve.  At each parameter value the half  width  of  the
200       line  matches  the  radius  spline, and the direction matches the cross
201       product of the normal from the normal spline and tangent of the  vertex
202       spline.   Note  that  this construction does not work when the provided
203       normals are parallel to the curve direction.  For this reason the  pro‐
204       vided  normals should best be kept as perpendicular to the curve direc‐
205       tion as possible.
206
207   Round Curves
208       In the RTC_GEOMETRY_TYPE_ROUND_* round mode, a real  geometric  surface
209       is  rendered  for the curve, which is more expensive but allows closeup
210       views.
211
212       For the linear basis the round mode renders a  cone  that  tangentially
213       touches  a  start-sphere  and end-sphere.  The start sphere is rendered
214       when no previous segments is indicated by the neighbor bits.   The  end
215       sphere  is  always  rendered but parts that lie inside the next segment
216       are clipped away (if that next segment exists).  This way  a  curve  is
217       closed  on  both ends and the interiour will render properly as long as
218       only neighboring segments penetrate into a segment.  For this  to  work
219       properly  it  is  important that the flags buffer is properly populated
220       with neighbor information.
221
222       For the cubic polynomial bases, the round mode renders a sweep  surface
223       by  sweeping  a varying radius circle tangential along the curve.  As a
224       limitation, the radius of the curve has to be smaller than  the  curva‐
225       ture radius of the curve at each location on the curve.
226
227       The intersection with the curve segment stores the parametric hit loca‐
228       tion along the curve segment as u-coordinate (range 0 to +1).
229
230       For flat curves, the v-coordinate is set to the normalized distance  in
231       the  range -1 to +1.  For normal oriented curves the v-coordinate is in
232       the range 0 to 1.  For the linear basis and in round mode the v-coordi‐
233       nate is set to zero.
234
235       In flat mode, the geometry normal Ng is set to the tangent of the curve
236       at the hit location.  In round mode and for normal oriented curves, the
237       geometry normal Ng is set to the non-normalized geometric normal of the
238       surface.
239
240       For multi-segment motion blur, the number of time steps must  be  first
241       specified  using  the  rtcSetGeometryTimeStepCount call.  Then a vertex
242       buffer for each time step can be set using different buffer slots,  and
243       all  these buffers must have the same stride and size.  For the Hermite
244       basis also a tangent buffer has to be set for each time  step  and  for
245       normal  oriented  curves  a normal buffer has to get specified for each
246       time step.
247
248       Also see tutorials [Hair] and [Curves] for examples of  how  to  create
249       and use curve geometries.
250
251   EXIT STATUS
252       On  failure  NULL  is  returned  and  an  error code is set that can be
253       queried using rtcGetDeviceError.
254
255   SEE ALSO
256       [rtcNewGeometry], [RTCCurveFlags]
257
258
259
260                                                  RTC_GEOMETRY_TYPE_*_CURVE(3)
Impressum