-
Notifications
You must be signed in to change notification settings - Fork 15
/
ofApp.cpp
115 lines (82 loc) · 3.37 KB
/
ofApp.cpp
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
// =============================================================================
//
// Copyright (c) 2010-2016 Christopher Baker <http://christopherbaker.net>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// =============================================================================
#include "ofApp.h"
void ofApp::setup()
{
ofEnableDepthTest();
london = ofxGeo::Coordinate(51.5085300, -0.1257400);
tokyo = ofxGeo::Coordinate(35.6148800, 139.5813000);
colorMap.load("color_map_1024.jpg");
earthSphere.set(ofxGeo::Utils::EARTH_RADIUS_KM, 24);
ofQuaternion quat;
quat.makeRotate(180, 0, 1, 0);
earthSphere.rotate(quat);
earthSphere.mapTexCoords(0,
colorMap.getTexture().getTextureData().tex_u,
colorMap.getTexture().getTextureData().tex_t,
0);
scaler = 300 / ofxGeo::Utils::EARTH_RADIUS_KM;
ofSetFrameRate(30);
ofEnableAlphaBlending();
ofNoFill();
cam.setPosition(0, 0, 0);
}
void ofApp::update()
{
}
void ofApp::draw()
{
ofBackground(0);
cam.begin();
ofPushMatrix();
ofScale(scaler, scaler, scaler);
ofQuaternion latRot;
ofQuaternion longRot;
ofQuaternion spinQuat;
ofxGeo::ElevatedCoordinate pos(london.getLatitude(), london.getLongitude(), 0);//(-87.6278, 41.8819, 0);
latRot.makeRotate(pos.getLatitude(), 1, 0, 0);
longRot.makeRotate(pos.getLongitude(), 0, 1, 0);
// spinQuat.makeRotate(ofGetFrameNum()/100, 0, 1, 0);
//our starting point is 0,0, on the surface of our sphere, this is where the meridian and equator meet
ofVec3f center = ofVec3f(0,0, pos.getElevation() / 1000 + ofxGeo::Utils::EARTH_RADIUS_KM);
//multiplying a quat with another quat combines their rotations into one quat
//multiplying a quat to a vector applies the quat's rotation to that vector
//so to to generate our point on the sphere, multiply all of our quaternions together then multiple the centery by the combined rotation
ofVec3f worldPoint = latRot * longRot * spinQuat * center;
ofFill();
ofSetColor(255, 0, 0, 127);
ofDrawCircle(worldPoint, 30);
ofNoFill();
ofSetColor(255, 0, 0, 255);
ofDrawCircle(worldPoint, 30);
ofSetColor(255);
colorMap.bind();
earthSphere.draw();
colorMap.unbind();
ofPopMatrix();
cam.end();
}
void ofApp::keyPressed(int key)
{
}