1 of 217

Half Edges and Ray Tracing

Computer Graphics and Imaging

UC Berkeley CS 184/284A

Discussion 07

2 of 217

Worksheet 6 link!

https://tinyurl.com/quarteredge

3 of 217

Have you guys seen subdivision memes

https://youtu.be/ipvwpJusp2Y?si=17m_ZbZzMa2FXM1e

4 of 217

Week 7 Announcements

alarmASSIGNMENT

Homework 2

Deadline

Code / write-up:

Friday (10/08)!

scheduleLOCATION & TIMES

Office Hours / HW Party

@ Cory 531!

  • Kevin: M 12-2pm
  • Stephane: Tu 10-12am
  • Yoko: W 3-5pm
  • Joshua: Th 11am-1pm

Snacks provided so come hangout / lock-in together!

groupsCOLLABORATION

Exam 1

  • 10/12 (M) ~ 10/16 (F)
  • Take-home / openbook!
  • Review Session:
    • Today @ 6-8pm
    • Cory 521

Ed #94 [Exam 1] Logistics

5 of 217

Disc 6 Review!

6 of 217

Review Discussion

1. Cubic Hermite Interpolation

  • What does it do? When it is useful?
  • What are two information needed?
  • How do we compute it?

2. Catmull-Rom Interpolation

  • How do we get the slope in Catmull-Rom?
  • What are C0, C1, C2 continuity?

3. de Casteljau’s algorithm

  • How do we find Bezier curve of given control points =>
  • What is the degree of polynomial resulted from de Casteljau algorithm on n control points?

7 of 217

Half-Edges

8 of 217

Half-Edge Background

Preferred way to represent 3D shapes: Meshes

Many ways to represent meshes:

  • List of triangles
  • List of points + indexed triangle
  • Triangle neighbor

​

Downsides: hard to edit, store redundant data, hard to navigate

8

9 of 217

The Half-Edge Data Structure

​

struct Halfedge {

Halfedge *twin,

Halfedge *next;

Vertex *vertex;

Edge *edge;

Face *face;

}

​

struct Vertex {

Point pt;

Halfedge *halfedge;

}

​

struct Edge {

Halfedge *halfedge;

}

​

struct Face {

Halfedge *halfedge;

}

Key idea: two half edges act as “glue” between mesh elements

Each vertex, edge, and face points to one of its half edges

next

halfedge

next

Face

twin

edge

vertex

10 of 217

The Half-Edge Data Structure

​

struct Halfedge {

Halfedge *twin,

Halfedge *next;

Vertex *vertex;

Edge *edge;

Face *face;

}

​

struct Vertex {

Point pt;

Halfedge *halfedge;

}

​

struct Edge {

Halfedge *halfedge;

}

​

struct Face {

Halfedge *halfedge;

}

​

Key idea: two half edges act as “glue” between mesh elements

Each vertex, edge, and face points to one of its half edges

next

halfedge

next

Face

twin

edge

vertex

11 of 217

The Half-Edge Data Structure

​

struct Halfedge {

Halfedge *twin,

Halfedge *next;

Vertex *vertex;

Edge *edge;

Face *face;

}

​

struct Vertex {

Point pt;

Halfedge *halfedge;

}

​

struct Edge {

Halfedge *halfedge;

}

​

struct Face {

Halfedge *halfedge;

}

Key idea: two half edges act as “glue” between mesh elements

Each vertex, edge, and face points to one of its half edges

next

halfedge

next

Face

twin

edge

vertex

12 of 217

The Half-Edge Data Structure

​

struct Halfedge {

Halfedge *twin,

Halfedge *next;

Vertex *vertex;

Edge *edge;

Face *face;

}

​

struct Vertex {

Point pt;

Halfedge *halfedge;

}

​

struct Edge {

Halfedge *halfedge;

}

​

struct Face {

Halfedge *halfedge;

}

​

Key idea: two half edges act as “glue” between mesh elements

Each vertex, edge, and face points to one of its half edges

next

halfedge

next

Face

twin

edge

vertex

13 of 217

