Gyros and touch look now work at same time

This commit is contained in:
Philip Rosedale 2013-07-11 21:34:42 -07:00
parent 670de73384
commit 6609a850eb
4 changed files with 25 additions and 14 deletions

View file

@ -183,6 +183,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_touchAvgX(0.0f), _touchAvgX(0.0f),
_touchAvgY(0.0f), _touchAvgY(0.0f),
_isTouchPressed(false), _isTouchPressed(false),
_yawFromTouch(0.0f),
_pitchFromTouch(0.0f),
_mousePressed(false), _mousePressed(false),
_mouseVoxelScale(1.0f / 1024.0f), _mouseVoxelScale(1.0f / 1024.0f),
_justEditedVoxel(false), _justEditedVoxel(false),
@ -969,6 +971,9 @@ void Application::idle() {
gettimeofday(&check, NULL); gettimeofday(&check, NULL);
// Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran
sendPostedEvents(NULL, QEvent::TouchBegin);
sendPostedEvents(NULL, QEvent::TouchUpdate);
sendPostedEvents(NULL, QEvent::TouchEnd);
double timeSinceLastUpdate = diffclock(&_lastTimeUpdated, &check); double timeSinceLastUpdate = diffclock(&_lastTimeUpdated, &check);
if (timeSinceLastUpdate > IDLE_SIMULATE_MSECS) { if (timeSinceLastUpdate > IDLE_SIMULATE_MSECS) {
@ -978,9 +983,6 @@ void Application::idle() {
// This is necessary because id the idle() call takes longer than the // This is necessary because id the idle() call takes longer than the
// interval between idle() calls, the event loop never gets to run, // interval between idle() calls, the event loop never gets to run,
// and touch events get delayed. // and touch events get delayed.
sendPostedEvents(NULL, QEvent::TouchBegin);
sendPostedEvents(NULL, QEvent::TouchUpdate);
sendPostedEvents(NULL, QEvent::TouchEnd);
const float BIGGEST_DELTA_TIME_SECS = 0.25f; const float BIGGEST_DELTA_TIME_SECS = 0.25f;
update(glm::clamp((float)timeSinceLastUpdate / 1000.f, 0.f, BIGGEST_DELTA_TIME_SECS)); update(glm::clamp((float)timeSinceLastUpdate / 1000.f, 0.f, BIGGEST_DELTA_TIME_SECS));
@ -1902,12 +1904,9 @@ void Application::update(float deltaTime) {
if (_isTouchPressed) { if (_isTouchPressed) {
float TOUCH_YAW_SCALE = -50.0f; float TOUCH_YAW_SCALE = -50.0f;
float TOUCH_PITCH_SCALE = -50.0f; float TOUCH_PITCH_SCALE = -50.0f;
_myAvatar.getHead().addYaw((_touchAvgX - _lastTouchAvgX) _yawFromTouch += ((_touchAvgX - _lastTouchAvgX) * TOUCH_YAW_SCALE * deltaTime);
* TOUCH_YAW_SCALE _pitchFromTouch += ((_touchAvgY - _lastTouchAvgY) * TOUCH_PITCH_SCALE * deltaTime);
* deltaTime);
_myAvatar.getHead().addPitch((_touchAvgY - _lastTouchAvgY)
* TOUCH_PITCH_SCALE
* deltaTime);
_lastTouchAvgX = _touchAvgX; _lastTouchAvgX = _touchAvgX;
_lastTouchAvgY = _touchAvgY; _lastTouchAvgY = _touchAvgY;
} }
@ -2015,7 +2014,9 @@ void Application::updateAvatar(float deltaTime) {
_myAvatar.updateFromGyrosAndOrWebcam(_gyroLook->isChecked(), _myAvatar.updateFromGyrosAndOrWebcam(_gyroLook->isChecked(),
glm::vec3(_headCameraPitchYawScale, glm::vec3(_headCameraPitchYawScale,
_headCameraPitchYawScale, _headCameraPitchYawScale,
_headCameraPitchYawScale)); _headCameraPitchYawScale),
_yawFromTouch,
_pitchFromTouch);
if (_serialHeadSensor.isActive()) { if (_serialHeadSensor.isActive()) {

View file

@ -332,6 +332,8 @@ private:
float _touchDragStartedAvgX; float _touchDragStartedAvgX;
float _touchDragStartedAvgY; float _touchDragStartedAvgY;
bool _isTouchPressed; // true if multitouch has been pressed (clear when finished) bool _isTouchPressed; // true if multitouch has been pressed (clear when finished)
float _yawFromTouch;
float _pitchFromTouch;
VoxelDetail _mouseVoxelDragging; VoxelDetail _mouseVoxelDragging;
glm::vec3 _voxelThrust; glm::vec3 _voxelThrust;

View file

@ -287,7 +287,10 @@ void Avatar::reset() {
} }
// Update avatar head rotation with sensor data // Update avatar head rotation with sensor data
void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyAngle) { void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook,
const glm::vec3& amplifyAngle,
float yawFromTouch,
float pitchFromTouch) {
SerialInterface* gyros = Application::getInstance()->getSerialHeadSensor(); SerialInterface* gyros = Application::getInstance()->getSerialHeadSensor();
Webcam* webcam = Application::getInstance()->getWebcam(); Webcam* webcam = Application::getInstance()->getWebcam();
glm::vec3 estimatedPosition, estimatedRotation; glm::vec3 estimatedPosition, estimatedRotation;
@ -298,6 +301,8 @@ void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyA
estimatedRotation = webcam->getEstimatedRotation(); estimatedRotation = webcam->getEstimatedRotation();
} else { } else {
_head.setPitch(pitchFromTouch);
_head.setYaw(yawFromTouch);
return; return;
} }
if (webcam->isActive()) { if (webcam->isActive()) {
@ -318,8 +323,8 @@ void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyA
} }
} }
} }
_head.setPitch(estimatedRotation.x * amplifyAngle.x); _head.setPitch(estimatedRotation.x * amplifyAngle.x + pitchFromTouch);
_head.setYaw(estimatedRotation.y * amplifyAngle.y); _head.setYaw(estimatedRotation.y * amplifyAngle.y + yawFromTouch);
_head.setRoll(estimatedRotation.z * amplifyAngle.z); _head.setRoll(estimatedRotation.z * amplifyAngle.z);
_head.setCameraFollowsHead(gyroLook); _head.setCameraFollowsHead(gyroLook);

View file

@ -87,7 +87,10 @@ public:
void reset(); void reset();
void simulate(float deltaTime, Transmitter* transmitter); void simulate(float deltaTime, Transmitter* transmitter);
void updateThrust(float deltaTime, Transmitter * transmitter); void updateThrust(float deltaTime, Transmitter * transmitter);
void updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyAngles); void updateFromGyrosAndOrWebcam(bool gyroLook,
const glm::vec3& amplifyAngle,
float yawFromTouch,
float pitchFromTouch);
void addBodyYaw(float y) {_bodyYaw += y;}; void addBodyYaw(float y) {_bodyYaw += y;};
void render(bool lookingInMirror, bool renderAvatarBalls); void render(bool lookingInMirror, bool renderAvatarBalls);