【问题标题】:Moving the camera移动相机
【发布时间】:2014-04-27 12:29:18
【问题描述】:

我创建了一个 LookAt 相机。我确实通过同时改变位置和目标位置来移动它。我还为每个轴添加了一个旋转值,这就是 get Matrix 的样子:

Camera::Camera() : m_pos(XMFLOAT3(0.0f, 0.0f, 0.0f)), m_target(XMFLOAT3(0.0f, 0.0f, 0.0f)), m_upVec(XMFLOAT3(0.0f, 1.0f, 0.0f)), m_rotation(XMFLOAT3(0.0f, 0.0f, 0.0f))
{
}

Camera::Camera(XMFLOAT3 position, XMFLOAT3 target) : m_pos(position), m_target(target), m_upVec(XMFLOAT3(0.0f, 1.0f, 0.0f))
{

}
Camera::~Camera()
{
}

XMMATRIX Camera::getViewMatrix()
{
    XMMATRIX lookAt = XMMatrixLookAtLH(XMLoadFloat3(&m_pos), XMLoadFloat3(&m_target), XMLoadFloat3(&m_upVec));
    //XMMATRIX translation = XMMatrixTranslation(m_pos.x, m_pos.y, m_pos.z); //tryed adding this
    XMMATRIX rotationX = XMMatrixRotationX(m_rotation.x);
    XMMATRIX rotationY = XMMatrixRotationY(m_rotation.y);
    XMMATRIX rotationZ = XMMatrixRotationZ(m_rotation.z);
    return lookAt * rotationX * rotationY * rotationZ;
}

void Camera::setPos(XMFLOAT3 pos, XMFLOAT3 target)
{
    m_target = target;
    m_pos = pos;
}

void Camera::setRotation(XMFLOAT3 rot)
{
    m_rotation = rot;
}

XMFLOAT3 Camera::getPosition()
{
    return m_pos;
}

XMFLOAT3 Camera::getRotation()
{
    return m_rotation;
}

XMFLOAT3 Camera::getTarget()
{
    return m_target;
}

我正在尝试根据其位置移动相机,但它始终沿轴移动。不在“它的坐标系”中。

这是一个移动和旋转的例子:

if (m_keyBoardKeys[DIK_UP] & 0x80)
{
    m_camera->setPos(XMFLOAT3(m_camera->getPosition().x,
                              m_camera->getPosition().y - movementspeed*delta, m_camera->getPosition().z),
                     XMFLOAT3(m_camera->getTarget().x, m_camera->getTarget().y - movementspeed*delta,
                              m_camera->getTarget().z));
}

//check if pressed
if (m_keyBoardKeys[DIK_C] & 0x80)
{
    m_camera->setRotation(XMFLOAT3(m_camera->getRotation().x,
                                   m_camera->getRotation().y + movementspeed*delta/4, m_camera->getRotation().z));
}

这个矩阵在每个渲染周期都被添加到着色器中并且相乘正确。

PS_Input VS_Main(VS_Input vertex)
{
    PS_Input vsOut = (PS_Input)0;
    float4 worldPos = mul(vertex.pos, worldMatrix); //rotation and position of the current rendered object
    vsOut.pos = mul(worldPos, viewMatrix); // camera matrix
    vsOut.pos = mul(vsOut.pos, projMatrix); // perspective projection matrix

    vsOut.tex0 = vertex.tex0;
    vsOut.norm = mul(vertex.norm, (float3x3)worldMatrix);
    vsOut.norm = normalize(vsOut.norm);

    float3 lightPos = float3(0.0f, 500.0f, 50.0f);
        vsOut.lightVec = normalize(lightPos - worldPos);

    vsOut.viewVec = normalize(cameraPos - worldPos);

    return vsOut;
}

问题是:如何让相机在它的空间而不是在全局空间中移动,但仍然按它的轴旋转?

【问题讨论】:

  • move in it's space not in global space 是什么意思?
  • 更准确地说,您想在对象空间中平移和旋转相机吗?
  • 如果我向左推,我想把它向左移动。目前它在全局空间而不是在对象空间中向左移动。所以相机的平移应该取决于旋转。希望你明白我的意思

标签: c++ camera projection direct3d


【解决方案1】:

您需要根据旋转创建一个旋转矩阵,将目标转换为该旋转矩阵,并将该新向量添加到眼睛位置。

这是我如何操作的示例,这将根据传入的增量值向前或向后移动相机

XMVECTOR Pos = XMVectorSet( this->pos.x, this->pos.y, this->pos.z, this->pos.w );
XMVECTOR At = XMVectorSet(  this->targetMagnitude.x , this->targetMagnitude.y, this->targetMagnitude.z, this->targetMagnitude.w );

XMMATRIX RotationMatrix( XMMatrixRotationRollPitchYaw( this->RadianPitch , this->RadianYaw, this->RadianRoll ));

At = XMVector3TransformCoord( At, RotationMatrix );
At = XMVector4Normalize(At);
Pos += At * delta;
XMStoreFloat4(&this->pos, Pos);

【讨论】:

  • 所以我不能只旋转我的 LookAt 矩阵,我需要旋转目标然后创建 LookAt 矩阵?或者不能创建一个我自己改造的外观相机?
  • 所以如果你想相对于你正在看的地方移动,那么你需要把你的目光,用旋转变换它,然后将它添加到眼睛所在的当前位置。返回的值将是新的眼睛值。如果你想控制移动的距离,那么在你变换它之后,它会被 delta 查看。如果您进行一些编辑,我的答案中的代码应该很容易为您工作。
  • 所以我的整个想法都是错误的。我不能像我想的那样移动它。 (请参阅我如何移动相机的代码,我只是传入旧的 pos + pos 更改)因为我传入了全局坐标。我需要添加诸如左移右移之类的功能+向右移动的一种增量?会是这样吗:pastebin.com/Gv6PBcKG?目标位置总是一样的呢?
  • 你的回答我想我明白了。我需要通过相机的当前变换来变换相机的方向向量。 (当然 .... )并通过该向量更新它。所以我将我的代码更改为与您的帖子类似的内容。感谢您的帮助!
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多