【发布时间】:2021-10-24 12:20:51
【问题描述】:
我想让相机围绕对象旋转,但不将枢轴移动到它的中心。我用搅拌机制作的一个很好的例子: Link to gif(在本例中,相机围绕光标旋转,但作为示例)
所以我想要的是当我单击某个对象时,我想围绕它旋转,但没有将相机枢轴中心定位到对象位置,基本上保留屏幕上的对象位置。我发现了很多关于围绕对象中心旋转的示例,但我似乎可以找到任何解决我问题的方法。
目前我正在使用相机旋转和移动,但我不知道如何解决这个问题。我正在使用 Cinder 框架在 OpenGL 中工作。 我将不胜感激我将如何做到这一点的简单解释:)
我当前的代码:
void HandleUICameraRotate() {
//selectedObj <- object...has position etc..
float deltaX = (mMousePos.x - mInitialMousePos.x) / -100.0f;
float deltaY = (mMousePos.y - mInitialMousePos.y) / 100.0f;
// Camera direction vector
glm::vec3 mW = glm::normalize(mInitialCam.getViewDirection());
bool invertMotion = (mInitialCam.getOrientation() * mInitialCam.getWorldUp()).y < 0.0f;
// Right axis vector
vec3 mU = normalize(cross(mInitialCam.getWorldUp(), mW));
if (invertMotion) {
deltaX = -deltaX;
deltaY = -deltaY;
}
glm::vec3 rotatedVec = glm::angleAxis(deltaY, mU) * (-mInitialCam.getViewDirection() * mInitialPivotDistance);
rotatedVec = glm::angleAxis(deltaX, mInitialCam.getWorldUp()) * rotatedVec;
mCamera.setEyePoint(mInitialCam.getEyePoint() + mInitialCam.getViewDirection() * mInitialPivotDistance + rotatedVec);
mCamera.setOrientation(glm::angleAxis(deltaX, mInitialCam.getWorldUp()) * glm::angleAxis(deltaY, mU) * mInitialCam.getOrientation());
}
【问题讨论】:
-
我不明白。您想围绕对象旋转,但枢轴不是对象的中心?反正要旋转原理都是一样的:
pivot * rotate * -pivot -
“链接到 gif”是一个损坏的链接。
-
对不起,我提供了另一个链接
标签: c++ opengl graphics transformation glm-math