【问题标题】:Rotate a 3D object (OSG & vc++)旋转 3D 对象(OSG 和 vc++)
【发布时间】:2011-09-02 04:15:19
【问题描述】:

我正在使用 VC++ 和 OSG 开发 3D 环境,我需要一些帮助

我正在使用下面的代码为场景的 3D 模型充电

    mueble00Node = osgDB::readNodeFile("Model/mueble_desk.3ds");
    mueble00Transform = new osg::MatrixTransform;
    mueble00Transform->setName("mueble00");
    mueble00Transform->setDataVariance(osg::Object::STATIC);
    mueble00Transform->addChild(mueble00Node);
    sceneRoot->addChild(mueble00Transform);

我尝试了一些线来旋转 3D 模型,但没有结果

谁能向我解释如何在自己的轴上旋转模型?

【问题讨论】:

  • 我通常使用PositionAttitudeTransform 而不是MatrixTransform。我发现它更容易使用。使用PAT,您可以直接使用setAttitude 方法指定循环,该方法将osg::Quad 作为参数。至于您的MatrixTransform,您没有指定旋转矩阵...

标签: c++ visual-c++ openscenegraph


【解决方案1】:

使用MatrixTransform::setMatrix() 改变子节点的方向。

MatrixTransform* transform = new osg::MatrixTransform;
const double angle = 0.8;
const Vec3d axis(0, 0, 1);
transform->setMatrix(Matrix::rotate(angle, axis));

下面是一个完整的程序,它加载和显示一个 3D 对象,添加和不添加转换。

#include <string>
#include <osg/Object>
#include <osg/Node>
#include <osg/Transform>
#include <osg/Matrix>
#include <osg/MatrixTransform>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>

using namespace osg;

int main(int argc, char** argv)
{
    if (argc != 2) {
        std::cerr << "Usage: " << argv[0] << "<file>\n";
        exit(1);
    }
    const std::string file = argv[1];

    // Load a node.
    Node* node = osgDB::readNodeFile(file);
    if (!node) {
        std::cerr << "Can't load node from file '" << file << "'\n";
        exit(1);
    }

    // Set a transform for the node.
    MatrixTransform* transform = new osg::MatrixTransform;
    const double angle = 0.8;
    const Vec3d axis(0, 0, 1);
    transform->setMatrix(Matrix::rotate(angle, axis));
    transform->setName(file);
    transform->addChild(node);

    // Add the node with and without the transform.
    Group* scene = new Group();
    scene->addChild(transform);
    scene->addChild(node);

    // Start a scene graph viewer.
    osgViewer::Viewer viewer;
    viewer.setSceneData(scene);
    viewer.setCameraManipulator(new osgGA::TrackballManipulator());
    viewer.realize();
    while (!viewer.done()) viewer.frame();
}

【讨论】:

    【解决方案2】:

    你会想要使用季铵盐

    http://www.openscenegraph.org/documentation/OpenSceneGraphReferenceDocs/a00568.html

    它有许多可用于旋转的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多