-
Notifications
You must be signed in to change notification settings - Fork 0
/
TrashCan.pov
104 lines (90 loc) · 3.13 KB
/
TrashCan.pov
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#version 3.7;
#include "colors.inc"
#include "shapes.inc"
#local debugMode = 0;
#if (debugMode)
global_settings {
assumed_gamma 1
charset utf8
}
#end
// ----------------------------------------
// Trash Can
// ----------------------------------------
#macro TrashCan(height, upperRadius, lowerRadius, thick, stripeWidth, numVerticalStripes, numHorizontalStripes)
#local deltaRadius = upperRadius - lowerRadius;
#local gridLength = sqrt(pow(height, 2) + pow(deltaRadius, 2));
#local gridAngle = atan2(deltaRadius, height);
#local gridAngleDeg = gridAngle * 180 / pi;
#local deltaTheta = 360 / numVerticalStripes;
#local baseX = 0;
#local baseY = 0;
#local baseZ = 0.005 - lowerRadius;
#local bottomHeightFrac = 1 / 5;
#local bottomHeight = height * bottomHeightFrac;
#local bodyHeightFrac = 1 - bottomHeightFrac;
#local bodyHeight = height - bottomHeight;
#local horizStripeInterval = bodyHeight / (numHorizontalStripes + 1);
#local baseUpperRadius = upperRadius * bottomHeightFrac + lowerRadius * bodyHeightFrac;
union {
torus {
upperRadius, thick/2
translate y * height
}
cone {
<0, 0, 0>, lowerRadius,
<0, bottomHeight, 0>, baseUpperRadius
}
#for (I, 0, numHorizontalStripes - 1)
#local stripeLowerY = (I + 1) * horizStripeInterval + bottomHeight;
#local stripeUpperY = stripeLowerY + stripeWidth;
#local lowerFrac = stripeLowerY / height;
#local upperFrac = stripeUpperY / height;
#local stripeLowerRadius = upperRadius * lowerFrac + lowerRadius * (1 - lowerFrac);
#local stripeUpperRadius = upperRadius * upperFrac + lowerRadius * (1 - upperFrac);
cone {
<0, stripeLowerY, 0>, stripeLowerRadius,
<0, stripeUpperY, 0>, stripeUpperRadius
open
}
#end
#for (I, 0, numVerticalStripes - 1)
#local currAngle = deltaTheta * I;
#local sinTheta = sin(currAngle * pi / 180);
#local cosTheta = cos(currAngle * pi / 180);
#local translX = cosTheta * baseX + sinTheta * baseZ;
#local translY = 0;
#local translZ = -sinTheta * baseX + cosTheta * baseZ;
box {
<-stripeWidth/2, 0, 0>
<stripeWidth/2, gridLength, 0>
rotate <-gridAngleDeg, 0, 0>
rotate <0, currAngle, 0>
translate <translX, translY, translZ>
}
#end
}
#end
// ----------------------------------------
// Scene
// ----------------------------------------
#if (debugMode)
camera {
location <0, 1, -1.5>
look_at <0, 0, 1>
}
background { White * 0.5 }
light_source { <-1, 2, -20> color White }
plane {
y, -1
texture {
pigment { checker rgb<0.3, 0.3, 0.3> White }
}
}
object {
TrashCan(0.8, 0.5, 0.4, 0.035, 0.02, 35, 4)
pigment { Orange }
//translate <0, -1, 1>
//translate <-0.8, 0, 2>
}
#end