Use renderable target vectors to calculate translation

This commit is contained in:
Ylva Selling
2022-10-28 14:03:41 -04:00
parent f1ff3c2db3
commit 68ea36e08d
3 changed files with 24 additions and 25 deletions

View File

@@ -57,6 +57,8 @@ public:
static documentation::Documentation Documentation();
glm::dvec3 rightVector();
glm::dvec3 upVector();
private:
// Properties
properties::FloatProperty _crossHairSize;
@@ -67,6 +69,8 @@ private:
double _borderRadius = 0.0;
glm::ivec3 _borderColor = glm::ivec3(230);
float _ratio = 1.f;
glm::dvec3 _rightVector;
glm::dvec3 _upVector;
};
} // namespace openspace

View File

@@ -151,6 +151,16 @@ glm::ivec3 RenderableSkyTarget::borderColor() const {
return _borderColor;
}
glm::dvec3 RenderableSkyTarget::rightVector() {
double scaling = (_verticalFov / 70)* static_cast<double>(_size.value());
return scaling * _rightVector;
}
glm::dvec3 RenderableSkyTarget::upVector() {
double scaling = (_verticalFov / 70) * static_cast<double>(_size.value());
return scaling * _upVector;
}
void RenderableSkyTarget::render(const RenderData& data, RendererTasks&) {
ZoneScoped
const bool showRectangle = _verticalFov > _showRectangleThreshold;
@@ -175,14 +185,14 @@ void RenderableSkyTarget::render(const RenderData& data, RendererTasks&) {
);
glm::dvec3 normal = glm::normalize(data.camera.positionVec3() - objectPositionWorld);
glm::dvec3 newRight = glm::normalize(
_rightVector = glm::normalize(
glm::cross(data.camera.lookUpVectorWorldSpace(), normal)
);
glm::dvec3 newUp = glm::cross(normal, newRight);
_upVector = glm::cross(normal, _rightVector);
glm::dmat4 cameraOrientedRotation = glm::dmat4(1.0);
cameraOrientedRotation[0] = glm::dvec4(newRight, 0.0);
cameraOrientedRotation[1] = glm::dvec4(newUp, 0.0);
cameraOrientedRotation[0] = glm::dvec4(_rightVector, 0.0);
cameraOrientedRotation[1] = glm::dvec4(_upVector, 0.0);
cameraOrientedRotation[2] = glm::dvec4(normal, 0.0);
const glm::dmat4 rotationTransform = _billboard ?

View File

@@ -81,30 +81,15 @@ void TargetBrowserPair::startFinetuningTarget() {
// The fine tune of the target is a way to "drag and drop" the target with click
// drag on the sky browser window. This is to be able to drag the target around when it
// has a very small field of view
void TargetBrowserPair::fineTuneTarget(const glm::vec2& translation)
{
glm::dvec3 startTarget = skybrowser::galacticToEquatorial(
glm::normalize(_startTargetPosition)
);
glm::dvec2 multiplierRight = { -1.0, 1.0 };
glm::dvec2 multiplierLeft = { 1.0, -1.0 };
glm::dvec2 drag = glm::dvec2(translation);
glm::dvec2 fovs = _browser->fieldsOfView();
glm::dvec3 cartUpperRight = skybrowser::sphericalToCartesian(fovs * multiplierRight);
glm::dvec3 cartLowerLeft = skybrowser::sphericalToCartesian(fovs * multiplierLeft);
glm::dvec3 cartUpperLeft = skybrowser::sphericalToCartesian(fovs);
glm::dvec3 upperRightCorner = startTarget - 0.5 * cartUpperRight;
glm::dvec3 lowerLeftCorner = startTarget - 0.5 * cartLowerLeft;
glm::dvec3 upperLeftCorner = startTarget - 0.5 * cartUpperLeft;
void TargetBrowserPair::fineTuneTarget(const glm::vec2& translation) {
glm::dvec2 percentage = glm::dvec2(translation);
glm::dvec3 right = _targetRenderable->rightVector() * percentage.x;
glm::dvec3 up = _targetRenderable->upVector() * percentage.y;
glm::dvec3 vecToRight = (upperRightCorner - upperLeftCorner) * drag.x;
glm::dvec3 vecToDown = (lowerLeftCorner - upperLeftCorner) * drag.y;
glm::dvec3 newCartesian = startTarget - (vecToRight + vecToDown);
glm::dvec3 newCartesian = _startTargetPosition - (right - up);
aimTargetGalactic(
_targetNode->identifier(),
skybrowser::equatorialToGalactic(newCartesian)
newCartesian
);
}