除非旋转为0或180度,否则物体不会朝向其朝向的方向移动

时间:2012-03-08 05:21:13

标签: c++ vector 3d matrix rotation

正如标题所说,当面向任何非0或180度的方向时,物体不能正确移动。这是在3D空间中,但旋转仅在1轴(向上)上,因此对象左右转动。 这是一个帮助可视化问题的绘图:http://dl.dropbox.com/u/60309894/rotationissue.png 按住鼠标右键的同时,对象根据鼠标的x delta位置旋转。 这是代码:

// Check & calculate rotation.
if (mouse->ButtonIsDown(NiInputMouse::NIM_RIGHT))
{
    int iDeltaX = 0, iDeltaY = 0, iDeltaZ = 0;
    mouse->GetPositionDelta(iDeltaX,iDeltaY,iDeltaZ);
    if (iDeltaX != 0)
    {
        NiMatrix3 mMat;
        mMat.MakeRotation(iDeltaX / 100.0f,NiPoint3::UNIT_Z);
        SetRotate(  GetRotate() * mMat  );
    }
}

// Check & calculate movement.
m_vVelocity = NiPoint3::ZERO;
if ( keyboard->KeyIsDown(NiInputKeyboard::KEY_W) == true)
    m_vVelocity.y++;
if ( keyboard->KeyIsDown(NiInputKeyboard::KEY_S) == true)
    m_vVelocity.y-- ;
if ( keyboard->KeyIsDown(NiInputKeyboard::KEY_A) == true)
    m_vVelocity.x--;
if ( keyboard->KeyIsDown(NiInputKeyboard::KEY_D) == true)
    m_vVelocity.x++;
m_vVelocity.Unitize();

// Move the object.
m_spNode->SetTranslate(GetTranslate() + m_vVelocity * GetRotate() * m_fSpeed * dt );

2 个答案:

答案 0 :(得分:1)

假设X在示例图像中左右,看起来只是你的x速度被否定了。如果这是真的,那么交换左右方向,或者否定x速度,应该修复它:

if ( keyboard->KeyIsDown(NiInputKeyboard::KEY_A) == true)
    m_vVelocity.x++;
if ( keyboard->KeyIsDown(NiInputKeyboard::KEY_D) == true)
    m_vVelocity.x--;

假设z不在显示器中,这将对应于左手坐标系与原始代码中的右手坐标系相对应。

答案 1 :(得分:0)

我会假设GetRotate()返回一个2D矢量(或3D,只要z无关紧要,并不重要)表示旋转的x和y分量。如果是这样,您在设置翻译时可能需要不同的方法。这是因为m_vVelocity似乎是对象的局部(即正y是向前的,但取决于对象的旋转)。

以下内容适用于您:

GetRotate()

乘以m_vVelocity.y

接下来,获取GetRotate()返回的向量的法线。将此向量乘以m_vVelocity.x

将这两个向量一起添加以获得最终的相对平移向量。所以现在你得到类似的东西:

// Move the object.
Vector2f forwardVec = GetRotate() * m_vVelocity.y;
Vector2f sideVec    = GetRotate().GetNormal() * m_vVelocity.x;
// Obviously above you need a real method to get the normal of GetRotate,
// I used a "pseudo" method.
m_spNode->SetTranslate(GetTranslate() + forwardVec + sideVec );

编辑:请记住找到矢量法线的方法从2D空间到3D空间不同(3D空间中的单个矢量没有单一定义的法线,但是在2D空间中,我使用了2D矢量上面这个例子的原因)