关于camera仰角与俯角的问题

leechrockgames 2009-03-30 09:58:16


void LiFeng_Camera::SetViewByMouse(int w,int h,BOOL rol)
{
POINT mousePos;
int middleX = w/2;
int middleY = h/2;
float angleY = 0.0f;
float angleZ = 0.0f;
static float currentRotX = 0.0f;


GetCursorPos(&mousePos);

if( (mousePos.x == middleX) && (mousePos.y == middleY) ) return;

SetCursorPos(middleX, middleY);

angleY = (float)( (middleX - mousePos.x) ) / 500.0f;
angleZ = (float)( (middleY - mousePos.y) ) / 500.0f;

currentRotX -= angleZ;

if(rol!=m_Role)
{
m_Role = rol;
}
else
{
if(currentRotX > 2.0f) //限制仰角与俯角大小,这个应该是一个弧度值;
currentRotX = 2.0f;
else if(currentRotX < -2.0f)
currentRotX = -2.0f;

else
{
CVector3 vAxis = Cross(m_vView - m_vPosition, m_vUpVector);
vAxis = Normalize(vAxis);

if(fabs(angleZ)>=fabs(angleY))
{
RotateView(angleZ, vAxis.x, vAxis.y, vAxis.z);
}
else
{
RotateView(angleY, 0, 1, 0);
}
}
}
}





在这里有,(currentRotX )限制仰角与俯角大小,应该是一个弧度值,能不能将仰角与俯角实现360度的旋转呀?
对camera来说,Y旋转能实现360度,X旋转能不能实现呀?
请高手指点..3Q

...全文
340 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IONPhantom 2009-03-30
  • 打赏
  • 举报
回复
你的意思是像飞行模拟那样的视角吗?当然可以阿,有什么困难吗?
对于旋转来说是没有限制的,弧度和角度只是一个等比例映射而已,即使使用角度在最后生成矩阵之前转换为角度就OK阿.
旋转角度0~360 对应弧度就是0~2PI,超过360或者2PI就减一个回去不就好了
ryfdizuo 2009-03-30
  • 打赏
  • 举报
回复
我原来做过几个camera,试着改了一下angle数据,貌似不行,
一般都是正向旋转180,逆向旋转180,
闪破风浪 2009-03-30
  • 打赏
  • 举报
回复
程序上能?实际camera呢?
什么意思????
hemiya 2009-03-30
  • 打赏
  • 举报
回复
没玩过
碧螺春的马甲 2009-03-30
  • 打赏
  • 举报
回复
mark留名,因为没看懂。
leechrockgames 2009-03-30
  • 打赏
  • 举报
回复
补充:
// 计算角度
angleY = -(float)( (middleX - mousePos.x) ) / 500.0f;
angleZ = (float)( (middleY - mousePos.y) ) /500.0f;
下加一句:

currentRotX-=angleZ;//计算是否到角度的极限
leechrockgames 2009-03-30
  • 打赏
  • 举报
回复
我把代码写下,希望高手指点怎么转..3Q:

D3DXVECTOR3 LHxxNormal;//标准化后的矢量
D3DXVECTOR3 vAxis;
float currentRotX = 0.0f;

// 下面的函数的功能是通过鼠标设置视点,并绕视点转
void LHxxSETVIEW_BYMOUSE( int mx,int my,int reset,DWORD w,DWORD h,D3DXVECTOR3 &Position,
D3DXVECTOR3 &View,D3DXVECTOR3 &UpVector,
float &az,float &ay,int &Flag)
{
POINT mousePos;
if(reset>0)
{
SetCursorPos(mx,my);
}
int middleX = (GetSystemMetrics(SM_CXFULLSCREEN)-w)/2+ 1+w >> 1;
int middleY = (GetSystemMetrics(SM_CXFULLSCREEN)-h)/2+ 1+h >> 1;
float angleY = 0.0f;
float angleZ = 0.0f;

Flag=0;
// 获得鼠标的当前位置
GetCursorPos(&mousePos);
//ScreenToClient( SAVE_HWND, & mousePos );//使鼠标位置相对于窗口

// 如果鼠标位于窗口的正中央,则返回
if( (mousePos.x == middleX) && (mousePos.y == middleY) ) return;

// 设置鼠标的位置为窗口正中央
SetCursorPos(middleX, middleY);//GetSystemMetrics(SM_CXFULLSCREEN)

// 计算角度
angleY = -(float)( (middleX - mousePos.x) ) / 500.0f;
angleZ = (float)( (middleY - mousePos.y) ) /500.0f;


//极角(在这角度范围时,不产生转动(所以仰角只能90度,俯角也是))
if(currentRotX > 1.0f)//俯视极角(因为是角度,不是弧度,所以一周为3.14;)
{
currentRotX = 1.0f;
}
else if(currentRotX < - 1.0f)//仰视极角
{
currentRotX = - 1.0f;
}
// 旋转观察方向
else
{

D3DXVec3Cross(&vAxis,&(View - Position),&UpVector);
D3DXVec3Normalize(&vAxis,&vAxis);
//X旋转(俯视/仰视计算)
LHxxROTATE_VIEW(angleZ, vAxis.x, vAxis.y, vAxis.z,Position,View);
//Y旋转
LHxxROTATE_VIEW(angleY, 0, 1, 0,Position,View);
az=angleZ;
ay=angleY;
Flag=1;
}

}


// 下面的函数的功能是将摄像机的观察方向绕某个方向轴旋转一定的角度
void LHxxROTATE_VIEW(float angle, float x, float y, float z,D3DXVECTOR3 &Position,D3DXVECTOR3 &View)
{
D3DXVECTOR3 vNewView;

// 获得观察方向矢量
D3DXVECTOR3 vView = View - Position;

// 计算角度的cos和sin值
float cosTheta = (float)cosf(angle);
float sinTheta = (float)sinf(angle);

// 计算新的观察点坐标X
vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;

// 计算新的观察点坐标Y
vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;

// 计算新的观察点坐标Z
vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
View = Position + vNewView;
}



如果有现成的代码或程序可以给我不..QQ:359397187...跪谢谢.

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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