The Half-Edge Data Structure & Mesh Traversal

Halfedge *h = f->halfedge;

do {

process(h->vertex);

h = h->next;

} while (h != f->halfedge);

​

Use twin and next pointers to move around the mesh

You can process vertex, edge, and/or face pointers

Example 1: Process all vertices of a face

​

next

halfedge

next

Face

14 of 217

Mesh Traversal

  • Use twin and next pointers to move around the mesh.

halfedge

next

twin

edge

15 of 217

Mesh Traversal

  • Use twin and next pointers to move around the mesh.
  • h->next() to access the halfedge ahead of h.

​

halfedge

next

edge

twin

16 of 217

Mesh Traversal

  • Use twin and next pointers to move around the mesh.
  • h->next() to access the halfedge ahead of h, going counterclockwise.
  • h->twin() to access the halfedge that shares an edge with h.

halfedge

next

twin

edge

17 of 217

Note: We denote e.g. a pointer to an Edge by EdgeIter. So the following initialization is valid, given EdgeIter e:

​

HalfedgeIter h = e→halfedge();

​

​

18 of 217

std::vector<EdgeIter> getOppositeEdges(VertexIter v)

{

std::vector<EdgeIter> edges;

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

do {

edges.push_back(h->next()->edge());

h = h->next()->next()->twin();

} while (h != start_h);

return edges;

}

19 of 217

std::vector<EdgeIter> getOppositeEdges(VertexIter v)

{

std::vector<EdgeIter> edges;

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

do {

edges.push_back(h->next()->edge());

h = h->next()->next()->twin();

} while (h != start_h);

return edges;

}

20 of 217

std::vector<EdgeIter> getOppositeEdges(VertexIter v)

{

std::vector<EdgeIter> edges;

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

do {

edges.push_back(h->next()->edge());

h = h->next()->next()->twin();

} while (h != start_h);

return edges;

}

21 of 217

std::vector<EdgeIter> getOppositeEdges(VertexIter v)

{

std::vector<EdgeIter> edges;

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

do {

edges.push_back(h->next()->edge());

h = h->next()->next()->twin();

} while (h != start_h);

return edges;

}

22 of 217

std::vector<EdgeIter> getOppositeEdges(VertexIter v)

{

std::vector<EdgeIter> edges;

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

do {

edges.push_back(h->next()->edge());

h = h->next()->next()->twin();

} while (h != start_h);

return edges;

}

23 of 217

std::vector<EdgeIter> getOppositeEdges(VertexIter v)

{

std::vector<EdgeIter> edges;

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

do {

edges.push_back(h->next()->edge());

h = h->next()->next()->twin();

} while (h != start_h);

return edges;

}

24 of 217

25 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

26 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

27 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

28 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

29 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

30 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

31 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

32 of 217

void diffuse(VertexIter v, float k)

{

Vector3D L(0, 0, 0);

HalfedgeIter h = v->halfedge();

HalfedgeIter start_h = h;

int n = 0;

do {

VertexIter v_j = h->next()->vertex();

Vector3D dir = v_j->position() - v->position();

L = L + dir;

n++;

h = h->twin()->next()

} while (h != start_h);

v->position() = v->position() + k * L / n;

}

33 of 217

Local Operations

34 of 217

Local Operations - Edge Flip

34

a

b

d

c

Triangles (a, b, c), (b, d, c) become (a, d, c), (a, b, d):

  • Long list of pointer reassignments
  • However, no elements need to be created or destroyed

flip

35 of 217

Local Operations - Edge Flip

35

a

b

d

c

c

a

b

d

Triangles (a, b, c), (b, d, c) become (a, d, c), (a, b, d):

  • Long list of pointer reassignments
  • However, no elements need to be created or destroyed

flip

36 of 217

Local Operations - Edge Split

36

a

b

d

c

Insert midpoint m of edge (c, b), connect to get four triangles:

  • This time, you have to add elements
  • Again, there are a lot of pointer reassignments you’ll have to make!

split

37 of 217

Local Operations - Edge Split

37

a

b

d

c

c

