Переместите и поверните SceneNode (Sphere) в Irrlicht

Я пытаюсь оживить трехмерную сферу в Ирлихте с помощью WASD. Движущаяся часть работает правильно, но вращение не работает. Пока я нажимаю только W / S или A / D, это работает. Если я их перепутаю или начинаю с другой точки, вращение вращается.

декларация

scene::ISceneNode* ballSceneNode = sceneManager->addSphereSceneNode(5);
if (ballSceneNode) {
ballSceneNode->setPosition(core::vector3df(0, 0, 100));
ballSceneNode->setMaterialTexture(0, driver->getTexture("media/ball.bmp"));
ballSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
}

Основной цикл

core::vector3df ballRotation = ballSceneNode->getRotation();
core::vector3df ballRotation = ballSceneNode->getPosition();

if(receiver.isKeyDown(irr::KEY_KEY_W)) {
ballPosition.Z += movement;
ballRotation.X++;
} else if(receiver.isKeyDown(irr::KEY_KEY_S)) {
ballPosition.Z -= movement;
ballRotation.X--;
}

if(receiver.isKeyDown(irr::KEY_KEY_A)) {
ballPosition.X -= movement;
ballRotation.Z++;
} else if(receiver.isKeyDown(irr::KEY_KEY_D)) {
ballPosition.X += movement;
ballRotation.Z--;
}

ballSceneNode->setPosition(ballPosition);
ballSceneNode->setRotation(ballRotation);

Я читал о том, что вам нужно core::matrix4 для вращения или лучше сказать, что это было бы полезно / проще и, возможно, также правильно, но я не знаю, как его использовать.

РЕДАКТИРОВАТЬ

if(receiver.isKeyDown(irr::KEY_KEY_W)) {
ballPosition.Z += movement;
cameraPosition.Z += movement;

core::quaternion test;
test.fromAngleAxis(xAxisAngle, core::vector3df(1,0,0));
xAxisAngle += 0.1f;
test.normalize();
core::vector3df rot;
test.toEuler(rot);
ballSceneNode->setRotation(rot * core::RADTODEG);
} else if(receiver.isKeyDown(irr::KEY_KEY_S)) {
ballPosition.Z -= movement;
cameraPosition.Z -= movement;

core::quaternion test;
test.fromAngleAxis(xAxisAngle, core::vector3df(1,0,0));
xAxisAngle -= 0.1f;
test.normalize();
core::vector3df rot;
test.toEuler(rot);
ballSceneNode->setRotation(rot * core::RADTODEG);
}

if(receiver.isKeyDown(irr::KEY_KEY_A)) {
ballPosition.X -= movement;
cameraPosition.X -= movement;

core::quaternion test;
test.fromAngleAxis(zAxisAngle, core::vector3df(0,0,1));
zAxisAngle += 0.1f;
test.normalize();
core::vector3df rot;
test.toEuler(rot);
ballSceneNode->setRotation(rot * core::RADTODEG);
} else if(receiver.isKeyDown(irr::KEY_KEY_D)) {
ballPosition.X += movement;
cameraPosition.X += movement;

core::quaternion test;
test.fromAngleAxis(zAxisAngle, core::vector3df(0,0,1));
zAxisAngle -= 0.1f;
test.normalize();
core::vector3df rot;
test.toEuler(rot);
ballSceneNode->setRotation(rot * core::RADTODEG);
}

xAxisAngle а также zAxisAngle просто F32 со значением по умолчанию 0.

Теперь проблема заключается в следующем:
W W D (переход в исходное состояние и потеря 2 W)

1

Решение

Смешивание поворотов с использованием углов Эйлера всегда странно, потому что порядок, в котором вы применяете повороты, имеет значение. Изучите использование кватернионов или построение матрицы вращения на основе ортогональности. Существует много информации о выполнении этих задач в Интернете и в учебниках, связанных с графикой.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]