diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dbcba2f5c2..d4ab79b09c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -849,7 +849,7 @@ void Application::idle() { timeval check; gettimeofday(&check, NULL); - // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time + // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran if (diffclock(&_lastTimeIdle, &check) > IDLE_SIMULATE_MSECS) { @@ -857,8 +857,10 @@ void Application::idle() { // Use Transmitter Hand to move hand if connected, else use mouse if (_myTransmitter.isConnected()) { - const float HAND_FORCE_SCALING = 0.05f; - _myAvatar.setMovedHandOffset(_myTransmitter.getLastAcceleration() * HAND_FORCE_SCALING); + const float HAND_FORCE_SCALING = 0.01f; + glm::vec3 estimatedRotation = _myTransmitter.getEstimatedRotation(); + glm::vec3 handForce(-estimatedRotation.z, -estimatedRotation.x, estimatedRotation.y); + _myAvatar.setMovedHandOffset(handForce * HAND_FORCE_SCALING); } else { // update behaviors for avatar hand movement: handControl takes mouse values as input, // and gives back 3D values modulated for smooth transitioning between interaction modes. @@ -964,20 +966,26 @@ void Application::idle() { networkReceive(0); } - //loop through all the remote avatars and simulate them... + //loop through all the other avatars and simulate them... AgentList* agentList = AgentList::getInstance(); agentList->lock(); for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if (agent->getLinkedData() != NULL) { Avatar *avatar = (Avatar *)agent->getLinkedData(); - avatar->simulate(deltaTime); + avatar->simulate(deltaTime, false); avatar->setMouseRay(mouseRayOrigin, mouseRayDirection); } } agentList->unlock(); + // Simulate myself _myAvatar.setGravity(getGravity(_myAvatar.getPosition())); - _myAvatar.simulate(deltaTime); + if (_transmitterDrives->isChecked() && _myTransmitter.isConnected()) { + _myAvatar.simulate(deltaTime, &_myTransmitter); + } else { + _myAvatar.simulate(deltaTime, NULL); + + } // Update audio stats for procedural sounds #ifndef _WIN32 @@ -1204,6 +1212,9 @@ void Application::initMenu() { _gyroLook->setChecked(true); (_mouseLook = optionsMenu->addAction("Mouse Look"))->setCheckable(true); _mouseLook->setChecked(false); + (_transmitterDrives = optionsMenu->addAction("Transmitter Drive"))->setCheckable(true); + _transmitterDrives->setChecked(true); + optionsMenu->addAction("Fullscreen", this, SLOT(setFullscreen(bool)), Qt::Key_F)->setCheckable(true); QMenu* renderMenu = menuBar->addMenu("Render"); @@ -2055,6 +2066,7 @@ void Application::resetSensors() { } QCursor::setPos(_headMouseX, _headMouseY); _myAvatar.reset(); + _myTransmitter.resetLevels(); } static void setShortcutsEnabled(QWidget* widget, bool enabled) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 99c4e530de..092515bb38 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -134,6 +134,7 @@ private: QAction* _lookingInMirror; // Are we currently rendering one's own head as if in mirror? QAction* _gyroLook; // Whether to allow the gyro data from head to move your view QAction* _mouseLook; // Whether the have the mouse near edge of screen move your view + QAction* _transmitterDrives; // Whether to have Transmitter data move/steer the Avatar QAction* _renderVoxels; // Whether to render voxels QAction* _renderVoxelTextures; // Whether to render noise textures on voxels QAction* _renderStarsOn; // Whether to display the stars diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 093e5f26d5..597ca19457 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -209,7 +209,7 @@ void Avatar::updateFromMouse(int mouseX, int mouseY, int screenWidth, int scree return; } -void Avatar::simulate(float deltaTime) { +void Avatar::simulate(float deltaTime, Transmitter* transmitter) { //figure out if the mouse cursor is over any body spheres... if (_isMine) { @@ -258,7 +258,8 @@ void Avatar::simulate(float deltaTime) { if (_isMine) { _thrust = glm::vec3(0.0f, 0.0f, 0.0f); - + + // Add Thrusts from keyboard if (_driveKeys[FWD ]) {_thrust += THRUST_MAG * deltaTime * _orientation.getFront();} if (_driveKeys[BACK ]) {_thrust -= THRUST_MAG * deltaTime * _orientation.getFront();} if (_driveKeys[RIGHT ]) {_thrust += THRUST_MAG * deltaTime * _orientation.getRight();} @@ -267,6 +268,24 @@ void Avatar::simulate(float deltaTime) { if (_driveKeys[DOWN ]) {_thrust -= THRUST_MAG * deltaTime * _orientation.getUp();} if (_driveKeys[ROT_RIGHT]) {_bodyYawDelta -= YAW_MAG * deltaTime;} if (_driveKeys[ROT_LEFT ]) {_bodyYawDelta += YAW_MAG * deltaTime;} + + // Add thrusts from Transmitter + if (transmitter) { + glm::vec3 rotation = transmitter->getEstimatedRotation(); + const float TRANSMITTER_MIN_RATE = 1.f; + const float TRANSMITTER_LATERAL_FORCE_SCALE = 25.f; + const float TRANSMITTER_FWD_FORCE_SCALE = 50.f; + const float TRANSMITTER_YAW_SCALE = 7.0f; + if (fabs(rotation.z) > TRANSMITTER_MIN_RATE) { + _thrust += rotation.z * TRANSMITTER_LATERAL_FORCE_SCALE * deltaTime * _orientation.getRight(); + } + if (fabs(rotation.x) > TRANSMITTER_MIN_RATE) { + _thrust += -rotation.x * TRANSMITTER_FWD_FORCE_SCALE * deltaTime * _orientation.getFront(); + } + if (fabs(rotation.y) > TRANSMITTER_MIN_RATE) { + _bodyYawDelta += rotation.y * TRANSMITTER_YAW_SCALE * deltaTime; + } + } } // update body yaw by body yaw delta diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 500237930f..9dc335e031 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -110,7 +110,7 @@ public: void setMousePressed(bool pressed); void render(bool lookingInMirror, glm::vec3 cameraPosition); void renderBody(bool lookingInMirror); - void simulate(float); + void simulate(float deltaTime, Transmitter* transmitter); void setMovedHandOffset(glm::vec3 movedHandOffset) { _movedHandOffset = movedHandOffset; } void updateArmIKAndConstraints( float deltaTime ); void setDisplayingHead( bool displayingHead );