a

b

d

Insert midpoint m of edge (c, b), connect to get four triangles:

  • This time, you have to add elements
  • Again, there are a lot of pointer reassignments you’ll have to make!

split

m

38 of 217

Local Operations - Edge Collapse

38

Replace edge (c, d) with a single vertex m:

  • This time, you have to delete elements
  • Again, there are a lot of pointer reassignments you’ll have to make!

collapse

a

b

c

d

a

b

c

d

39 of 217

Local Operations - Edge Collapse

39

Replace edge (c, d) with a single vertex m:

  • This time, you have to delete elements
  • Again, there are a lot of pointer reassignments you’ll have to make!

collapse

a

b

c

d

a

b

c

d

c

d

40 of 217

Local Operations - Edge Collapse

40

Replace edge (c, d) with a single vertex m:

  • This time, you have to delete elements
  • Again, there are a lot of pointer reassignments you’ll have to make!

collapse

a

b

c

d

a

b

d

m

41 of 217

41

a

b

c

d

42 of 217

42

a

b

c

d

43 of 217

43

a

b

m

44 of 217

Local Operations

a

b

d

c

flip

c

a

b

d

split

c

a

b

d

m

a

b

d

c

a

b

c

d

b

c

d

c

d

collapse

d

m

45 of 217

46 of 217

47 of 217

e0

48 of 217

e0

any of e0, e10, e11

49 of 217

e0

any of e0, e10, e11

any of e0, e9, e12, e16

50 of 217

e0

f4, e3->next() = e12

any of e0, e10, e11

any of e0, e9, e12, e16

51 of 217

e0

V0

any of e0, e10, e11

any of e0, e9, e12, e16

f4, e3->next() = e12

52 of 217

e0

V0

any of e0, e10, e11

any of e0, e9, e12, e16

either of e6, e10

f4, e3->next() = e12

53 of 217

e0

any of e0, e10, e11

any of e0, e9, e12, e16

V0

either of e6, e10

e13->next() = e3

f4->halfedge() = any of e3, e12, e13

e0->face() = f3

e0->next() = e10

V3->halfedge() = either of e3, e14

f4, e3->next() = e12

54 of 217

Subdivision

55 of 217

Subdivision Motivation

  • It’s expensive to create smooth meshes by hand.
  • Instead…
    1. Start with control cage — a coarse mesh.
    2. Smooth algorithmically.

​

55

56 of 217

Subdivision Motivation

  • It’s expensive to create smooth meshes by hand.
  • Instead…
    1. Start with control cage — a coarse mesh.
    2. Smooth algorithmically.
  • Techniques:
    • Loop subdivision → triangular meshes.
    • Catmull-Rom subdivision → quad meshes.

56

57 of 217

Loop Subdivision

  1. Split each triangle face into four → new triangles, new vertices!

57

58 of 217

Loop Subdivision

  1. Split each triangle face into four → new triangles, new vertices!
  2. Update old and new vertex positions as weighted sum.

1/8

3/8

3/8

1/8

New vertices

Old vertices

u

u

u

u

u

u

1 - n*u

n: vertex degree

u: 3/16 if n = 3, 3/(8n) otherwise

59 of 217

Loop Subdivision

59

Example: degree 6

1/16

1/16

1/16

1/16

1/16

1/16

10/16

60 of 217

Loop Subdivision Example

61 of 217

Loop Subdivision Example

61

62 of 217

Worksheet Question 2

63 of 217

A

B

C

D

E

F

G

64 of 217

65 of 217

66 of 217

67 of 217

68 of 217

69 of 217

70 of 217

This result depends on the order that edges are processed in! ��Do you see why?

71 of 217

This result depends on the order that edges are processed in! ��Do you see why?

For any new edge that connects new vertex to old vertex…

72 of 217

This result depends on the order that edges are processed in! ��Do you see why?

For any new edge that connects new vertex to old vertex…

​

Edge flip!

73 of 217

This result depends on the order that edges are processed in! ��Do you see why?

For any new edge that connects new vertex to old vertex…

​

Edge flip!

