我正在尝试使用 WASD 在 Irrlicht 中为 3D 球体制作动画。移动部分工作正常,但旋转不工作。只要我只按 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
只是默认值为 0 的 f32。
现在的问题是: W W D(跳到原始状态并失去 2 个 W)
最佳答案
使用欧拉角混合旋转总是很奇怪,因为应用旋转的顺序很重要。研究使用四元数或从正交基础构建旋转矩阵。在 Internet 和图形相关教科书中有很多关于执行这些任务的信息。
关于c++ - 在 Irrlicht 中移动和旋转 SceneNode(Sphere),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751473/