From db73d8d2f4d897caf89dcb69f907fad95701f22a Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 14 Jul 2014 12:23:00 -0700 Subject: [PATCH 1/2] add body angular acceleration --- interface/src/Hair.cpp | 12 ++++++++---- interface/src/Hair.h | 2 ++ interface/src/avatar/Avatar.cpp | 6 +++++- interface/src/avatar/Avatar.h | 4 ++++ interface/src/avatar/MyAvatar.cpp | 3 ++- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/interface/src/Hair.cpp b/interface/src/Hair.cpp index e07b624d89..810833d750 100644 --- a/interface/src/Hair.cpp +++ b/interface/src/Hair.cpp @@ -18,7 +18,8 @@ const float HAIR_DAMPING = 0.99f; const float CONSTRAINT_RELAXATION = 10.0f; const float HAIR_ACCELERATION_COUPLING = 0.025f; -const float HAIR_ANGULAR_VELOCITY_COUPLING = 0.10f; +const float HAIR_ANGULAR_VELOCITY_COUPLING = 0.01f; +const float HAIR_ANGULAR_ACCELERATION_COUPLING = 0.001f; const float HAIR_MAX_LINEAR_ACCELERATION = 4.0f; const float HAIR_STIFFNESS = 0.005f; const glm::vec3 HAIR_COLOR1(0.98f, 0.92f, 0.843f); @@ -36,6 +37,7 @@ Hair::Hair(int strands, _radius(radius), _acceleration(0.0f), _angularVelocity(0.0f), + _angularAcceleration(0.0f), _gravity(0.0f) { _hairPosition = new glm::vec3[_strands * _links]; @@ -127,13 +129,15 @@ void Hair::simulate(float deltaTime) { const float ANGULAR_VELOCITY_MIN = 0.001f; if (glm::length(_angularVelocity) > ANGULAR_VELOCITY_MIN) { glm::vec3 yawVector = _hairPosition[vertexIndex]; + glm::vec3 angularVelocity = _angularVelocity * HAIR_ANGULAR_VELOCITY_COUPLING; + glm::vec3 angularAcceleration = _angularAcceleration * HAIR_ANGULAR_ACCELERATION_COUPLING; yawVector.y = 0.f; if (glm::length(yawVector) > EPSILON) { float radius = glm::length(yawVector); yawVector = glm::normalize(yawVector); float angle = atan2f(yawVector.x, -yawVector.z) + PI; glm::vec3 delta = glm::vec3(-1.f, 0.f, 0.f) * glm::angleAxis(angle, glm::vec3(0, 1, 0)); - _hairPosition[vertexIndex] -= delta * radius * _angularVelocity.y * HAIR_ANGULAR_VELOCITY_COUPLING * deltaTime; + _hairPosition[vertexIndex] -= delta * radius * (angularVelocity.y - angularAcceleration.y) * deltaTime; } glm::vec3 pitchVector = _hairPosition[vertexIndex]; pitchVector.x = 0.f; @@ -142,7 +146,7 @@ void Hair::simulate(float deltaTime) { pitchVector = glm::normalize(pitchVector); float angle = atan2f(pitchVector.y, -pitchVector.z) + PI; glm::vec3 delta = glm::vec3(0.0f, 1.0f, 0.f) * glm::angleAxis(angle, glm::vec3(1, 0, 0)); - _hairPosition[vertexIndex] -= delta * radius * _angularVelocity.x * HAIR_ANGULAR_VELOCITY_COUPLING * deltaTime; + _hairPosition[vertexIndex] -= delta * radius * (angularVelocity.x - angularAcceleration.x) * deltaTime; } glm::vec3 rollVector = _hairPosition[vertexIndex]; rollVector.z = 0.f; @@ -151,7 +155,7 @@ void Hair::simulate(float deltaTime) { pitchVector = glm::normalize(rollVector); float angle = atan2f(rollVector.x, rollVector.y) + PI; glm::vec3 delta = glm::vec3(-1.0f, 0.0f, 0.f) * glm::angleAxis(angle, glm::vec3(0, 0, 1)); - _hairPosition[vertexIndex] -= delta * radius * _angularVelocity.z * HAIR_ANGULAR_VELOCITY_COUPLING * deltaTime; + _hairPosition[vertexIndex] -= delta * radius * (angularVelocity.z - angularAcceleration.z) * deltaTime; } } diff --git a/interface/src/Hair.h b/interface/src/Hair.h index 0ca507ee23..12a573db58 100644 --- a/interface/src/Hair.h +++ b/interface/src/Hair.h @@ -40,6 +40,7 @@ public: void render(); void setAcceleration(const glm::vec3& acceleration) { _acceleration = acceleration; } void setAngularVelocity(const glm::vec3& angularVelocity) { _angularVelocity = angularVelocity; } + void setAngularAcceleration(const glm::vec3& angularAcceleration) { _angularAcceleration = angularAcceleration; } void setGravity(const glm::vec3& gravity) { _gravity = gravity; } private: @@ -58,6 +59,7 @@ private: int* _hairConstraints; glm::vec3 _acceleration; glm::vec3 _angularVelocity; + glm::vec3 _angularAcceleration; glm::vec3 _gravity; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index fd8f2d836b..4645dd6363 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -52,6 +52,8 @@ Avatar::Avatar() : _lastVelocity(0.0f, 0.0f, 0.0f), _acceleration(0.0f, 0.0f, 0.0f), _angularVelocity(0.0f, 0.0f, 0.0f), + _lastAngularVelocity(0.0f, 0.0f, 0.0f), + _angularAcceleration(0.0f, 0.0f, 0.0f), _lastOrientation(), _leanScale(0.5f), _scale(1.0f), @@ -168,7 +170,8 @@ void Avatar::simulate(float deltaTime) { if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { PerformanceTimer perfTimer("hair"); _hair.setAcceleration(getAcceleration() * getHead()->getFinalOrientationInWorldFrame()); - _hair.setAngularVelocity(getAngularVelocity() + getHead()->getAngularVelocity() * getHead()->getFinalOrientationInWorldFrame()); + _hair.setAngularVelocity((getAngularVelocity() + getHead()->getAngularVelocity()) * getHead()->getFinalOrientationInWorldFrame()); + _hair.setAngularAcceleration(getAngularAcceleration() * getHead()->getFinalOrientationInWorldFrame()); _hair.setGravity(Application::getInstance()->getEnvironment()->getGravity(getPosition()) * getHead()->getFinalOrientationInWorldFrame()); _hair.simulate(deltaTime); } @@ -204,6 +207,7 @@ void Avatar::updateAcceleration(float deltaTime) { glm::quat orientation = getOrientation(); glm::quat delta = glm::inverse(_lastOrientation) * orientation; _angularVelocity = safeEulerAngles(delta) * (1.f / deltaTime); + _angularAcceleration = (_angularVelocity - _lastAngularVelocity) * (1.f / deltaTime); _lastOrientation = getOrientation(); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 2d85aa70a5..6a6cdb8511 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -152,6 +152,8 @@ public: glm::vec3 getAcceleration() const { return _acceleration; } glm::vec3 getAngularVelocity() const { return _angularVelocity; } + glm::vec3 getAngularAcceleration() const { return _angularAcceleration; } + /// Scales a world space position vector relative to the avatar position and scale /// \param vector position to be scaled. Will store the result @@ -176,6 +178,8 @@ protected: glm::vec3 _lastVelocity; glm::vec3 _acceleration; glm::vec3 _angularVelocity; + glm::vec3 _lastAngularVelocity; + glm::vec3 _angularAcceleration; glm::quat _lastOrientation; float _leanScale; float _scale; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 3ec6652889..d4bafc388f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -186,7 +186,8 @@ void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("hair"); if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { _hair.setAcceleration(getAcceleration() * getHead()->getFinalOrientationInWorldFrame()); - _hair.setAngularVelocity(getAngularVelocity() + getHead()->getAngularVelocity() * getHead()->getFinalOrientationInWorldFrame()); + _hair.setAngularVelocity((getAngularVelocity() + getHead()->getAngularVelocity()) * getHead()->getFinalOrientationInWorldFrame()); + _hair.setAngularAcceleration(getAngularAcceleration() * getHead()->getFinalOrientationInWorldFrame()); _hair.setGravity(Application::getInstance()->getEnvironment()->getGravity(getPosition()) * getHead()->getFinalOrientationInWorldFrame()); _hair.simulate(deltaTime); } From 4f52098da1c4707d420881e2c18046465ca9e8a3 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 22 Jul 2014 20:23:23 -0400 Subject: [PATCH 2/2] tuning tweaks to world and avatar lights --- examples/avatarLocalLight.js | 2 +- interface/src/Application.cpp | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/avatarLocalLight.js b/examples/avatarLocalLight.js index 040289af1f..b1f31888d8 100644 --- a/examples/avatarLocalLight.js +++ b/examples/avatarLocalLight.js @@ -11,7 +11,7 @@ // var localLightDirections = [ {x: 1.0, y:0.0, z: 0.0}, {x: 0.0, y:0.0, z: 1.0} ]; -var localLightColors = [ {x: 1.0, y:1.0, z: 1.0}, {x: 1.0, y:1.0, z: 1.0} ]; +var localLightColors = [ {x: 0.4, y:0.335, z: 0.266}, {x: 0.4, y:0.335, z: 0.266} ]; var currentSelection = 0; var currentNumLights = 2; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1d0bf8d6a3..8b00bface7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2600,7 +2600,9 @@ void Application::updateShadowMap() { glViewport(0, 0, _glWidget->width(), _glWidget->height()); } -const GLfloat WHITE_SPECULAR_COLOR[] = { 1.0f, 1.0f, 1.0f, 1.0f }; +const GLfloat WORLD_AMBIENT_COLOR[] = { 0.525f, 0.525f, 0.6f }; +const GLfloat WORLD_DIFFUSE_COLOR[] = { 0.6f, 0.525f, 0.525f }; +const GLfloat WORLD_SPECULAR_COLOR[] = { 0.94f, 0.94f, 0.737f, 1.0f }; const GLfloat NO_SPECULAR_COLOR[] = { 0.0f, 0.0f, 0.0f, 1.0f }; void Application::setupWorldLight() { @@ -2612,13 +2614,10 @@ void Application::setupWorldLight() { glm::vec3 sunDirection = getSunDirection(); GLfloat light_position0[] = { sunDirection.x, sunDirection.y, sunDirection.z, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position0); - GLfloat ambient_color[] = { 0.7f, 0.7f, 0.8f }; - glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_color); - GLfloat diffuse_color[] = { 0.8f, 0.7f, 0.7f }; - glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_color); - - glLightfv(GL_LIGHT0, GL_SPECULAR, WHITE_SPECULAR_COLOR); - glMaterialfv(GL_FRONT, GL_SPECULAR, WHITE_SPECULAR_COLOR); + glLightfv(GL_LIGHT0, GL_AMBIENT, WORLD_AMBIENT_COLOR); + glLightfv(GL_LIGHT0, GL_DIFFUSE, WORLD_DIFFUSE_COLOR); + glLightfv(GL_LIGHT0, GL_SPECULAR, WORLD_SPECULAR_COLOR); + glMaterialfv(GL_FRONT, GL_SPECULAR, WORLD_SPECULAR_COLOR); glMateriali(GL_FRONT, GL_SHININESS, 96); } @@ -2796,7 +2795,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { } // restore default, white specular - glMaterialfv(GL_FRONT, GL_SPECULAR, WHITE_SPECULAR_COLOR); + glMaterialfv(GL_FRONT, GL_SPECULAR, WORLD_SPECULAR_COLOR); _nodeBoundsDisplay.draw();