Adjustments to follow mouse.
This commit is contained in:
		
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							@@ -1,4 +1,5 @@
 | 
				
			|||||||
a.out: *.cpp *.h camera/*.cpp camera/*.h
 | 
					a.out: *.cpp *.h camera/*.cpp camera/*.h
 | 
				
			||||||
	clang++ -std=c++17 -g -o a.out main.cpp \
 | 
						clang++ -std=c++14 -g -o a.out main.cpp \
 | 
				
			||||||
camera/Camera.cpp Track.cpp Xml.cpp \
 | 
					camera/Camera.cpp Track.cpp Xml.cpp \
 | 
				
			||||||
-lGL -lGLU -lglut -lstdc++fs
 | 
					-lGL -lGLU -lglut -lstdc++fs \
 | 
				
			||||||
 | 
					#-fsanitize=address -fno-omit-frame-pointer
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								Track.cpp
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								Track.cpp
									
									
									
									
									
								
							@@ -155,6 +155,16 @@ void draw(const Track &track)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Draw bike path
 | 
						// Draw bike path
 | 
				
			||||||
	glBegin(GL_LINE_STRIP);
 | 
						glBegin(GL_LINE_STRIP);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						srand((long long)(&track));
 | 
				
			||||||
 | 
						float r = rand() % 200 + 50;
 | 
				
			||||||
 | 
						float g = rand() % 200 + 50;
 | 
				
			||||||
 | 
						float b = rand() % 200 + 50;
 | 
				
			||||||
 | 
						r /= 255.0;
 | 
				
			||||||
 | 
						g /= 255.0;
 | 
				
			||||||
 | 
						b /= 255.0;
 | 
				
			||||||
 | 
						glColor3d(r, g, b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(auto p : track.points)
 | 
						for(auto p : track.points)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// auto val = (50 + (p.ele * 10)) / 180.0;
 | 
							// auto val = (50 + (p.ele * 10)) / 180.0;
 | 
				
			||||||
@@ -166,11 +176,11 @@ void draw(const Track &track)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// glColor3d(val, val, val);
 | 
							// glColor3d(val, val, val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		glColor3d(200, 200, 200);
 | 
							//glColor3d(200, 200, 200);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		glVertex3f(p.lat,
 | 
							glVertex3f(p.lat,
 | 
				
			||||||
		           p.ele,
 | 
							           p.ele,
 | 
				
			||||||
		           p.lon);
 | 
							           p.lon);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glEnd();
 | 
						glEnd();
 | 
				
			||||||
	glutPostRedisplay();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ void Camera::Refresh()
 | 
				
			|||||||
		          0.0,1.0,0.0); // up
 | 
							          0.0,1.0,0.0); // up
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		gluLookAt(m_x, m_y, m_z, // eye at
 | 
							gluLookAt(m_x, m_y, m_z, // eye at
 | 
				
			||||||
		          0.0f, 0.0f, 0.0f, // look at
 | 
							          2.0f, 0.0f, -4.0f, // look at
 | 
				
			||||||
		          0.0f, 1.0f, 0.0f); // up
 | 
							          0.0f, 1.0f, 0.0f); // up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// printf("Camera: %f %f %f Direction vector: %f %f %f\n", m_x, m_y, m_z, m_lx, m_ly, m_lz);
 | 
						// printf("Camera: %f %f %f Direction vector: %f %f %f\n", m_x, m_y, m_z, m_lx, m_ly, m_lz);
 | 
				
			||||||
@@ -45,7 +45,7 @@ void Camera::SetPos(float x, float y, float z)
 | 
				
			|||||||
	m_y = y;
 | 
						m_y = y;
 | 
				
			||||||
	m_z = z;
 | 
						m_z = z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::GetPos(float &x, float &y, float &z)
 | 
					void Camera::GetPos(float &x, float &y, float &z)
 | 
				
			||||||
@@ -73,7 +73,7 @@ void Camera::SetTarget(Target t, float x, float y, float z)
 | 
				
			|||||||
		t_z = z;
 | 
							t_z = z;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::Move(float incr)
 | 
					void Camera::Move(float incr)
 | 
				
			||||||
@@ -86,7 +86,7 @@ void Camera::Move(float incr)
 | 
				
			|||||||
	m_y = m_y + incr*ly;
 | 
						m_y = m_y + incr*ly;
 | 
				
			||||||
	m_z = m_z + incr*lz;
 | 
						m_z = m_z + incr*lz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::Strafe(float incr)
 | 
					void Camera::Strafe(float incr)
 | 
				
			||||||
@@ -94,21 +94,21 @@ void Camera::Strafe(float incr)
 | 
				
			|||||||
	m_x = m_x + incr*m_strafe_lx;
 | 
						m_x = m_x + incr*m_strafe_lx;
 | 
				
			||||||
	m_y = m_y + incr*m_strafe_ly;
 | 
						m_y = m_y + incr*m_strafe_ly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::Fly(float incr)
 | 
					void Camera::Fly(float incr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_y = m_y + incr;
 | 
						m_y = m_y + incr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::RotateYaw(float angle)
 | 
					void Camera::RotateYaw(float angle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_yaw += angle;
 | 
						m_yaw += angle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::RotatePitch(float angle)
 | 
					void Camera::RotatePitch(float angle)
 | 
				
			||||||
@@ -123,19 +123,19 @@ void Camera::RotatePitch(float angle)
 | 
				
			|||||||
	if(m_pitch > limit)
 | 
						if(m_pitch > limit)
 | 
				
			||||||
		m_pitch = limit;
 | 
							m_pitch = limit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::SetYaw(float angle)
 | 
					void Camera::SetYaw(float angle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_yaw = angle;
 | 
						m_yaw = angle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera::SetPitch(float angle)
 | 
					void Camera::SetPitch(float angle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_pitch = angle;
 | 
						m_pitch = angle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Refresh();
 | 
						// Refresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
#define __CAMERA_H__
 | 
					#define __CAMERA_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
Generic camera class by Nghia Ho
 | 
					  Generic camera class by Nghia Ho
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Camera
 | 
					class Camera
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										104
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								main.cpp
									
									
									
									
									
								
							@@ -18,6 +18,33 @@ GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};  /* Infinite light location. */
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Camera camera;
 | 
					Camera camera;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void (*passiveMouseFunc)(int x, int y) = [](int x, int y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static int last_x = x;
 | 
				
			||||||
 | 
						static int last_y = y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const int diff_x = x - last_x;
 | 
				
			||||||
 | 
						const int diff_y = y - last_y;
 | 
				
			||||||
 | 
						last_x = x;
 | 
				
			||||||
 | 
						last_y = y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const int distance = 5;
 | 
				
			||||||
 | 
						static float angle_horizontal = 0.0;
 | 
				
			||||||
 | 
						static float angle_vertical = 0.0;
 | 
				
			||||||
 | 
						angle_horizontal += diff_x / 100.0f;
 | 
				
			||||||
 | 
						angle_vertical += diff_y / 100.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						angle_horizontal = fmod(angle_horizontal, 6.283185);
 | 
				
			||||||
 | 
						angle_vertical = fmod(angle_vertical, 6.283185);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						float new_x = cos(angle_horizontal);
 | 
				
			||||||
 | 
						float new_y = sin(angle_vertical);
 | 
				
			||||||
 | 
						float new_z = sin(angle_horizontal);
 | 
				
			||||||
 | 
						camera.SetPos(distance * new_x,
 | 
				
			||||||
 | 
						              distance * 12.5 * new_y,
 | 
				
			||||||
 | 
						              distance * new_z);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO(dev):
 | 
					// TODO(dev):
 | 
				
			||||||
//  As per https://www.opengl.org/resources/libraries/glut/spec3/node11.html
 | 
					//  As per https://www.opengl.org/resources/libraries/glut/spec3/node11.html
 | 
				
			||||||
//  "Therefore, GLUT programs should not assume the window was created at the specified size or position.
 | 
					//  "Therefore, GLUT programs should not assume the window was created at the specified size or position.
 | 
				
			||||||
@@ -62,45 +89,40 @@ void display()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	glLineWidth(1.0f);
 | 
						glLineWidth(1.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						camera.SetTarget(Camera::Target::POINT); // center
 | 
				
			||||||
	//camera.RotateYaw(0.01);
 | 
						//camera.RotateYaw(0.01);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static double asdf = -10.0;
 | 
						// static int a = 0;
 | 
				
			||||||
	asdf += 0.02;
 | 
						// if(a < 400)
 | 
				
			||||||
	if(asdf > 15.0)
 | 
						// {
 | 
				
			||||||
		asdf = -15.0;
 | 
						// 	camera.RotatePitch(0.03f);
 | 
				
			||||||
	// gluLookAt(-15.0, 30.0, -asdf,  /* eye is at */
 | 
						// 	camera.RotateYaw(0.01f);
 | 
				
			||||||
	//           0.0, 5.0, 0.0,  /* center is at */
 | 
						// 	camera.Move(-0.1f);
 | 
				
			||||||
	//           0.0, 1.0, 0.0);    /* up is in positive Y direction */
 | 
						// 	if(++a == 200)
 | 
				
			||||||
 | 
						// 		camera.SetTarget(Camera::Target::POINT); // center
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
						// else if(a++ == 400) // ONCE
 | 
				
			||||||
 | 
						// {
 | 
				
			||||||
 | 
						// 	static float angle = 0;
 | 
				
			||||||
 | 
						// 	const int distance = 5;
 | 
				
			||||||
 | 
						// 	angle += 0.001f;
 | 
				
			||||||
 | 
						// 	angle = fmod(angle, 360.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static int a = 0;
 | 
						// 	float new_x = cos(angle);
 | 
				
			||||||
	if(a < 400)
 | 
						// 	float new_z = sin(angle);
 | 
				
			||||||
	{
 | 
						// 	camera.SetPos(distance * new_x + 2,
 | 
				
			||||||
		camera.RotatePitch(0.03f);
 | 
						// 	              distance * 12.5,
 | 
				
			||||||
		camera.RotateYaw(0.01f);
 | 
						// 	              distance * new_z - 4);
 | 
				
			||||||
		camera.Move(-0.1f);
 | 
						// }
 | 
				
			||||||
		if(++a == 200)
 | 
						camera.Refresh();
 | 
				
			||||||
			camera.SetTarget(Camera::Target::POINT); // center
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		static float angle = 0;
 | 
					 | 
				
			||||||
		const int distance = 50;
 | 
					 | 
				
			||||||
		angle += 0.01f;
 | 
					 | 
				
			||||||
		angle = fmod(angle, 360.0);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		float new_x = cos(angle);
 | 
						// draw_origin();
 | 
				
			||||||
		float new_z = sin(angle);
 | 
					 | 
				
			||||||
		camera.SetPos(distance * new_x,
 | 
					 | 
				
			||||||
		              distance,
 | 
					 | 
				
			||||||
		              distance * new_z);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	draw_origin();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// DRAW TRACKS:
 | 
						// DRAW TRACKS:
 | 
				
			||||||
	for(auto track : track_groups[random_group].second)
 | 
						for(auto track : track_groups[random_group].second)
 | 
				
			||||||
		draw(*track);
 | 
							draw(*track);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glutPostRedisplay();
 | 
				
			||||||
	glutSwapBuffers();
 | 
						glutSwapBuffers();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -119,13 +141,18 @@ void init()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* Setup the view of the cube. */
 | 
						/* Setup the view of the cube. */
 | 
				
			||||||
	glMatrixMode(GL_PROJECTION);
 | 
						glMatrixMode(GL_PROJECTION);
 | 
				
			||||||
	gluPerspective( /* field of view in degree */ 70.0,
 | 
						gluPerspective( /* field of view in degree */ 90.0,
 | 
				
			||||||
	                /* aspect ratio */ 1.0,
 | 
						                /* aspect ratio */ 1.0,
 | 
				
			||||||
	                /* Z near */ 1.0, /* Z far */ 1000.0);
 | 
						                /* Z near */ 1.0, /* Z far */ 1000.0);
 | 
				
			||||||
	glMatrixMode(GL_MODELVIEW);
 | 
						glMatrixMode(GL_MODELVIEW);
 | 
				
			||||||
	gluLookAt(-10.0, 25.0, -10.0,  /* eye is at */
 | 
						gluLookAt(-10.0, 25.0, -10.0,  /* eye is at */
 | 
				
			||||||
	          0.0, 0.0, 0.0,  /* center is at */
 | 
						          0.0, 0.0, 0.0,  /* center is at */
 | 
				
			||||||
	          0.0, 1.0, 0.0);    /* up is in positive Y direction */
 | 
						          0.0, 1.0, 0.0);    /* up is in positive Y direction */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						camera.SetTarget(Camera::Target::POINT); // center
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// handle mouse input
 | 
				
			||||||
 | 
						glutPassiveMotionFunc(passiveMouseFunc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
@@ -197,17 +224,17 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
				if(lat_overlap && lon_overlap)
 | 
									if(lat_overlap && lon_overlap)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					no_changes = false;
 | 
										no_changes = false;
 | 
				
			||||||
					track_groups[i].first.min.lat = std::fmin(track_groups[i].first.min.lat,
 | 
										track_groups[i].first.min.lat = fmin(track_groups[i].first.min.lat,
 | 
				
			||||||
					                                     track_groups[j].first.min.lat);
 | 
										                                     track_groups[j].first.min.lat);
 | 
				
			||||||
					track_groups[i].first.min.lon = std::fmin(track_groups[i].first.min.lon,
 | 
										track_groups[i].first.min.lon = fmin(track_groups[i].first.min.lon,
 | 
				
			||||||
					                                     track_groups[j].first.min.lon);
 | 
										                                     track_groups[j].first.min.lon);
 | 
				
			||||||
					track_groups[i].first.min.ele = std::fmin(track_groups[i].first.min.ele,
 | 
										track_groups[i].first.min.ele = fmin(track_groups[i].first.min.ele,
 | 
				
			||||||
					                                     track_groups[j].first.min.ele);
 | 
										                                     track_groups[j].first.min.ele);
 | 
				
			||||||
					track_groups[i].first.max.lat = std::fmax(track_groups[i].first.max.lat,
 | 
										track_groups[i].first.max.lat = fmax(track_groups[i].first.max.lat,
 | 
				
			||||||
					                                     track_groups[j].first.max.lat);
 | 
										                                     track_groups[j].first.max.lat);
 | 
				
			||||||
					track_groups[i].first.max.lon = std::fmax(track_groups[i].first.max.lon,
 | 
										track_groups[i].first.max.lon = fmax(track_groups[i].first.max.lon,
 | 
				
			||||||
					                                     track_groups[j].first.max.lon);
 | 
										                                     track_groups[j].first.max.lon);
 | 
				
			||||||
					track_groups[i].first.max.ele = std::fmax(track_groups[i].first.max.ele,
 | 
										track_groups[i].first.max.ele = fmax(track_groups[i].first.max.ele,
 | 
				
			||||||
					                                     track_groups[j].first.max.ele);
 | 
										                                     track_groups[j].first.max.ele);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// std::cout << "first.min.lat: " << track_groups[i].first.min.lat << ", "
 | 
										// std::cout << "first.min.lat: " << track_groups[i].first.min.lat << ", "
 | 
				
			||||||
@@ -308,7 +335,8 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				p.lat *= 500;
 | 
									p.lat *= 500;
 | 
				
			||||||
				p.lon *= 500;
 | 
									p.lon *= 500;
 | 
				
			||||||
				p.ele *= 0.1;
 | 
									// p.ele *= 0.001;
 | 
				
			||||||
 | 
									p.ele *= 0.01;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	// }
 | 
						// }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user