如何解决Directx3D 11 使用旋转和平移构建世界矩阵
我想使用 wasd 来控制场景中的汽车移动。
使用 w
和 s
向前和向后移动,使用 a
和 d
旋转移动方向和汽车方向。
现在我可以使用 w 和 s 成功地向前和向后移动,并使用 a 和 d 来旋转我的车。但是,如果我同时按下 w 和 a,汽车只是在它的位置旋转,不再向前移动。
有谁知道错误在哪里?
#include "Car.h"
Car::Car()
{
}
Car::~Car()
{
if (mModel) {
delete mModel;
mModel = nullptr;
}
// if (mCamera) {
// delete mCamera;
// mCamera = nullptr;
// }
}
void Car::init(std::string modelPath)
{
mModel = new Model();
mModel->load(modelPath);
// mCamera = new Camera();
// mCamera->setPosition({ mPosition.x,mPosition.y,mPosition.z });
}
void Car::setPosition(XMFLOAT3& pos)
{
mPosition = pos;
// mCamera->setPosition({ mPosition.x,mPosition.y + 5,mPosition.z });
}
void Car::setProjection(XMMATRIX& proj)
{
mProjection = proj;
}
void Car::setView(XMMATRIX& view)
{
mView = view;
}
void Car::setPSConstantBuffer(PSConstantBuffer data)
{
mPSConstantData = data;
}
void Car::rebuildrUL()
{
XMVECTOR R = XmloadFloat3(&mRight);
XMVECTOR U = XmloadFloat3(&mUp);
XMVECTOR L = XmloadFloat3(&mLook);
L = XMVector3normalize(L);
U = XMVector3normalize(XMVector3Cross(L,R));
R = XMVector3Cross(U,L);
xmstoreFloat3(&mRight,R);
xmstoreFloat3(&mUp,U);
xmstoreFloat3(&mLook,L);
}
void Car::update(float deltaTime)
{
// mSpeed += macceleration * deltaTime;
// walk(mSpeed * deltaTime * 0.0001f);
// mCamera->updateView();
// if (mMove) {
rebuildrUL();
// std::cout << mPosition.x << "," << mPosition.y << "," << mPosition.z << std::endl;
mWorld = mRotation * XMMatrixTranslation(mPosition.x,mPosition.y + 1,mPosition.z);
// mMove = false;
// }
}
void Car::walk(float distance)
{
// std::cout << "distance: " << distance << std::endl;
XMVECTOR s = XMVectorReplicate(distance);
XMVECTOR look = XmloadFloat3(&mLook);
XMVECTOR pos = XmloadFloat3(&mPosition);
xmstoreFloat3(&mPosition,XMVectorMultiplyAdd(s,look,pos));
// rebuildrUL();
}
void Car::strafe(float distance)
{
// std::cout << "strafe: " << distance << std::endl;
XMVECTOR s = XMVectorReplicate(distance);
XMVECTOR right = XmloadFloat3(&mRight);
XMVECTOR pos = XmloadFloat3(&mPosition);
xmstoreFloat3(&mPosition,right,pos));
// rebuildrUL();
}
void Car::turn(float angle)
{
std::cout << "angle: " << angle << std::endl;
static float totalAngle = 0.0f;
totalAngle += angle;
// if (totalAngle > 3.1410f / 4.0f) {
// totalAngle = 0.0f;
// }
XMMATRIX rot = XMMatrixRotationY(totalAngle);
mRotation = rot;
xmstoreFloat3(&mRight,XMVector3Transformnormal(XmloadFloat3(&mRight),rot));
xmstoreFloat3(&mUp,XMVector3Transformnormal(XmloadFloat3(&mUp),rot));
xmstoreFloat3(&mLook,XMVector3Transformnormal(XmloadFloat3(&mLook),rot));
// rebuildrUL();
// strafe(angle);
}
void Car::draw()
{
mModel->updateMVP(
XMMatrixTranspose(mWorld),XMMatrixTranspose(mView),XMMatrixTranspose(mProjection)
);
mModel->updatePSConstantBuffer(mPSConstantData);
mModel->render();
}
void Car::processKeyboard(const bool* key_state,float delta)
{
if (key_state[VK_SHIFT]) {
mWalkSpeed = 20.0f;
} else {
mWalkSpeed = 1.0f;
}
if (key_state[VK_UP] || key_state[0x57]) {
walk(mWalkSpeed * delta * 0.005f);
// macceleration = 1.0f;
} else if (key_state[VK_DOWN] || key_state[0x53]) {
// macceleration = -1.0f;
walk(-mWalkSpeed * delta * 0.005f);
} else {
macceleration = 0;
}
if (key_state[VK_LEFT] || key_state[0x41]) {
// mRotation = - 10.0f;
turn(-mWalkSpeed * delta * 0.005f);
} else if (key_state[VK_RIGHT] || key_state[0x44]) {
// mRotation = 10.0f;
turn(mWalkSpeed * delta * 0.005f);
} else {
// turn(0);
}
}
void Car::processMouse(WParaM btnState,int x,int y)
{
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。