1 | // Include GLFW
|
---|
2 | #include <GLFW/glfw3.h>
|
---|
3 | extern GLFWwindow* window; // The "extern" keyword here is to access the variable "window" declared in tutorialXXX.cpp. This is a hack to keep the tutorials simple. Please avoid this.
|
---|
4 |
|
---|
5 | // Include GLM
|
---|
6 | #include <glm/glm.hpp>
|
---|
7 | #include <glm/gtc/matrix_transform.hpp>
|
---|
8 | using namespace glm;
|
---|
9 |
|
---|
10 | #include "controls.hpp"
|
---|
11 |
|
---|
12 | glm::mat4 ViewMatrix;
|
---|
13 | glm::mat4 ProjectionMatrix;
|
---|
14 |
|
---|
15 | glm::mat4 getViewMatrix(){
|
---|
16 | return ViewMatrix;
|
---|
17 | }
|
---|
18 | glm::mat4 getProjectionMatrix(){
|
---|
19 | return ProjectionMatrix;
|
---|
20 | }
|
---|
21 |
|
---|
22 |
|
---|
23 | // Initial position : on +Z
|
---|
24 | glm::vec3 position = glm::vec3( 0, 0, 5 );
|
---|
25 | // Initial horizontal angle : toward -Z
|
---|
26 | float horizontalAngle = 3.14f;
|
---|
27 | // Initial vertical angle : none
|
---|
28 | float verticalAngle = 0.0f;
|
---|
29 | // Initial Field of View
|
---|
30 | float initialFoV = 45.0f;
|
---|
31 |
|
---|
32 | float speed = 3.0f; // 3 units / second
|
---|
33 | float mouseSpeed = 0.005f;
|
---|
34 |
|
---|
35 |
|
---|
36 |
|
---|
37 | void computeMatricesFromInputs(int windowWidth, int windowHeight) {
|
---|
38 |
|
---|
39 | // glfwGetTime is called only once, the first time this function is called
|
---|
40 | static double lastTime = glfwGetTime();
|
---|
41 |
|
---|
42 | // Compute time difference between current and last frame
|
---|
43 | double currentTime = glfwGetTime();
|
---|
44 | float deltaTime = float(currentTime - lastTime);
|
---|
45 |
|
---|
46 | // Get mouse position
|
---|
47 | double xpos, ypos;
|
---|
48 | glfwGetCursorPos(window, &xpos, &ypos);
|
---|
49 |
|
---|
50 | // Reset mouse position for next frame
|
---|
51 | glfwSetCursorPos(window, 1024/2, 768/2);
|
---|
52 |
|
---|
53 | // Compute new orientation
|
---|
54 | /* STOP ROTATION FOR NOW */
|
---|
55 | horizontalAngle += mouseSpeed * float(1024/2 - xpos );
|
---|
56 | verticalAngle += mouseSpeed * float( 768/2 - ypos );
|
---|
57 |
|
---|
58 | // Direction : Spherical coordinates to Cartesian coordinates conversion
|
---|
59 | glm::vec3 direction(
|
---|
60 | cos(verticalAngle) * sin(horizontalAngle),
|
---|
61 | sin(verticalAngle),
|
---|
62 | cos(verticalAngle) * cos(horizontalAngle)
|
---|
63 | );
|
---|
64 |
|
---|
65 | // Right vector
|
---|
66 | glm::vec3 right = glm::vec3(
|
---|
67 | sin(horizontalAngle - 3.14f/2.0f),
|
---|
68 | 0,
|
---|
69 | cos(horizontalAngle - 3.14f/2.0f)
|
---|
70 | );
|
---|
71 |
|
---|
72 | // Up vector
|
---|
73 | glm::vec3 up = glm::cross( right, direction );
|
---|
74 |
|
---|
75 | // Move forward
|
---|
76 | if (glfwGetKey( window, GLFW_KEY_UP ) == GLFW_PRESS){
|
---|
77 | position += direction * deltaTime * speed;
|
---|
78 | }
|
---|
79 | // Move backward
|
---|
80 | if (glfwGetKey( window, GLFW_KEY_DOWN ) == GLFW_PRESS){
|
---|
81 | position -= direction * deltaTime * speed;
|
---|
82 | }
|
---|
83 | // Strafe right
|
---|
84 | if (glfwGetKey( window, GLFW_KEY_RIGHT ) == GLFW_PRESS){
|
---|
85 | position += right * deltaTime * speed;
|
---|
86 | }
|
---|
87 | // Strafe left
|
---|
88 | if (glfwGetKey( window, GLFW_KEY_LEFT ) == GLFW_PRESS){
|
---|
89 | position -= right * deltaTime * speed;
|
---|
90 | }
|
---|
91 |
|
---|
92 | float FoV = initialFoV;// - 5 * glfwGetMouseWheel(); // Now GLFW 3 requires setting up a callback for this. It's a bit too complicated for this beginner's tutorial, so it's disabled instead.
|
---|
93 |
|
---|
94 | // Projection matrix : 45� Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
|
---|
95 | ProjectionMatrix = glm::perspective(FoV, 4.0f / 3.0f, 0.1f, 100.0f);
|
---|
96 | // Camera matrix
|
---|
97 | ViewMatrix = glm::lookAt(
|
---|
98 | position, // Camera is here
|
---|
99 | position+direction, // and looks here : at the same position, plus "direction"
|
---|
100 | up // Head is up (set to 0,-1,0 to look upside-down)
|
---|
101 | );
|
---|
102 |
|
---|
103 | // For the next frame, the "last time" will be "now"
|
---|
104 | lastTime = currentTime;
|
---|
105 | }
|
---|