mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 05:37:17 +02:00
Hand-face collisions now work (sorta).
This commit is contained in:
parent
312bc7521f
commit
d9b50359a6
3 changed files with 52 additions and 3 deletions
|
@ -162,6 +162,7 @@ void Avatar::render(bool forceRenderHead) {
|
||||||
// render body
|
// render body
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::CollisionProxies)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::CollisionProxies)) {
|
||||||
_skeletonModel.renderCollisionProxies(1.f);
|
_skeletonModel.renderCollisionProxies(1.f);
|
||||||
|
//_head.getFaceModel().renderCollisionProxies(0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) {
|
||||||
|
@ -276,11 +277,14 @@ bool Avatar::findSphereCollisions(const glm::vec3& penetratorCenter, float penet
|
||||||
bool didPenetrate = false;
|
bool didPenetrate = false;
|
||||||
glm::vec3 skeletonPenetration;
|
glm::vec3 skeletonPenetration;
|
||||||
ModelCollisionInfo collisionInfo;
|
ModelCollisionInfo collisionInfo;
|
||||||
|
/* Temporarily disabling collisions against the skeleton because the collision proxies up
|
||||||
|
* near the neck are bad and prevent the hand from hitting the face.
|
||||||
if (_skeletonModel.findSphereCollision(penetratorCenter, penetratorRadius, collisionInfo, 1.0f, skeletonSkipIndex)) {
|
if (_skeletonModel.findSphereCollision(penetratorCenter, penetratorRadius, collisionInfo, 1.0f, skeletonSkipIndex)) {
|
||||||
collisionInfo._model = &_skeletonModel;
|
collisionInfo._model = &_skeletonModel;
|
||||||
collisions.push_back(collisionInfo);
|
collisions.push_back(collisionInfo);
|
||||||
didPenetrate = true;
|
didPenetrate = true;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if (_head.getFaceModel().findSphereCollision(penetratorCenter, penetratorRadius, collisionInfo)) {
|
if (_head.getFaceModel().findSphereCollision(penetratorCenter, penetratorRadius, collisionInfo)) {
|
||||||
collisionInfo._model = &(_head.getFaceModel());
|
collisionInfo._model = &(_head.getFaceModel());
|
||||||
collisions.push_back(collisionInfo);
|
collisions.push_back(collisionInfo);
|
||||||
|
@ -448,16 +452,31 @@ float Avatar::getHeight() const {
|
||||||
bool Avatar::collisionWouldMoveAvatar(ModelCollisionInfo& collision) const {
|
bool Avatar::collisionWouldMoveAvatar(ModelCollisionInfo& collision) const {
|
||||||
// ATM only the Skeleton is pokeable
|
// ATM only the Skeleton is pokeable
|
||||||
// TODO: make poke affect head
|
// TODO: make poke affect head
|
||||||
|
if (!collision._model) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (collision._model == &_skeletonModel && collision._jointIndex != -1) {
|
if (collision._model == &_skeletonModel && collision._jointIndex != -1) {
|
||||||
return _skeletonModel.collisionHitsMoveableJoint(collision);
|
// collision response of skeleton is temporarily disabled
|
||||||
|
return false;
|
||||||
|
//return _skeletonModel.collisionHitsMoveableJoint(collision);
|
||||||
|
}
|
||||||
|
if (collision._model == &(_head.getFaceModel())) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::applyCollision(ModelCollisionInfo& collision) {
|
void Avatar::applyCollision(ModelCollisionInfo& collision) {
|
||||||
if (collision._model == &_skeletonModel && collision._jointIndex != -1) {
|
if (!collision._model) {
|
||||||
_skeletonModel.applyCollision(collision);
|
return;
|
||||||
}
|
}
|
||||||
|
if (collision._model == &(_head.getFaceModel())) {
|
||||||
|
_head.applyCollision(collision);
|
||||||
|
}
|
||||||
|
// TODO: make skeleton respond to collisions
|
||||||
|
//if (collision._model == &_skeletonModel && collision._jointIndex != -1) {
|
||||||
|
// _skeletonModel.applyCollision(collision);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
float Avatar::getPelvisFloatingHeight() const {
|
float Avatar::getPelvisFloatingHeight() const {
|
||||||
|
|
|
@ -219,6 +219,34 @@ float Head::getTweakedRoll() const {
|
||||||
return glm::clamp(_roll + _tweakedRoll, MIN_HEAD_ROLL, MAX_HEAD_ROLL);
|
return glm::clamp(_roll + _tweakedRoll, MIN_HEAD_ROLL, MAX_HEAD_ROLL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Head::applyCollision(ModelCollisionInfo& collisionInfo) {
|
||||||
|
// HACK: the collision proxies for the FaceModel are bad. As a temporary workaround
|
||||||
|
// we collide against a hard coded collision proxy.
|
||||||
|
// TODO: get a better collision proxy here.
|
||||||
|
const float HEAD_RADIUS = 0.15f;
|
||||||
|
const glm::vec3 HEAD_CENTER = _position;
|
||||||
|
|
||||||
|
// collide the contactPoint against the collision proxy to obtain a new penetration
|
||||||
|
// NOTE: that penetration is in opposite direction (points the way out for the point, not the sphere)
|
||||||
|
glm::vec3 penetration;
|
||||||
|
if (findPointSpherePenetration(collisionInfo._contactPoint, HEAD_CENTER, HEAD_RADIUS, penetration)) {
|
||||||
|
// compute lean angles
|
||||||
|
Avatar* owningAvatar = static_cast<Avatar*>(_owningAvatar);
|
||||||
|
glm::quat bodyRotation = owningAvatar->getOrientation();
|
||||||
|
glm::vec3 neckPosition;
|
||||||
|
if (owningAvatar->getSkeletonModel().getNeckPosition(neckPosition)) {
|
||||||
|
glm::vec3 xAxis = bodyRotation * glm::vec3(1.f, 0.f, 0.f);
|
||||||
|
glm::vec3 zAxis = bodyRotation * glm::vec3(0.f, 0.f, 1.f);
|
||||||
|
float neckLength = glm::length(_position - neckPosition);
|
||||||
|
if (neckLength > 0.f) {
|
||||||
|
float forward = glm::dot(collisionInfo._penetration, zAxis) / neckLength;
|
||||||
|
float sideways = - glm::dot(collisionInfo._penetration, xAxis) / neckLength;
|
||||||
|
addLean(sideways, forward);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Head::renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) {
|
void Head::renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) {
|
||||||
|
|
||||||
Application::getInstance()->getGlowEffect()->begin();
|
Application::getInstance()->getGlowEffect()->begin();
|
||||||
|
|
|
@ -79,6 +79,8 @@ public:
|
||||||
float getTweakedPitch() const;
|
float getTweakedPitch() const;
|
||||||
float getTweakedYaw() const;
|
float getTweakedYaw() const;
|
||||||
float getTweakedRoll() const;
|
float getTweakedRoll() const;
|
||||||
|
|
||||||
|
void applyCollision(ModelCollisionInfo& collisionInfo);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disallow copies of the Head, copy of owning Avatar is disallowed too
|
// disallow copies of the Head, copy of owning Avatar is disallowed too
|
||||||
|
|
Loading…
Reference in a new issue