【问题标题】:Rotate camera relative to a point相对于一个点旋转相机
【发布时间】:2012-11-28 01:08:33
【问题描述】:

我需要从第三人称视角围绕玩家旋转相机。 (没什么花哨的)。

这是我的尝试:

// Forward, right, and position define the plane - they have x,y,z components.

void rotate ( float angle, Vector interestPoint )
{
    Vector oldForward ( Forward );

    forward = forward * cos(angle) + right * sin(angle);    
    forward.Normalize();

    right = forward.CrossProduct ( up );
    right.Normalize();

    position = ( position + old_forward * position.Distance( interestPoint ) ) - (forward * position.Distance( interestPoint ) );

    this->angle += angle;
}

问题是,如果我们说左转很多次,物体和相机之间的距离就会增加。

【问题讨论】:

  • 听起来您需要为相机与物体的距离添加另一个参数,或者可能是距离和方向?

标签: c++ graphics camera glut


【解决方案1】:

对于一个非常简单的orbit 相机,就像大多数3rd person 冒险游戏一样,你需要 4 样东西:

  • 目标的位置
  • 与目标的距离
  • 方位角
  • 极角

(如果您希望您的相机在方向上始终相对于目标,您还需要提供目标的方向,在这种情况下,我将简单地使用世界方向)

参考Spherical coordinate systems

您应该将您的方位角映射到您的水平控件上(并在您到达2 * PI 时使其循环)并且您的极角应该映射到您的垂直控件上(或者如果玩家选择该选项并使其被夹住则反转在 -PIPI 之间 - 如果你平行于它(-PIPI),请注意基于世界 Up 向量的计算

距离可以是固定的,也可以由样条线驱动,在这种情况下,我们将假设一个固定的距离。

所以,要计算你的位置,你从WorldForward开始,这是一个unit vector指向你通常认为是你的前方的轴,例如(1,0,0)(这里,如果我们正在构建一个相对相机,我们将使用目标的前向矢量),然后您将其反转 (* -1) 以“从目标”“到您的相机”。

(以下是未经测试的伪代码,但您应该了解要点 - 另外,请注意它可以简化,我只是为了清楚起见)

下一步是使用我们的方位角rotate 这个向量,这是您相机的水平方向分量。比如:

Vector toCamera = WorldForward * -1;
Matrix horizontalRotation = Matrix.CreateRotationZ(azimuth); // assuming Z is up
Vector horizontalRotationPosition = horizontalRotation.Transform(toCamera);

此时,您有一个可以围绕目标水平旋转的相机,现在要添加另一个轴,您只需使用极角旋转再次进行变换:

Matrix verticalRotation = Matrix.CreateRotationY(polar); // assuming Y is right
Vector finalRotatedVector = verticalRotation.Transform(horizontalRotationPosition);

现在,我们有一个unit vector,它指向相机应该在的位置,如果你将它乘以你想要远离目标的distance并加上你的目标位置,你应该得到你的最终position。请记住,如果取反,此单位向量表示您的相机的 forward 向量。

Vector cameraPosition = targetPosition + finalRotatedVector * distanceFromTarget;

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多