c++ - 在 Irrlicht 中移动和旋转 SceneNode(Sphere)

标签 c++ 3d rotation geometry irrlicht

我正在尝试使用 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);
}

xAxisAnglezAxisAngle 只是默认值为 0 的 f32。

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

最佳答案

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

关于c++ - 在 Irrlicht 中移动和旋转 SceneNode(Sphere),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751473/

相关文章:

c++ - 在 GLM 旋转对象不再居中之后

ios - 仅在旋转 ios swift 时在 uiviewcontroller 中制作视频播放器景观

c++ - 从文件中获取数据并将元素输出到表中

c++ - 将数组与可变参数模板相关联

javascript - 多种形状的 3D 网格

c++ - 在 GPU 中使用八叉树组织 3D 体数据

c++ - 在 cmake 中设置最低版本的 boost

c++ - 等待另一个应用程序窗口

matlab - 将一组 (X, Y, Z) 点绘制为一个漂亮的封闭对象?

data-structures - Splay树旋转算法: Why use zig-zig and zig-zag instead of simpler rotations?