Upload
dane
View
21
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Shapes. Digital Image Synthesis Yung-Yu Chuang 10/04/2007. with slides by Pat Hanrahan. Announcements. One break or two breaks. Please do read the textbook and trace code. LootAt issue. No class on 10/18 because of attending CGW 2007. - PowerPoint PPT Presentation
Citation preview
Shapes
Digital Image SynthesisYung-Yu Chuang10/04/2007
with slides by Pat Hanrahan
Announcements
• One break or two breaks.• Please do read the textbook and trace code.• LootAt issue.• No class on 10/18 because of attending CGW 2
007.• Assignment #1 will be handed out today. Due t
hree weeks later.
Shapes
• One advantages of ray tracing is it can support various kinds of shapes as long as we can find ray-shape intersection.
• Careful abstraction of geometric shapes is a key component for a ray tracer. Ideal candidate for object-oriented design. Scan conversion may not have such a neat interface.
• All shape classes implement the same interface and the other parts of the ray tracer just use this interface without knowing the details about this shape.
Shapes
• Primitive=Shape+Material• Shape: raw geometry properties of the primitiv
e, implements interface such as surface area and bounding box.
• Source code in core/shape.* and shapes/*
Shapes
• pbrt provides the following shape plug-ins: – quadrics: sphere, cone, cylinder, disk, hyperboloid
(雙曲面 ), paraboloid(拋物面 ) (surface described by quadratic polynomials in x, y, z)
– triangle mesh– height field– NURBS– Loop subdivision surface
• Some possible extensions: other subdivision schemes, fractals, CSG, point-sampled geometry
Shapes
class Shape : public ReferenceCounted {public: <Shape Interface> all are virtual functions const Transform ObjectToWorld, WorldToObject; const bool reverseOrientation, transformSwapsHandedness;}
• All shapes are defined in object coordinate space
Shape interface: bounding
• BBox ObjectBound() const=0;pure virtual function• BBox WorldBound() { left to individual shape default implementation; can be overridden return ObjectToWorld(ObjectBound());
}
Shape interface: intersecting
• bool CanIntersect() returns whether this shape can do intersection test; if not, the shape must provide
void Refine(vector<Reference<Shape>>&refined)
examples include complex surfaces (which need to be tessellated first) or placeholders (which store geometry information in the disk)
• bool Intersect(const Ray &ray,
float *tHit, DifferentialGeometry *dg)• bool IntersectP(const Ray &ray)
not pure virtual functions so that non-intersectable shapes don’t need to implement them; instead, a default implementation which prints error is provided.
in world space
Differential geometry
• DifferentialGeometry: a self-contained representation for a particular point on a surface so that all the other operations in pbrt can be executed without referring to the original shape. It contains
• Position• Parameterization (u,v)• Parametric derivatives (dp/du, dp/dv)• Surface normal (derived from (dp/du)x(dp/dv))• Derivatives of normals• Pointer to shape
Shape interface• float Area() useful when using as a area light• void GetShadingGeometry( const Transform &obj2world, const DifferentialGeometry &dg, DifferentialGeometry *dgShading)
• No back culling for that it doesn’t save much for ray tracing and it is not physically correct
for object instancing
Surfaces
• Implicit: F(x,y,z)=0 you can check• Explicit: (x(u,v),y(u,v),z(u,v)) you can enumerate also called parametric • Quadrics
0
1
1
z
y
x
JIGD
IHFC
GFEB
DCBA
zyx
Sphere
• A sphere of radius r at the origin• Implicit: x2+y2+z2-r2=0
• Parametric: f(θ,ψ)
x=rsinθcosψ
y=rsinθsinψ
z=rcosθ
mapping f(u,v) over [0,1]2
ψ=uψmax
θ=θmin+v(θmax-θmin)
useful for texture mapping
θ
Sphere
Sphere (construction)
class Sphere: public Shape {
……
private:
float radius;
float phiMax;
float zmin, zmax;
float thetaMin, thetaMax;
}
Sphere(const Transform &o2w, bool ro, float rad, float zmin, float zmax,
float phiMax);
• Bounding box for sphere, only z clipping
thetas are derived from z
Intersection (algebraic solution)
• Perform in object space, WorldToObject(r, &ray)• Assume that ray is normalized for a while
2222 rzyx
2222 rtdotdotdo zzyyxx
02 CBtAt
222zyx dddA
)(2 zzyyxx odododB 2222 roooC zyx
Step 1
Algebraic solution
A
ACBBt
2
42
0
A
ACBBt
2
42
1
If (B2-4AC<0) then the ray misses the sphereStep 2
Step 3
Calculate t0 and test if t0<0 (actually mint, maxt)Step 4
Calculate t1 and test if t1<0
check the real source code in sphere.cpp
Quadric (in pbrt.h)inline bool Quadratic(float A, float B, float C, float *t0, float *t1) { // Find quadratic discriminant float discrim = B * B - 4.f * A * C; if (discrim < 0.) return false; float rootDiscrim = sqrtf(discrim); // Compute quadratic _t_ values float q; if (B < 0) q = -.5f * (B - rootDiscrim); else q = -.5f * (B + rootDiscrim); *t0 = q / A; *t1 = C / q; if (*t0 > *t1) swap(*t0, *t1); return true;}
Why?
• Cancellation error: devastating loss of precision when small numbers are computed from large numbers by addition or subtraction.
double x1 = 10.000000000000004; double x2 = 10.000000000000000;
double y1 = 10.00000000000004;
double y2 = 10.00000000000000;
double z = (y1 - y2) / (x1 - x2); // 11.5
A
qt 0
q
Ct 1
otherwise 42
1
0 if 42
1
2
2
ACBB
BACBBq
Range checking
if (t0 > ray.maxt || t1 < ray.mint) return false;float thit = t0;if (t0 < ray.mint) {
thit = t1;if (thit > ray.maxt) return false;
} ...
phit = ray(thit);phi = atan2f(phit.y, phit.x);if (phi < 0.) phi += 2.f*M_PI;// Test sphere intersection against clipping parametersif (phit.z < zmin || phit.z > zmax || phi > phiMax) { ... // see if we should check another hit point}
Geometric solution
1. Origin inside? 2222 rooo zyx
Geometric solution
2. find the closest point, t=-O‧D if t<0 and O outside return false
t
t
D is normalized
Geometric solution
3. find the distance to the origin, d2=O2-t2
if s2=r2-d2<0 return false;
t
rrd
O
s
Geometric solution
4. calculate intersection distance, if (origin outside) then t-s else t+s
t
rd
O
s
t
r
d
O
s
Sphere
• Have to test sphere intersection against clipping parameters
• Fill in information for DifferentialGeometry– Position– Parameterization (u,v)– Parametric derivatives– Surface normal– Derivatives of normals– Pointer to shape
Partial sphere
u=ψ/ψmax
v=(θ-θmin)/ (θmax-θmin)
• Partial derivatives (pp103 of textbook)
• Area (pp107)
)0,,( maxmax xyu
p
)sin,sin,cos)(( minmax rzzv
p
)( minmaxmax zzrA
Cylinder
max ucosrx sinry
)( minmaxmin zzvzz
Cylinder
Cylinder (intersection)
222 ryx
222 rtdotdo yyxx
02 CBtAt
22yx ddA
)(2 yyxx ododB 222 rooC yx
Disk
max ucos))1(( vrrvx i
hz
sin))1(( vrrvy i
Disk
Disk (intersection)
h-Oz
h
t
Dz Dzz Oh
t
D
D
)( zz
OhD
Dt
z
z
D
Oh
D
tt
'
Other quadrics
0)( 222
hzr
hy
r
hx
conehyperboloidparaboloid
1222 zyx02
2
2
2
zr
hy
r
hx
Triangle mesh
The most commonly used shape. In pbrt, it can be supplied by users or tessellated from other shapes. Some ray tracers only support triangle meshes.
Triangle mesh
class TriangleMesh : public Shape {… int ntris, nverts; int *vertexIndex; Point *p; Normal *n; per vertex Vector *s; tangent float *uvs; parameters}
x,y,z x,y,z x,y,z x,y,z x,y,z…
vi[3*i]
vi[3*i+1]
vi[3*i+2]
p
Note that p is stored in world space to save transformations. n and s are in object space.
Triangle mesh
Pbrt calls Refine() when it encounters a shape that is not intersectable. (usually, refine is done in acceleration structure creation)
Void TriangleMesh::Refine(vector<Reference<Shape>>
&refined)
{
for (int i = 0; i < ntris; ++i)
refined.push_back(new Triangle(ObjectToWorld,
reverseOrientation, (TriangleMesh *)this, i));
}Triangle only stores a pointer to mesh and an index.
1. Intersect ray with plane2. Check if point is inside triangle
Ray triangle intersection
Algebraic Method
0:
: 0
dNPPlane
tVPPRay
Substituting for P, we get:
00 dNtVP
Solution:
NV
dNPt
0
tVPP 0
Ray plane intersection
Algebraic Method
FALSEreturn
dNPif
NPd
NNormalize
VVN
PTV
PTV
011
101
1
211
022
011
For each side of triangle:
end
Ray triangle intersection I
Parametric Method
triangleinsideisPthen
and
andif
TTTTP
Compute
0.1
0.10.00.10.0
:,
1312
Ray triangle intersection II
Ray triangle intersection III
Fast minimum storage intersection
210)1( vVuVVvutDO 1 and 0, vuvu
00201 VO
v
u
t
VVVVD
a point on the ray
a point inside the triangle
Fast minimum storage intersection
00201 VO
v
u
t
VVVVD
O
D
V0
V1
V2O
D
V0
V1
V2 1
1
Fast minimum storage intersection
011 VVE 022 VVE 0VOT
00201 VO
v
u
t
VVVVD
T
v
u
t
EED
21
Fast minimum storage intersection• Cramer’s rule
TED
ETD
EET
EEDv
u
t
,,
,,
,,
,,
1
1
2
21
21
T
v
u
t
EED
21
ABCBCACBA )()(,,
Fast minimum storage intersection
2EDP 1ETQ
DQ
TP
EQ
EPv
u
t 2
1
1
TED
ETD
EET
EEDv
u
t
,,
,,
,,
,,
1
1
2
21
21
Triangle
P0
(u0, v0)P1
(u1, v1)
P2
(u2, v2)
v
pv
u
pupp iii
0
32
31
3232
3131
pp
pp
vp
up
vvuu
vvuu
32
31
1
3232
3131
pp
pp
vvuu
vvuu
vp
up
P(u,v)
Shading geometry
if (!mesh->n && !mesh->s) {
*dgShading = dg;
return;
}
// compute Barycentric coordinate
1210
221100
221100
bbb
vbvbvbv
ubububu
0
0
2
1
0201
0201
vv
uu
b
b
vvvv
uuuu
Shading geometry Normal ns; Vector ss, ts;if (mesh->n)
ns = Normalize(obj2world( b[0] * mesh->n[v[0]] + b[1] * mesh->n[v[1]] + b[2] * mesh->n[v[2]])); else ns = dg.nn; if (mesh->s) ss = Normalize(obj2world( b[0] * mesh->s[v[0]] + b[1] * mesh->s[v[1]] + b[2] * mesh->s[v[2]])); else ss = Normalize(dg.dpdu);