This completes the face splitting procedure.

74 of 217

<= hint

75 of 217

76 of 217

77 of 217

78 of 217

The position of a new vertex unchanged if and only if the midpoint of the opposite vertices A and C lies at the exact same location as the midpoint of edge BD (i.e., when $A, B, C, D$ form a parallelogram)

​

Proof:

​

Set V_new = midpoint of BD

79 of 217

Hint:

80 of 217

Loop Subdivision

  • Split each triangle face into four → new triangles, new vertices!
  • Update old and new vertex positions as weighted sum.

1/8

3/8

3/8

1/8

New vertices

Old vertices

u

u

u

u

u

u

1 - n*u

n: vertex degree

u: 3/16 if n = 3, 3/(8n) otherwise

81 of 217

Hint:

Since n = 5,

weight u = 3/8n = 3/40

​

So v’_old = (1 - 5 * (3/40)) * (4, 2, 0) + (3/40) * (25, 15, 0)

=

82 of 217

83 of 217

Solution:

towards the centroid (average position) of its 1-ring neighboring vertices

84 of 217

Slide link!

https://tinyurl.com/4ns3tdab

D7 Attendance!

https://tinyurl.com/4p3xcpsx

Attendance Code:

85 of 217

86 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

​

​

Procedure:

  1. Add vertex in each face
  2. Add midpoint to each edge
  3. Connect all new vertices
  4. Adjust vertex positions to weighted average

86

87 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

  1. Add face point:

For each face, add a face point and set its position to be the average of all original points in the same face.

​

87

88 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

2. Add edge point:

For each edge, add an edge point and set its position to be the average of 2 neighboring face points (AF) and the midpoint of the edge (ME).

​

88

89 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

3. Move original vertices:

For each original vertex (P), take the average (F) of all n neighboring face points, and the average (R) of all n midpoints on neighboring edges (Note: edge midpoint is not the same as edge point! )

Move each vertex to

​

89

90 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

​

4. Form new edges and faces:

Connect each new face point to the new edge points of all original edges defining the original face

​

90

91 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

​

4. Form new edges and faces:

Connect each new vertex point to the new edge points of all original edges incident on the original vertex

​

91

92 of 217

Catmull-Clark Subdivision

Designed for meshes with variable polygons (triangles/quadrilaterals/pentagons)

​

4. Form new edges and faces:

Define new faces as enclosed by the new edges.

​

92

93 of 217

Catmull-Clark Subdivision Example

93

94 of 217

95 of 217

Ray Tracing Basics

96 of 217

Ray Equation

r(t) = o + td

  • Where o is the position of the origin.
  • d is the direction of the ray.
  • t is time, and is ≥ 0.

97 of 217

98 of 217

99 of 217

Ray Tracing

100 of 217

Ray Tracing

101 of 217

102 of 217

103 of 217

104 of 217

105 of 217

106 of 217

Bonus Question!

How would you check if an intersection is inside a triangle?

107 of 217

Bonus Question!

How would you check if an intersection is inside a triangle?

108 of 217

109 of 217

Try placing the ray in this diagram to get intuition

110 of 217

Try placing the ray in this diagram to get intuition

111 of 217

112 of 217

113 of 217

114 of 217

Ray Triangle Intersection

115 of 217

Last week: Ray-Plane Intersection

116 of 217

Ray Triangle Intersection

But meshes are made of triangles, so we need ray-triangle intersection!

116

Last week:

117 of 217

Ray Triangle Intersection

118 of 217

Ray Triangle Intersection Derivation

118

119 of 217

120 of 217

121 of 217

122 of 217

123 of 217

124 of 217

125 of 217

126 of 217

Acceleration Structures

127 of 217

Acceleration Structures Motivation

  • Meshes can be made of hundreds of thousands of triangles.
  • We sample at least one ray per pixel. (Imagine a 4K = 3840x2160 TV.)
  • Calculating intersections can quickly get expensive!

127

128 of 217

Sneak Peek

In the next assignment, you will be able to render images like these!

128

129 of 217

