簡體   English   中英

移動相機

[英]Moving the camera

我創建了一個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;
}

問題是:如何讓相機移動到它的空間而不是在全球空間中,但仍然按它的軸旋轉?

您需要根據旋轉創建旋轉矩陣,將目標轉換為旋轉矩陣,並將新矢量添加到眼睛位置。

以下是我如何操作的示例,這將根據傳入的delta值向前或向后移動相機

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM