Блендер Модель автомобиля Вращайте колесо, поворачивайте колесо вместе

Я импортировал модель автомобиля Benz из Blender в OGRE. Я пытаюсь вращать колеса.

У меня есть 2 требования. Вращайте руль, как будто машина движется, и вращайте руль влево и вправо, когда он поворачивается, опираясь на руль. Я могу успешно делать это по отдельности, но когда я делаю это вместе, я получаю неправильные результаты.

Прежде чем я импортировал модель из Blender, я сделал 4 локальные точки поворота для колес на основе центра (используя параметр «Установить точку поворота на основе 3D-точки курсора» в Blender).

В OGRE, после того, как я импортировал модель, я проанализировал весь диспетчер сцен и нашел 4 узла колеса и назвал их левым передним, левым задним, правым передним и правым задним узлами. Это как показано ниже.

 void ogreWindow::makeNodes( )
  {
    Ogre::SceneNode::ChildNodeIterator it = mSceneMgr->getRootSceneNode()-  
    >getChildIterator();
     QString _name;
while (it.hasMoreElements())
{
    Ogre::Node* node_ = it.getNext();
    Ogre::String _name=node_->getName();
    QString ssss = QString::fromUtf8(_name.c_str());
    qDebug()<<"Entities are "<<ssss;
    if(ssss=="WheelRightBack_transform2")
    {
        rotateNodeBackWheel_Right =   mSceneMgr->getSceneNode("WheelRightBack_transform2");
        m_RotateWheeel = true;
    }
    if(ssss=="WheelleftBack_transform12")
    {
        rotateNodeBackWheel_Left =   mSceneMgr->getSceneNode("WheelleftBack_transform12");
        m_RotateWheeel = true;
    }
    if(ssss=="Wheel_LeftFront_transform15")
    {
        rotateNodeFrontWheel_Right =   mSceneMgr->getSceneNode("Wheel_LeftFront_transform15");
        turnNodeFrontWheel_Right =   mSceneMgr->getSceneNode("Wheel_LeftFront_transform15");

        m_RotateWheeel = true;
    }
    if(ssss=="WheelRightFront_transform3")
    {
        rotateNodeFrontWheel_Left =   mSceneMgr->getSceneNode("WheelRightFront_transform3");
        turnNodeFrontWheel_Left =   mSceneMgr->getSceneNode("WheelRightFront_transform3");
        m_RotateWheeel = true;
    } 
}

}

Затем в функции framerenderingQueued я бесконечно вызываю функцию поворота, как показано ниже:

bool ogreWindow::frameRenderingQueued(const Ogre::FrameEvent& fe)
{

                  if(m_RotateWheeel)
                          {
                         RotateWheel();
                          }
                      .......
                       .......
 }

Где rotateWheel(), как показано ниже

void ogreWindow::RotateWheel()
{


//Working with Euler rotation

//Section 1
if(rotateNodeBackWheel_Left)
    rotateNodeBackWheel_Left->yaw(Ogre::Radian(0.01),Ogre::Node::TransformSpace::TS_LOCAL);
if(rotateNodeBackWheel_Right)
    rotateNodeBackWheel_Right->yaw(Ogre::Radian(0.01),Ogre::Node::TransformSpace::TS_LOCAL);
if(rotateNodeFrontWheel_Left)
    rotateNodeFrontWheel_Left->yaw(Ogre::Radian(0.01),Ogre::Node::TransformSpace::TS_LOCAL);
if(rotateNodeFrontWheel_Right)
    rotateNodeFrontWheel_Right->yaw(Ogre::Radian(0.01),Ogre::Node::TransformSpace::TS_LOCAL);

//Section 2
if(isTurning)
{
    if(rotateNodeFrontWheel_Right)
        rotateNodeFrontWheel_Right->roll(Ogre::Radian(turningRadius),Ogre::Node::TransformSpace::TS_LOCAL);

    if(rotateNodeFrontWheel_Right)
        rotateNodeFrontWheel_Right->roll(Ogre::Radian(turningRadius),Ogre::Node::TransformSpace::TS_LOCAL);
}    

isTurning = false;
}

Итак, проблемы, с которыми я сталкиваюсь, описаны ниже,

a) Когда я выполняю раздел 1 отдельно, колесо вращается плавно b) Когда я выполняю только раздел 2, колесо будет визуализироваться как повернутое - хорошо, хорошо c) Когда я выполняю раздел 1 и раздел 2 вместе, OK, это визуализируется с помощью колесо вращается, и колесо поворачивается в градусах «turnRadius». (Изображение прилагается-A.png) src="https://i.stack.imgur.com/fmGy0.png" alt="введите здесь описание изображения">

d) Но если я попытаюсь изменить значение turnRadius во время выполнения, это сходит с ума. введите здесь описание изображения

Вид сбоку выглядит следующим образом: введите здесь описание изображения

Я меняю значение turnRadius, как показано ниже. Я вызываю эту функцию из 2 нажатий кнопки из пользовательского интерфейса.

 void ogreWindow::turnFrontWheelLeft(Ogre::Real radius)
{
//turningRadius-=0.1;
turningRadius = -0.1;
isTurning = true;

 }

 void ogreWindow::turnFrontWheelRight(Ogre::Real radius)
 {
  //turningRadius+=0.1;
  turningRadius = 0.1;
  isTurning = true;
 }

Я так понимаю проблема в оси. Как я могу сделать его идеальным? Я хочу делать поворот и вращать «вращения» вместе.


person Nidhin KR    schedule 16.03.2017    source источник
comment
Я не могу создать учетную запись на форуме OGRE. После регистрации мне не приходит активационное письмо. Так что я надеюсь, что это переполнение стека.   -  person Nidhin KR    schedule 16.03.2017
comment
Нет ничего плохого в том, чтобы разместить здесь вопрос об OGRE. Не нужно беспокоиться.   -  person javaLover    schedule 18.03.2017


Ответы (1)


Сейчас это работает. Я создал подузлы и сделал преобразования отдельно.

http://www.ogre3d.org/forums/viewtopic.php?f=1&t=92364&sid=e21b8189a3defe7ae1c3c4c3b7c4cc57

person Nidhin KR    schedule 20.03.2017