Idea: Bounding Volume Hierarchy

Internal nodes:

  1. Bounding box.
  2. Reference to children.

129

130 of 217

Idea: Bounding Volume Hierarchy

Internal nodes:

  1. Bounding box.
  2. Reference to children.

130

Leaf nodes:

  1. Bounding box.
  2. List of primitives in the box.

131 of 217

Worksheet Question 2

132 of 217

132

133 of 217

133

split this side

134 of 217

134

split this side

135 of 217

135

There are 2 valid splits!

136 of 217

136

We’ll just consider this one.

137 of 217

137

138 of 217

138

  • It’s fine if these bounding boxes intersect!
  • Key idea: we have partitioned objects into disjoint sets.

139 of 217

139

140 of 217

140

141 of 217

141

142 of 217

142

143 of 217

143

144 of 217

Using a Bounding Volume Hierarchy

144

145 of 217

Using a Bounding Volume Hierarchy

145

146 of 217

Using a Bounding Volume Hierarchy

146

147 of 217

Using a Bounding Volume Hierarchy

147

148 of 217

Using a Bounding Volume Hierarchy

148

149 of 217

Using a Bounding Volume Hierarchy

149

150 of 217

Using a Bounding Volume Hierarchy

150

151 of 217

Using a Bounding Volume Hierarchy

151

152 of 217

Using a Bounding Volume Hierarchy

152

153 of 217

Using a Bounding Volume Hierarchy

153

154 of 217

Using a Bounding Volume Hierarchy

154

155 of 217

Using a Bounding Volume Hierarchy

155

156 of 217

Using a Bounding Volume Hierarchy

156

157 of 217

158 of 217

2.2. Using a Bounding Volume Hierarchy

158

Hint: Axis-aligned ray-plane intersection equation

159 of 217

2.2. Using a Bounding Volume Hierarchy

159

160 of 217

2.2. Using a Bounding Volume Hierarchy

160

161 of 217

2.2. Using a Bounding Volume Hierarchy

161

162 of 217

Radiometry & Photometry

163 of 217

Radiometry

Flux (Power) is measured in Watts.

164 of 217

Radiometry

Flux (Power) is measured in Watts.

Radiant intensity is flux per solid angle.

165 of 217

Radiometry

Flux (Power) is measured in Watts.

Radiant intensity is flux per solid angle.

Radiance is flux per area per solid angle.

​

AKA brightness!

166 of 217

Radiometry

Flux (Power) is measured in Watts.

Radiant intensity is flux per solid angle.

Irradiance is flux per area.

Radiance is flux per area per solid angle.

​

AKA brightness!

167 of 217

Radiant flux is energy received per time. Watts.

168 of 217

Radiant (luminous) flux is energy received per time. Watts (lumens).

Photometry mirrors radiometry but adjusts for human vision.

169 of 217

Radiant (luminous) intensity is flux per solid angle. W/sr (candela).

Radiant (luminous) flux is energy received per time. Watts (lumens).

Photometry mirrors radiometry but adjusts for human vision.

170 of 217

Radiant (luminous) intensity is flux per solid angle. W/sr (candela).

Radiant (luminous) flux is energy received per time. Watts (lumens).

Radiance is flux per area per solid angle. W/(sr m2) (nit).

Photometry mirrors radiometry but adjusts for human vision.

171 of 217

Radiant (luminous) intensity is flux per solid angle. W/sr (candela).

Irradiance is flux per area.

W/m2 (lux).

Radiant (luminous) flux is energy received per time. Watts (lumens).

Radiance is flux per area per solid angle. W/(sr m2) (nit).

Photometry mirrors radiometry but adjusts for human vision.

172 of 217

Radiant (luminous) intensity is flux per solid angle. W/sr (candela).

Irradiance is flux per area.

W/m2 (lux).

Radiant (luminous) flux is energy received per time. Watts (lumens).

n

l

θ

Lambert’s cosine law

Radiance is flux per area per solid angle. W/(sr m2) (nit).

Photometry mirrors radiometry but adjusts for human vision.

173 of 217

