1

Irrlicht で WASD を使用して 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);
}

xAxisAnglezAxisAngleデフォルト値0のf32だけです。

問題は次のとおりです: WWD (元の状態にジャンプして 2 つの W を失う)

4

1 に答える 1

1

回転を適用する順序が重要であるため、オイラー角を使用して回転を混合することは常に奇妙です。四元数を使用するか、直交基底から回転行列を構築することを検討してください。これらのタスクの実行に関する情報は、インターネットやグラフィック関連の教科書にたくさんあります。

于 2013-09-11T21:25:40.797 に答える