First commit to re-enable gyros, removed various old head_mirror variables, now use 'lookingInMirror', etc. Local gyros now correctly drive own head.

This commit is contained in:
Philip Rosedale 2013-04-23 09:47:52 -07:00
parent e00a387020
commit 9760b7d410
4 changed files with 55 additions and 50 deletions

View file

@ -250,8 +250,16 @@ int audioCallback (const void *inputBuffer,
}
// play whatever we have in the audio buffer
//
// if we haven't fired off the flange effect, check if we should
int lastYawMeasured = fabsf(data->linkedHead->getLastMeasuredYaw());
//
//
// NOTE: PER - LastMeasuredHeadYaw is now relative to body position, represents the local
// rotation of the head relative to body, this may effect flange effect!
//
//
int lastYawMeasured = fabsf(data->linkedHead->getLastMeasuredHeadYaw());
if (!samplesLeftForFlange && lastYawMeasured > MIN_FLANGE_EFFECT_THRESHOLD) {
// we should flange for one second

View file

@ -241,7 +241,7 @@ void Head::reset() {
//this pertains to moving the head with the glasses
//---------------------------------------------------
void Head::UpdateGyros(float frametime, SerialInterface * serialInterface, int head_mirror, glm::vec3 * gravity)
void Head::UpdateGyros(float frametime, SerialInterface * serialInterface, glm::vec3 * gravity)
// Using serial data, update avatar/render position and angles
{
const float PITCH_ACCEL_COUPLING = 0.5;
@ -270,19 +270,14 @@ void Head::UpdateGyros(float frametime, SerialInterface * serialInterface, int h
const float MIN_YAW = -85;
if ((_head.pitch < MAX_PITCH) && (_head.pitch > MIN_PITCH))
addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime);
addHeadPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime);
addRoll(-measured_roll_rate * HEAD_ROLL_SCALE * frametime);
addHeadRoll(measured_roll_rate * HEAD_ROLL_SCALE * frametime);
if (head_mirror) {
if ((_head.yaw < MAX_YAW) && (_head.yaw > MIN_YAW))
addYaw(-_head.yawRate * HEAD_ROTATION_SCALE * frametime);
addLean(-measured_lateral_accel * frametime * HEAD_LEAN_SCALE, -measured_fwd_accel*frametime * HEAD_LEAN_SCALE);
} else {
if ((_head.yaw < MAX_YAW) && (_head.yaw > MIN_YAW))
addYaw(_head.yawRate * -HEAD_ROTATION_SCALE * frametime);
addLean(measured_lateral_accel * frametime * -HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE);
}
if ((_head.yaw < MAX_YAW) && (_head.yaw > MIN_YAW))
addHeadYaw(_head.yawRate * HEAD_ROTATION_SCALE * frametime);
addLean(-measured_lateral_accel * frametime * HEAD_LEAN_SCALE, -measured_fwd_accel*frametime * HEAD_LEAN_SCALE);
}
void Head::addLean(float x, float z) {
@ -462,10 +457,6 @@ void Head::simulate(float deltaTime) {
_bodyYaw += _bodyYawDelta * deltaTime;
}
// we will be eventually getting head rotation from elsewhere. For now, just setting it to body rotation
_head.yaw = _bodyYaw;
_head.pitch = _bodyPitch;
_head.roll = _bodyRoll;
//----------------------------------------------------------
// decay body yaw delta
@ -487,6 +478,15 @@ void Head::simulate(float deltaTime) {
//----------------------------------------------------------
_velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime );
//
// Update Head information
//
// we will be eventually getting head rotation from elsewhere. For now, just setting it to body rotation
//_head.yaw = _bodyYaw;
//_head.pitch = _bodyPitch;
//_head.roll = _bodyRoll;
if (!_head.noise) {
// Decay back toward center
_head.pitch *= (1.0f - DECAY*2*deltaTime);
@ -625,7 +625,7 @@ void Head::updateBigSphereCollisionTest( float deltaTime ) {
void Head::render(int faceToFace) {
void Head::render(int lookingInMirror) {
//---------------------------------------------------
// show avatar position
@ -658,7 +658,7 @@ void Head::render(int faceToFace) {
//---------------------------------------------------
// render head
//---------------------------------------------------
renderHead(faceToFace);
renderHead(lookingInMirror);
//---------------------------------------------------------------------------
// if this is my avatar, then render my interactions with the other avatars
@ -695,9 +695,9 @@ void Head::render(int faceToFace) {
}
}
void Head::renderHead(int faceToFace) {
void Head::renderHead(int lookingInMirror) {
int side = 0;
glEnable(GL_DEPTH_TEST);
@ -723,9 +723,13 @@ void Head::renderHead(int faceToFace) {
glScalef( 0.03, 0.03, 0.03 );
glRotatef(_head.yaw, 0, 1, 0);
glRotatef(_head.pitch, 1, 0, 0);
glRotatef(_head.roll, 0, 0, 1);
if (lookingInMirror) {
glRotatef(_bodyYaw - _head.yaw, 0, 1, 0);
} else {
glRotatef(_bodyYaw + _head.yaw, 0, 1, 0);
}
glRotatef(_bodyPitch + _head.pitch, 1, 0, 0);
glRotatef(_bodyRoll + _head.roll, 0, 0, 1);
glScalef(2.0, 2.0, 2.0);
glColor3fv(skinColor);

View file

@ -148,7 +148,7 @@ class Head : public AvatarData {
Head* clone() const;
void reset();
void UpdateGyros(float frametime, SerialInterface * serialInterface, int head_mirror, glm::vec3 * gravity);
void UpdateGyros(float frametime, SerialInterface * serialInterface, glm::vec3 * gravity);
void setNoise (float mag) { _head.noise = mag; }
void setPitch(float p) {_head.pitch = p; }
void setYaw(float y) {_head.yaw = y; }
@ -160,14 +160,14 @@ class Head : public AvatarData {
float getRenderPitch() {return _renderPitch;}
void setLeanForward(float dist);
void setLeanSideways(float dist);
void addPitch(float p) {_head.pitch -= p; }
void addYaw(float y){_head.yaw -= y; }
void addRoll(float r){_head.roll += r; }
void addHeadPitch(float p) {_head.pitch -= p; }
void addHeadYaw(float y){_head.yaw -= y; }
void addHeadRoll(float r){_head.roll += r; }
void addLean(float x, float z);
float getPitch() {return _head.pitch;}
float getRoll() {return _head.roll;}
float getYaw() {return _head.yaw;}
float getLastMeasuredYaw() {return _head.yawRate;}
float getHeadPitch() {return _head.pitch;}
float getHeadRoll() {return _head.roll;}
float getHeadYaw() {return _head.yaw;}
float getLastMeasuredHeadYaw() {return _head.yawRate;}
float getBodyYaw() {return _bodyYaw;};
void addBodyYaw(float y) {_bodyYaw += y;};

View file

@ -96,8 +96,6 @@ int packetsPerSecond = 0;
int bytesPerSecond = 0;
int bytesCount = 0;
int headMirror = 1; // Whether to mirror own head when viewing it
int WIDTH = 1200; // Window size
int HEIGHT = 800;
int fullscreen = 0;
@ -163,7 +161,7 @@ int noiseOn = 0; // Whether to add random noise
float noise = 1.0; // Overall magnitude scaling for random noise levels
int displayLevels = 0;
int displayHead = 0;
int lookingInMirror = 0; // Are we currently rendering one's own head as if in mirror?
int displayField = 0;
int displayHeadMouse = 1; // Display sample mouse pointer controlled by head movement
@ -459,7 +457,7 @@ void updateAvatar(float frametime)
float gyroPitchRate = serialPort.getRelativeValue(HEAD_PITCH_RATE);
float gyroYawRate = serialPort.getRelativeValue(HEAD_YAW_RATE );
myAvatar.UpdateGyros(frametime, &serialPort, headMirror, &gravity);
myAvatar.UpdateGyros(frametime, &serialPort, &gravity);
//
// Update gyro-based mouse (X,Y on screen)
@ -819,7 +817,7 @@ void display(void)
//--------------------------------------------------------
// camera settings
//--------------------------------------------------------
if ( displayHead ) {
if ( lookingInMirror ) {
//-----------------------------------------------
// set the camera to looking at my own face
//-----------------------------------------------
@ -912,7 +910,7 @@ void display(void)
drawGroundPlaneGrid( 5.0f, 9 );
// Draw cloud of dots
if (!displayHead) cloud.render();
if (!lookingInMirror) cloud.render();
// Draw voxels
if ( showingVoxels )
@ -934,16 +932,16 @@ void display(void)
}
}
if ( !displayHead ) balls.render();
if ( !lookingInMirror ) balls.render();
// Render the world box
if (!displayHead && statsOn) render_world_box();
if (!lookingInMirror && statsOn) render_world_box();
// brad's frustum for debugging
if (::frustumOn) renderViewFrustum(::viewFrustum);
//Render my own avatar
myAvatar.render(true);
myAvatar.render(lookingInMirror);
}
glPopMatrix();
@ -961,7 +959,7 @@ void display(void)
if (audioScope.getState()) audioScope.render();
#endif
if (displayHeadMouse && !displayHead && statsOn) {
if (displayHeadMouse && !lookingInMirror && statsOn) {
// Display small target box at center or head mouse target that can also be used to measure LOD
glColor3f(1.0, 1.0, 1.0);
glDisable(GL_LINE_SMOOTH);
@ -1057,7 +1055,7 @@ int setValue(int state, bool *value) {
}
int setHead(int state) {
return setValue(state, &displayHead);
return setValue(state, &lookingInMirror);
}
int setField(int state) {
@ -1090,10 +1088,6 @@ int setMenu(int state) {
return setValue(state, &::menuOn);
}
int setMirror(int state) {
return setValue(state, &headMirror);
}
int setDisplayFrustum(int state) {
return setValue(state, &::frustumOn);
}
@ -1202,7 +1196,6 @@ void initMenu() {
menuColumnOptions->addRow("(H)ead", setHead);
menuColumnOptions->addRow("Field (f)", setField);
menuColumnOptions->addRow("(N)oise", setNoise);
menuColumnOptions->addRow("Mirror", setMirror);
menuColumnOptions->addRow("(V)oxels", setVoxels);
menuColumnOptions->addRow("Stars (*)", setStars);
menuColumnOptions->addRow("(Q)uit", quitApp);
@ -1411,9 +1404,9 @@ void key(unsigned char k, int x, int y)
}
if (k == 'h') {
displayHead = !displayHead;
lookingInMirror = !lookingInMirror;
#ifndef _WIN32
audio.setMixerLoopbackFlag(displayHead);
audio.setMixerLoopbackFlag(lookingInMirror);
#endif
}