用鼠标移动视角有延迟

sd008009 2010-03-14 07:41:25
用鼠标移动视角有延迟,我是通过两帧的鼠标位移差来确定视角的移动,而且帧数几百帧。。。怎么弄都达不到cs那种感觉。。晃动视角就跟有加速度一样为什么啊??
...全文
364 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sd008009 2010-03-15
  • 打赏
  • 举报
回复
xy都是long型的,我一单位化,视角直接就动不了了。。
张赐 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sd008009 的回复:]
引用 3 楼 zhangci226 的回复:
可能是每次获得2帧得到的鼠标移动向量的大小都不一样

楼主单位化一下这个向量


float yawDifference = g_Input->GetMousePos().x - m_oldMousePos.x;
float pitchDifference = g_Input->GetMousePos().y - m_oldMousePo……
[/Quote]

你就把x,y值看成向量,然后单位化啊

sd008009 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xingzhe2001 的回复:]
引用 4 楼 sd008009 的回复:
float yawDifference = g_Input->GetMousePos().x - m_oldMousePos.x;
float pitchDifference = g_Input->GetMousePos().y - m_oldMousePo……
yawAngle += rotatedSpeed * yawDifference;
p……
[/Quote]
加上了,时间也是按你说的那样获得的。还是有延迟,我先试了一下cs,然后又晃了一下我程序的视角,感觉很明显,就跟有加速度一样。。。。
xingzhe2001 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sd008009 的回复:]
float yawDifference = g_Input->GetMousePos().x - m_oldMousePos.x;
float pitchDifference = g_Input->GetMousePos().y - m_oldMousePo……
yawAngle += rotatedSpeed * yawDifference;
pitchAngle += rotatedSpeed * pitchDifference;
[/Quote]

这个rotatespeed是固定的吗,如果能够根据实际的时间来变化(performance系列函数获得的精确时间),可能更平滑些?
sd008009 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangci226 的回复:]
可能是每次获得2帧得到的鼠标移动向量的大小都不一样

楼主单位化一下这个向量
[/Quote]

float yawDifference = g_Input->GetMousePos().x - m_oldMousePos.x;
float pitchDifference = g_Input->GetMousePos().y - m_oldMousePos.y;
yawAngle += rotatedSpeed * yawDifference;
pitchAngle += rotatedSpeed * pitchDifference;


这是我的部分代码,这怎么单位化啊?
张赐 2010-03-15
  • 打赏
  • 举报
回复
可能是每次获得2帧得到的鼠标移动向量的大小都不一样

楼主单位化一下这个向量
gamemagic 2010-03-15
  • 打赏
  • 举报
回复
首先检查下逻辑是否有问题,然后再用API来获得鼠标坐标。千万别用消息循环来做。
xingzhe2001 2010-03-15
  • 打赏
  • 举报
回复
太灵敏了,只用消息循环里的鼠标信息呢,也晃么?
sd008009 2010-03-15
  • 打赏
  • 举报
回复
void QuaCamera::Update(float _FlapsedTime, LPARAM lParam)
{
float deltatime = _FlapsedTime*1000;
moveSpeed = 0.2f;
moveSpeed *= deltatime;
rotatedSpeed = 0.00004f;
rotatedSpeed *= deltatime;

//如果鼠标移动了 则根据鼠标移动差量计算旋转矩阵 更新view矩阵
if(m_oldMousePos.x != g_Input->GetMousePos().x ||m_oldMousePos.y != g_Input- >GetMousePos().y )
{
POINT newpos;
GetCursorPos(&newpos);
float yawDifference = newpos.x - m_oldMousePos.x;
float pitchDifference =newpos.y - m_oldMousePos.y;
yawAngle += rotatedSpeed * yawDifference;
pitchAngle += rotatedSpeed * pitchDifference;
if(pitchAngle<-D3DX_PI/2)
pitchAngle = -D3DX_PI/2;
if(pitchAngle>D3DX_PI/2)
pitchAngle = D3DX_PI/2;
//恢复鼠标位置
g_Input->SetMousePos(400,300);
//四元数计算摄像机轴的旋转
D3DXQuaternionRotationYawPitchRoll(&cameraRotation, yawAngle, pitchAngle, rollAngle);
UpdateViewMatrix();
}
//如果按下了aswd则移动相机位置 更新view矩阵
if(g_Input->KeyDown(DIK_W) && g_Input->KeyDown(DIK_A))
AddToCameraPosition(D3DXVECTOR3(-0.707107f,0.f,0.707107f));
else if(g_Input->KeyDown(DIK_W) && g_Input->KeyDown(DIK_D))
AddToCameraPosition(D3DXVECTOR3(0.707107f,0.f,0.707107f));
else if(g_Input->KeyDown(DIK_S) && g_Input->KeyDown(DIK_A))
AddToCameraPosition(D3DXVECTOR3(-0.707107f,0.f,-0.707107f));
else if(g_Input->KeyDown(DIK_S) && g_Input->KeyDown(DIK_D))
AddToCameraPosition(D3DXVECTOR3(0.707107f,0.f,-0.707107f));
else if(g_Input->KeyDown(DIK_W))
AddToCameraPosition(D3DXVECTOR3(0,0,1));
else if(g_Input->KeyDown(DIK_S))
{
AddToCameraPosition(D3DXVECTOR3(0,0,-1));
bMovedBack = true;
}
else if(g_Input->KeyDown(DIK_A))
AddToCameraPosition(D3DXVECTOR3(-1,0,0));
else if(g_Input->KeyDown(DIK_D))
AddToCameraPosition(D3DXVECTOR3(1,0,0));
GetCursorPos(&m_oldMousePos);

}



void QuaCamera::AddToCameraPosition(D3DXVECTOR3 vectorToAdd)
{
D3DXMATRIX cameraRotated;
D3DXMatrixIdentity(&cameraRotated);
D3DXMatrixRotationQuaternion(&cameraRotated,&cameraRotation);
D3DXVECTOR3 rotatedVector;
D3DXVec3TransformNormal (&rotatedVector,&vectorToAdd,&cameraRotated);
this->eye += moveSpeed * rotatedVector;
}
张赐 2010-03-15
  • 打赏
  • 举报
回复
看来你没有把float yawDifference ,float pitchDifference当做向量来用

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