Blender 汽车模型 Rotate wheel turn wheel together
Blender Car Model Rotate wheel turn wheel together
我已经从 Blender 导入了一个 Benz 汽车模型到 OGRE。我正在尝试旋转轮子。
我有两个要求。像汽车运行ning一样转动车轮,并根据方向盘左右转动车轮。我可以单独完成,但是当我一起完成时,我得到了错误的结果。
在我从 Blender 导入模型之前,我基于中心为轮子制作了 4 个局部枢轴点(使用 Blender 中基于 3D 点光标选项设置枢轴点)。
在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) 单独做section 1的时候,轮子转动的很顺畅
b) 当我单独执行第 2 部分时,车轮将呈现为转动 - 好的
c) 当我同时执行第 1 部分和第 2 部分时,可以在轮子旋转和轮子转动 "turnRadius" 度的情况下进行渲染。(附图片 - A.png)
d) 但是如果我尝试在 运行 时更改 turnRadius 的值,它就会变得疯狂。
侧视图如下
我正在更改 turnRadius 的值,如下所示。我通过 UI 中的 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;
}
我明白是轴的问题。我怎样才能使它完美?我想转弯并一起旋转 "rotations"。
它正在运行。我创建了子节点并分别进行了转换。
http://www.ogre3d.org/forums/viewtopic.php?f=1&t=92364&sid=e21b8189a3defe7ae1c3c4c3b7c4cc57
我已经从 Blender 导入了一个 Benz 汽车模型到 OGRE。我正在尝试旋转轮子。
我有两个要求。像汽车运行ning一样转动车轮,并根据方向盘左右转动车轮。我可以单独完成,但是当我一起完成时,我得到了错误的结果。
在我从 Blender 导入模型之前,我基于中心为轮子制作了 4 个局部枢轴点(使用 Blender 中基于 3D 点光标选项设置枢轴点)。
在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) 单独做section 1的时候,轮子转动的很顺畅
b) 当我单独执行第 2 部分时,车轮将呈现为转动 - 好的
c) 当我同时执行第 1 部分和第 2 部分时,可以在轮子旋转和轮子转动 "turnRadius" 度的情况下进行渲染。(附图片 - A.png)
d) 但是如果我尝试在 运行 时更改 turnRadius 的值,它就会变得疯狂。
侧视图如下
我正在更改 turnRadius 的值,如下所示。我通过 UI 中的 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;
}
我明白是轴的问题。我怎样才能使它完美?我想转弯并一起旋转 "rotations"。
它正在运行。我创建了子节点并分别进行了转换。
http://www.ogre3d.org/forums/viewtopic.php?f=1&t=92364&sid=e21b8189a3defe7ae1c3c4c3b7c4cc57