正如标题所说,当面向任何非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 );
答案 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矢量上面这个例子的原因)