【问题标题】:How to rotate camera around object without centering to it如何围绕对象旋转相机而不以它为中心
【发布时间】: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


【解决方案1】:

我不完全明白你想做什么...但也许这会有所帮助...

3d 空间中的变换通过矩阵发生,有不同类型的变换矩阵(即平移、缩放、旋转……)如果你想围绕一个不是它自己的轴旋转一个对象,你将不得不将对象移动到此轴,将其旋转到此位置,然后将其移回。将发生的情况是,您将要围绕某物旋转的任何对象的坐标乘以平移矩阵,然后乘以旋转矩阵,然后再乘以平移矩阵。幸运的是,根据线性代数的规则,我们可以简单地将所有这些矩阵按顺序相乘,而不是将其与坐标相乘...

而不是这个:

translationMatrix * somePosition;

rotationMatrix * somePosition;

anotherTranslationMatrix * somePosition;

这个:

translationMatrix * rotationMatrix * anotherTranslationMatrix * somePosition;

这样解释有点模糊,但想法就在那里。这似乎需要做很多工作,但 GPU 经过高度优化以执行矩阵乘法,因此如果您成功让 GPU 执行这些操作,那么性能方面不会有问题...

如果您已经知道这一点:欢迎... 如果您不知道这一点,请研究一些线性代数,特别是:坐标空间、矩阵乘法和变换矩阵。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多