我想让一个摄像机围绕物体旋转,但不移动枢轴到它的中心。一个很好的例子,我用搅拌机:Link to gif(在此示例中,相机围绕光标旋转,但它作为示例工作)
所以我想要的是,当我点击某个对象时,我想围绕它旋转,但不将摄像机的中心轴对准对象的位置,基本上保持对象在屏幕上的位置。我发现了许多围绕对象中心旋转的例子,但我似乎可以找到任何解决我的问题的方法。
目前我有工作相机旋转和移动,但我不知道如何处理这一点。我在OpenGL与Cinder框架工作。我将感谢一个简单的解释,我将如何能够做到这一点:)
我的当前代码:
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());
}
2条答案
按热度按时间4dc9hkyq1#
这就是旋转的方法(请看下面代码中的
function orbit(...)
)。基本思想是围绕目标位置旋转摄像机的位置和lookAt方向。运行代码演示时,使用鼠标右键选择目标,然后移动鼠标以围绕目标旋转摄像机。
如果你需要任何澄清就打电话给我。
第一个
qnyhuwrf2#
我不太明白你想做什么...但也许这能帮上忙...
3d空间中的变换通过矩阵发生,存在不同种类的变换矩阵。(即平移、缩放、旋转......)如果你想绕着一个不属于它自己的轴旋转一个对象,你必须将对象移动到这个轴,旋转到这个位置,然后再移回来。所发生的事情是你要绕着某个东西旋转的任何对象的坐标相乘,乘以平移矩阵,然后乘以旋转矩阵,再乘以平移矩阵。幸运的是,根据线性代数的规则,我们可以简单地将所有这些矩阵按顺序相乘,然后乘以坐标...
而不是:
平移矩阵 * 某个位置;
旋转矩阵 * 某个位置;
另一平移矩阵 * 某位置;
这是:
平移矩阵 * 旋转矩阵 * 另一个平移矩阵 * 某个位置;
这样解释有点模糊,但想法是存在的。这可能看起来像是一个很大的工作,但GPU是高度优化的执行矩阵乘法,所以如果你成功地让GPU执行这些,这将不是一个问题的性能明智的...
如果您已经知道:welp...如果你不知道这一点,研究一些线性代数,具体来说:坐标空间、矩阵乘法和变换矩阵。
干杯!