mirror of
https://github.com/overte-org/overte.git
synced 2025-08-04 06:23:35 +02:00
Fix mouse emulation picking and pointer positioning for the hydra
This commit is contained in:
parent
4e073c77b3
commit
e5bec42512
2 changed files with 32 additions and 45 deletions
|
@ -356,7 +356,7 @@ void ApplicationOverlay::displayOverlayTextureHmd(Camera& whichCamera) {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!Application::getInstance()->isMouseHidden()) {
|
if (!Application::getInstance()->isMouseHidden()) {
|
||||||
renderPointersOculus(myAvatar->getDefaultEyePosition());
|
renderPointersOculus();
|
||||||
}
|
}
|
||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
@ -486,49 +486,40 @@ void ApplicationOverlay::computeHmdPickRay(glm::vec2 cursorPos, glm::vec3& origi
|
||||||
direction = glm::normalize(intersectionWithUi - origin);
|
direction = glm::normalize(intersectionWithUi - origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glm::vec2 getPolarCoordinates(const PalmData& palm) {
|
||||||
|
MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||||
|
auto avatarOrientation = myAvatar->getOrientation();
|
||||||
|
auto eyePos = myAvatar->getDefaultEyePosition();
|
||||||
|
glm::vec3 tip = myAvatar->getLaserPointerTipPosition(&palm);
|
||||||
|
// Direction of the tip relative to the eye
|
||||||
|
glm::vec3 tipDirection = tip - eyePos;
|
||||||
|
// orient into avatar space
|
||||||
|
tipDirection = glm::inverse(avatarOrientation) * tipDirection;
|
||||||
|
// Normalize for trig functions
|
||||||
|
tipDirection = glm::normalize(tipDirection);
|
||||||
|
// Convert to polar coordinates
|
||||||
|
glm::vec2 polar(glm::atan(tipDirection.x, -tipDirection.z), glm::asin(tipDirection.y));
|
||||||
|
return polar;
|
||||||
|
}
|
||||||
|
|
||||||
//Caculate the click location using one of the sixense controllers. Scale is not applied
|
//Caculate the click location using one of the sixense controllers. Scale is not applied
|
||||||
QPoint ApplicationOverlay::getPalmClickLocation(const PalmData *palm) const {
|
QPoint ApplicationOverlay::getPalmClickLocation(const PalmData *palm) const {
|
||||||
MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
|
||||||
|
|
||||||
glm::vec3 tip = myAvatar->getLaserPointerTipPosition(palm);
|
|
||||||
glm::vec3 eyePos = myAvatar->getHead()->getEyePosition();
|
|
||||||
glm::quat invOrientation = glm::inverse(myAvatar->getOrientation());
|
|
||||||
//direction of ray goes towards camera
|
|
||||||
glm::vec3 dir = invOrientation * glm::normalize(qApp->getCamera()->getPosition() - tip);
|
|
||||||
glm::vec3 tipPos = invOrientation * (tip - eyePos);
|
|
||||||
|
|
||||||
QPoint rv;
|
QPoint rv;
|
||||||
auto canvasSize = qApp->getCanvasSize();
|
auto canvasSize = qApp->getCanvasSize();
|
||||||
if (qApp->isHMDMode()) {
|
if (qApp->isHMDMode()) {
|
||||||
float t;
|
float t;
|
||||||
|
glm::vec2 polar = getPolarCoordinates(*palm);
|
||||||
//We back the ray up by dir to ensure that it will not start inside the UI.
|
glm::vec2 point = sphericalToScreen(-polar);
|
||||||
glm::vec3 adjustedPos = tipPos - dir;
|
rv.rx() = point.x;
|
||||||
//Find intersection of crosshair ray.
|
rv.ry() = point.y;
|
||||||
if (raySphereIntersect(dir, adjustedPos, _oculusUIRadius * myAvatar->getScale(), &t)){
|
|
||||||
glm::vec3 collisionPos = adjustedPos + dir * t;
|
|
||||||
//Normalize it in case its not a radius of 1
|
|
||||||
collisionPos = glm::normalize(collisionPos);
|
|
||||||
//If we hit the back hemisphere, mark it as not a collision
|
|
||||||
if (collisionPos.z > 0) {
|
|
||||||
rv.setX(INT_MAX);
|
|
||||||
rv.setY(INT_MAX);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
float u = asin(collisionPos.x) / (_textureFov)+0.5f;
|
|
||||||
float v = 1.0 - (asin(collisionPos.y) / (_textureFov)+0.5f);
|
|
||||||
|
|
||||||
rv.setX(u * canvasSize.x);
|
|
||||||
rv.setY(v * canvasSize.y);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//if they did not click on the overlay, just set the coords to INT_MAX
|
|
||||||
rv.setX(INT_MAX);
|
|
||||||
rv.setY(INT_MAX);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
|
MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||||
glm::dmat4 projection;
|
glm::dmat4 projection;
|
||||||
qApp->getProjectionMatrix(&projection);
|
qApp->getProjectionMatrix(&projection);
|
||||||
|
glm::quat invOrientation = glm::inverse(myAvatar->getOrientation());
|
||||||
|
glm::vec3 eyePos = myAvatar->getDefaultEyePosition();
|
||||||
|
glm::vec3 tip = myAvatar->getLaserPointerTipPosition(palm);
|
||||||
|
glm::vec3 tipPos = invOrientation * (tip - eyePos);
|
||||||
|
|
||||||
glm::vec4 clipSpacePos = glm::vec4(projection * glm::dvec4(tipPos, 1.0));
|
glm::vec4 clipSpacePos = glm::vec4(projection * glm::dvec4(tipPos, 1.0));
|
||||||
glm::vec3 ndcSpacePos;
|
glm::vec3 ndcSpacePos;
|
||||||
|
@ -729,7 +720,7 @@ void ApplicationOverlay::renderControllerPointers() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplicationOverlay::renderPointersOculus(const glm::vec3& eyePos) {
|
void ApplicationOverlay::renderPointersOculus() {
|
||||||
glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_crosshairTexture));
|
glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_crosshairTexture));
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
@ -737,16 +728,12 @@ void ApplicationOverlay::renderPointersOculus(const glm::vec3& eyePos) {
|
||||||
//Controller Pointers
|
//Controller Pointers
|
||||||
MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||||
for (int i = 0; i < (int)myAvatar->getHand()->getNumPalms(); i++) {
|
for (int i = 0; i < (int)myAvatar->getHand()->getNumPalms(); i++) {
|
||||||
|
|
||||||
PalmData& palm = myAvatar->getHand()->getPalms()[i];
|
PalmData& palm = myAvatar->getHand()->getPalms()[i];
|
||||||
if (palm.isActive()) {
|
if (palm.isActive()) {
|
||||||
glm::vec3 tip = myAvatar->getLaserPointerTipPosition(&palm);
|
glm::vec2 polar = getPolarCoordinates(palm);
|
||||||
glm::vec3 tipDirection = glm::normalize(glm::inverse(myAvatar->getOrientation()) * (tip - eyePos));
|
// Convert to quaternion
|
||||||
float pitch = -glm::asin(tipDirection.y);
|
glm::quat orientation = glm::quat(glm::vec3(polar.y, -polar.x, 0.0f));
|
||||||
float yawSign = glm::sign(-tipDirection.x);
|
// Render reticle at location
|
||||||
float yaw = glm::acos(-tipDirection.z) *
|
|
||||||
((yawSign == 0.0f) ? 1.0f : yawSign);
|
|
||||||
glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0.0f));
|
|
||||||
renderReticle(orientation, _alpha);
|
renderReticle(orientation, _alpha);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ private:
|
||||||
void renderMagnifier(glm::vec2 magPos, float sizeMult, bool showBorder);
|
void renderMagnifier(glm::vec2 magPos, float sizeMult, bool showBorder);
|
||||||
|
|
||||||
void renderControllerPointers();
|
void renderControllerPointers();
|
||||||
void renderPointersOculus(const glm::vec3& eyePos);
|
void renderPointersOculus();
|
||||||
|
|
||||||
void renderAudioMeter();
|
void renderAudioMeter();
|
||||||
void renderCameraToggle();
|
void renderCameraToggle();
|
||||||
|
|
Loading…
Reference in a new issue