First person gamepad camera for Android (move with LT, look around with RT)
This commit is contained in:
parent
d8e362cc8e
commit
2e101fdd1e
3 changed files with 104 additions and 36 deletions
|
|
@ -6,7 +6,6 @@
|
|||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||
*/
|
||||
|
||||
|
||||
#define GLM_FORCE_RADIANS
|
||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
||||
#include <glm/glm.hpp>
|
||||
|
|
@ -133,4 +132,68 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
// Update camera passing separate axis data (gamepad)
|
||||
// Returns true if view or position has been changed
|
||||
bool updatePad(glm::vec2 axisLeft, glm::vec2 axisRight, float deltaTime)
|
||||
{
|
||||
bool retVal = false;
|
||||
|
||||
if (type == CameraType::firstperson)
|
||||
{
|
||||
// Use the common console thumbstick layout
|
||||
// Left = view, right = move
|
||||
|
||||
const float deadZone = 0.0015f;
|
||||
const float range = 1.0f - deadZone;
|
||||
|
||||
glm::vec3 camFront;
|
||||
camFront.x = -cos(glm::radians(rotation.x)) * sin(glm::radians(rotation.y));
|
||||
camFront.y = sin(glm::radians(rotation.x));
|
||||
camFront.z = cos(glm::radians(rotation.x)) * cos(glm::radians(rotation.y));
|
||||
camFront = glm::normalize(camFront);
|
||||
|
||||
float moveSpeed = deltaTime * movementSpeed * 2.0f;
|
||||
float rotSpeed = deltaTime * 50.0f;
|
||||
|
||||
// Move
|
||||
if (fabsf(axisLeft.y) > deadZone)
|
||||
{
|
||||
float pos = (fabsf(axisLeft.y) - deadZone) / range;
|
||||
position -= camFront * pos * ((axisLeft.y < 0.0f) ? -1.0f : 1.0f) * moveSpeed;
|
||||
retVal = true;
|
||||
}
|
||||
if (fabsf(axisLeft.x) > deadZone)
|
||||
{
|
||||
float pos = (fabsf(axisLeft.x) - deadZone) / range;
|
||||
position += glm::normalize(glm::cross(camFront, glm::vec3(0.0f, 1.0f, 0.0f))) * pos * ((axisLeft.x < 0.0f) ? -1.0f : 1.0f) * moveSpeed;
|
||||
retVal = true;
|
||||
}
|
||||
|
||||
// Rotate
|
||||
if (fabsf(axisRight.x) > deadZone)
|
||||
{
|
||||
float pos = (fabsf(axisRight.x) - deadZone) / range;
|
||||
rotation.y += pos * ((axisRight.x < 0.0f) ? -1.0f : 1.0f) * rotSpeed;
|
||||
retVal = true;
|
||||
}
|
||||
if (fabsf(axisRight.y) > deadZone)
|
||||
{
|
||||
float pos = (fabsf(axisRight.y) - deadZone) / range;
|
||||
rotation.x -= pos * ((axisRight.y < 0.0f) ? -1.0f : 1.0f) * rotSpeed;
|
||||
retVal = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// todo: move code from example base class for look-at
|
||||
}
|
||||
|
||||
if (retVal)
|
||||
{
|
||||
updateViewMatrix();
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue