1

我正在尝试使用 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只是 f32,默认值为 0。

现在的问题是:WWD(跳转到原始状态并丢失 2 个 W)

4

1 回答 1

1

使用欧拉角混合旋转总是很奇怪,因为应用旋转的顺序很重要。研究使用四元数或从正交基础构建旋转矩阵。在 Internet 和与图形相关的教科书中,有很多关于执行这些任务的信息。

于 2013-09-11T21:25:40.797 回答