My favorites
|
Sign in
barteksplayground
Misc project from Bartek Drozdz [www.everydayflash.com]
Project Home
Downloads
Source
Checkout
|
Browse
|
Changes
|
‹r7
r29
Source path:
svn
/
trunk
/
src
/
com
/
everydayflash
/
away3d
/
earth
/
EarthDemo.as
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
package com.everydayflash.away3d.earth {
import away3d.containers.View3D;
import away3d.primitives.RegularPolygon;
import away3d.primitives.Skybox;
import flash.display.Bitmap;
import flash.filters.GlowFilter;
import away3d.primitives.Sphere;
import away3d.primitives.Cube;
import away3d.lights.PointLight3D;
import away3d.materials.ColorMaterial;
import away3d.materials.BitmapMaterial;
import away3d.materials.WhiteShadingBitmapMaterial;
import away3d.core.math.Number3D;
import away3d.core.base.Object3D;
import away3d.core.base.Mesh;
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display.BitmapData;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.StageQuality;
public class EarthDemo extends Sprite {
private var view:View3D;
private var starField:Skybox;
private var earth:Sphere;
private var sun:Mesh;
private var moon:Sphere;
private var sunLight:PointLight3D;
private var instruction:Instruction;
private var earthRotation:Number = Math.PI;
private var moonDistance:Number = 400;
private var moonEllipse:Number = 5;
private var CAM_Y_BASE:Number;
private var CAM_X_BASE:Number;
private var mouseMultiplier:Number = -50;
private var mouseEasing:Number = .2;
private var simulationRate:Number = 1;
private var cameraLocations:Array;
private var cameraLocIndex:int = -1;
private var paused:Boolean = false;
private var simRateAcc:Number = 0;
[Embed(source = "../../../../../../as3/away/assets/earth-map-640x320-small.jpg")]
private var Earth:Class;
[Embed(source = "../../../../../../as3/away/assets/moon-125x63.jpg")]
private var Moon:Class;
[Embed(source = "../../../../../../as3/away/assets/stars.png")]
private var Stars:Class;
/**
* Document class for the away3d demo presented here:
* http://www.everydayflash.com/blog/index.php/2008/04/26/light-shading-away3d/
*
* Check the downloads section for a ZIP containg this class and the assest used (see above)
* http://code.google.com/p/barteksplayground/downloads/list
*
* @author Bartek Drozdz [www.everydayflash.com]
*
* NOTE: Compiled with Away3D rev. 494, lighting doesn't work with newer versions.
*/
public function EarthDemo() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.LOW;
init();
instruction = new Instruction();
addChild(instruction);
cameraLocations = new Array();
cameraLocations.push({ loc:new Number3D(-400, 0, 1500), lookAt:new Number3D(400, 0, 0), attachTo:null, name:"side" });
cameraLocations.push({ loc:new Number3D(1800, 0, -1000), lookAt:new Number3D(0, 0, 0), attachTo:null, name:"sun perspective" });
cameraLocations.push( { loc:new Number3D(160, 0, 0), lookAt:new Number3D(0, 0, 0), attachTo:earth, name:"earth perspective" } );
cameraLocations.push( { loc:new Number3D(0, 0, 0), lookAt:new Number3D(0, 0, 0), attachTo:moon, name:"moon perspective" } );
cameraLocations.push( { loc:new Number3D(-1800, 0, 1500), lookAt:new Number3D(0, 0, 0), attachTo:null, name:"behind" } );
cameraLocations.push( { loc:new Number3D(1200, 5000, -600), lookAt:new Number3D(1200, 0, -600), attachTo:null, name:"top" } );
changeCameraLocation();
addEventListener(Event.ENTER_FRAME, render);
addEventListener(MouseEvent.MOUSE_WHEEL, zoom);
addEventListener(MouseEvent.MOUSE_UP, changeCameraLocation);
stage.addEventListener(Event.RESIZE, updateView);
stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
}
private function init():void {
// View
view = new View3D();
view.x = stage.stageWidth / 2;
view.y = stage.stageHeight / 2;
addChild(view);
// Light
sunLight = new PointLight3D( { x:1200, y:0, z: -600, brightness:5, ambient:30, diffuse:500, specular:180 } );
view.scene.addChild(sunLight);
// Sun
var sunMat:ColorMaterial = new ColorMaterial(0xffffff);
sun = new RegularPolygon( { material:sunMat, radius:100, sides:32, x:2400, y:0, z: -1200 } );
sun.rotationZ = 90;
view.scene.addChild(sun);
sun.ownCanvas = true;
sun.filters = [new GlowFilter(0xffffbe, 1, 12, 12, 3, 3, false, false), new GlowFilter(0xffffbe, 1, 12, 12, 3, 3, true, false)];
// Earth
var earthBmp:Bitmap = new Earth() as Bitmap;
var earthMat:WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial(earthBmp.bitmapData);
earthMat.ambient_brightness = 2;
earthMat.diffuse_brightness = 1.7;
earthMat.specular_brightness = 0;
earth = new Sphere( { material:earthMat, radius:150, segmentsW:32, segmentsH:18, y:0, x:0, z:0 } );
earth.rotationZ = -8;
view.scene.addChild(earth);
// Moon
var moonBmp:Bitmap = new Moon() as Bitmap;
var moonMat:WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial(moonBmp.bitmapData);
moonMat.ambient_brightness = 0;
moonMat.diffuse_brightness = 1.2;
moonMat.specular_brightness = 0;
moon = new Sphere( { material:moonMat, radius:16, segmentsW:24, segmentsH:12, y:0, x:moonDistance, z:moonDistance } );
view.scene.addChild(moon);
var starBmp:Bitmap = new Stars() as Bitmap;
var starFieldMat:BitmapMaterial = new BitmapMaterial(starBmp.bitmapData);
starField = new Skybox(starFieldMat, starFieldMat, starFieldMat, starFieldMat, starFieldMat, starFieldMat);
view.scene.addChild(starField);
sunLight.lookAt(new Number3D(0, 0, 0));
}
private function handleKeyDown(ke:KeyboardEvent):void {
switch (ke.keyCode) {
case 32:
paused = true;
break;
case Keyboard.LEFT:
case Keyboard.DOWN:
simRateAcc = -.1;
break;
case Keyboard.RIGHT:
case Keyboard.UP:
simRateAcc = .1;
break;
}
}
private function handleKeyUp(ke:KeyboardEvent):void {
paused = false;
simRateAcc = 0;
}
private function zoom(me:MouseEvent):void {
if (view.camera.zoom < 4 && me.delta < 1) return;
if (view.camera.zoom > 50 && me.delta > 1) return;
var nz:Number = me.delta / 10;
view.camera.zoom += nz;
}
private function changeCameraLocation(e:Event = null):void {
if (cameraLocIndex > -1 && cameraLocations[cameraLocIndex].attachTo != null)
cameraLocations[cameraLocIndex].attachTo.visible = true;
cameraLocIndex++;
if (cameraLocIndex == cameraLocations.length) cameraLocIndex = 0;
view.camera.position = cameraLocations[cameraLocIndex].loc;
if (cameraLocations[cameraLocIndex].lookAt != null) view.camera.lookAt(cameraLocations[cameraLocIndex].lookAt);
CAM_Y_BASE = view.camera.rotationY;
CAM_X_BASE = view.camera.rotationX;
view.camera.zoom = 10;
if (cameraLocations[cameraLocIndex].name == "top") {
sun.rotationZ = 0;
} else {
sun.rotationZ = 90;
}
instruction.setViewName(cameraLocations[cameraLocIndex].name);
}
private function updateView(e:Event):void {
view.x = stage.stageWidth / 2;
view.y = stage.stageHeight / 2;
}
private function render(event:Event):void {
if (paused) return;
if(simRateAcc != 0) {
simulationRate += simRateAcc;
if (simulationRate < .5) simulationRate = .5;
if (simulationRate > 20) simulationRate = 20;
}
earth.rotationY -= simulationRate;
moon.rotationY += simulationRate * 0.1;
moon.x = Math.cos(earthRotation) * moonDistance;
moon.z = Math.sin(earthRotation) * moonDistance;
moon.y = Math.sin(earthRotation) * moonEllipse;
earthRotation -= (simulationRate * 0.1) / 180 * Math.PI;
if(cameraLocations[cameraLocIndex].attachTo == null) {
var mx:Number = CAM_Y_BASE + (mouseX - stage.stageWidth / 2) / mouseMultiplier;
var my:Number = CAM_X_BASE + (mouseY - stage.stageHeight / 2) / mouseMultiplier;
var vx:Number = mx - view.camera.rotationY;
var vy:Number = my - view.camera.rotationX;
view.camera.rotationY += vx * mouseEasing;
view.camera.rotationX += vy * mouseEasing;
var fgw:Number = view.camera.rotationY;
var fgh:Number = view.camera.rotationX;
} else {
var att:Mesh = cameraLocations[cameraLocIndex].attachTo as Mesh;
att.visible = false;
view.camera.position = att.position;
if (att == moon) view.camera.lookAt(cameraLocations[cameraLocIndex].lookAt);
else if (att == earth) view.camera.rotationY = earth.rotationY * -1;
}
if (cameraLocations[cameraLocIndex].name == "top") {
sun.rotationX = 0;
} else {
var sx:Number = sun.x - view.camera.x;
var sz:Number = sun.z - view.camera.z;
var sa:Number = Math.atan2(sz, sx);
sun.rotationX = sa * 180 / Math.PI;
}
view.render();
}
}
}
Show details
Hide details
Change log
r14
by drojdjou on Aug 25, 2008
Diff
[No log message]
Go to:
...yflash/away3d/earth/EarthDemo.as
...m/everydayflash/pv3d/BlogLink.as
...com/everydayflash/pv3d/TopBar.as
...c/com/everydayflash/pv3d/blender
...dayflash/pv3d/blender/LadyDae.as
...erydayflash/pv3d/blender/nyc.jpg
...ayflash/pv3d/blender/pattern.gif
...ydayflash/pv3d/modifiers/Bend.as
...com/everydayflash/pv3d/precision
...h/pv3d/precision/CubeMaterial.as
.../pv3d/precision/PrecisionDemo.as
...om/everydayflash/util/Rotator.as
Project members,
sign in
to write a code review
Older revisions
r7
by drojdjou on May 19, 2008
Diff
[No log message]
All revisions of this file
File info
Size: 9252 bytes, 283 lines
View raw file
Hosted by