3.1. Radiometry Definitions and Relations

173

174 of 217

3.1. Radiometry Definitions and Relations

174

175 of 217

3.1. Radiometry Definitions and Relations

176 of 217

3.1. Radiometry Definitions and Relations

177 of 217

177

178 of 217

Solid Angle

178

179 of 217

Solid Angle

179

180 of 217

Solid Angle

180

Approximate dA as a rectangle!

181 of 217

Solid Angle

181

How do we approximate?

182 of 217

Solid Angle

182

How do we approximate?

183 of 217

Solid Angle

183

How do we approximate?

θ

dθ

r

r dθ

184 of 217

Solid Angle

184

How do we approximate?

185 of 217

Solid Angle

185

How do we approximate?

186 of 217

Solid Angle

186

How do we approximate?

φ

dφ

r sin θ

r sin θ dφ

187 of 217

Solid Angle

187

188 of 217

Worksheet Question 4.1

189 of 217

4 Shedding Some Light

189

190 of 217

4 Shedding Some Light

190

191 of 217

3.2. Solid Angle

191

Approximate this value

as a rectangle.

​

Recall the arclength of a circle: L = r · 𝜃

What’s the radius of this circle?

What’s the radius of this circle?

192 of 217

3.2. Solid Angle

192

193 of 217

193

194 of 217

194

195 of 217

195

196 of 217

Lambert’s Cosine Law

197 of 217

197

Definition: The radiance (luminance) is the power emitted by a surface, per unit solid angle, per unit projected area.

198 of 217

199 of 217

199

Light Emitted By A Surface

“Surface Radiance”

200 of 217

Units Summary

201 of 217

Units Summary

202 of 217

Units Summary

203 of 217

203

A scales as R2, so E(x) decreases as R increases.

204 of 217

Units Summary

205 of 217

Units Summary

206 of 217

Worksheet Question 4.2

207 of 217

4.2 Irradiance Calculation

207

208 of 217

4.2 Irradiance Calculation

208

Irradiance is power/area:

2πr2

Φ

cos(Ө)

209 of 217

4.2 Irradiance Calculation

209

Irradiance is power/area:

What do we know?

​

2πr2

Φ

cos(Ө)

210 of 217

4.2 Irradiance Calculation

210

Irradiance is power/area:

What do we know?

Φ = 100 W

​

What do we not know?

​

2πr2

Φ

cos(Ө)

211 of 217

4.2 Irradiance Calculation

211

Irradiance is power/area:

What do we know?

Φ = 100 W

​

What do we not know?

r, Ө

2πr2

Φ

cos(Ө)

212 of 217

4.2 Irradiance Calculation

212

Irradiance is power/area:

Use the Pythagorean Theorem

r = (62 + 82)½ = 10

This is r !

2πr2

Φ

cos(Ө)

213 of 217

4.2 Irradiance Calculation

213

=

Irradiance is power/area:

Cosine angle between surface normal and the light position is given by the dot product of normalized vectors:

cos(Ө) = (6, 0, 8)/10 · (1, 1, 1)/√3

10√3

14

2πr2

Φ

cos(Ө)

normal

Ө

214 of 217

4.2 Irradiance Calculation

214

=

Irradiance is power/area:

E =

2πr2

Φ

cos(Ө)

2πr2

Φ

cos(Ө)

2π(10)2

100

10√3

14

W/m2

=

10π√3

7

W/m2

215 of 217

215

1

Light Source

Surface 1:

Irradiance = E

Solid Angle = w

Surface 2:

Irradiance = E / r2

Solid Angle = w / r2

r

How does radiance change with distance?

​

Hint:�

1. The light source emits uniform flux.��2. With irradiance E and solid angle w at surface 1, what are these values at the surface 2?

216 of 217

216

1

Light Source

Surface 1:

Irradiance = E

Solid Angle = w

Surface 2:

Irradiance = E / r2

Solid Angle = w / r2

r

Since L = dE / dw (cos θ = 1 here), the radiance at the two surfaces is the same.

​

Radiance does not change with distance.

217 of 217

217