C++ 移动摄像机
我创建了一个摄像头,它是一个观察摄像头。我通过同时改变位置和目标位置来移动它。我还为每个轴添加了一个旋转值,这就是get矩阵的外观:C++ 移动摄像机,c++,camera,projection,direct3d,C++,Camera,Projection,Direct3d,我创建了一个摄像头,它是一个观察摄像头。我通过同时改变位置和目标位置来移动它。我还为每个轴添加了一个旋转值,这就是get矩阵的外观: 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::Ca
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;
}
问题是:如何让相机在其空间中移动,而不是在全局空间中,但仍按其轴旋转?您需要基于旋转创建旋转矩阵,将目标转换为该旋转矩阵,并将新向量添加到眼睛位置 这是一个如何操作的示例,它将根据传入的增量值向前或向后移动相机
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);
你所说的
在它的空间中移动而不是在全局空间中移动是什么意思?
?更准确地说,你想在对象空间中平移和旋转摄影机吗?如果我向左推,我想将其向左移动。此时,它在全局空间中向左移动,而不是在对象空间中。因此,摄影机的平移应取决于旋转。希望你明白我的意思,所以我不能只是旋转我的注视矩阵,我需要旋转目标,然后创建注视矩阵?或者不能创建一个我自己变换的looka t相机?所以如果你想相对于你正在看的地方移动,那么你需要看,用旋转变换它,然后将它添加到眼睛所在的当前位置。返回的值将是新的值。如果要控制移动的距离,请在变换后通过增量查看。如果你做一些编辑,我的答案中的代码应该很容易为你工作。所以我的整个想法是错误的。我不能像我想的那样移动它。(请参见我如何移动相机的代码,我只是在旧pos+pos更改中传递)因为我传递了全局坐标。我需要添加一些函数,比如左移右移+一种右移的增量?是这样的吗?那么目标位置会一直保持不变吗?我想我已经知道你的答案了。我需要通过摄影机的当前变换来变换摄影机的方向向量。(当然…)并通过该向量进行更新。所以我把代码改成了simelar在你的帖子里。谢谢你的帮助!