游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4364|回复: 8

FPS里面通过移动鼠标来转动视角是怎么搞的

[复制链接]

21

主题

109

帖子

127

积分

注册会员

Rank: 2

积分
127
发表于 2006-8-13 12:54:00 | 显示全部楼层 |阅读模式
[em10]

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2006-8-13 13:58:00 | 显示全部楼层

Re:FPS里面通过移动鼠标来转动视角是怎么搞的

我是用DirectInput侦测鼠标的滑动值来转动视角。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-8-14 11:01:00 | 显示全部楼层

Re:FPS里面通过移动鼠标来转动视角是怎么搞的

把摄像机的lookat看成是一个球的中心,鼠标的x轴偏移表示按照水平方向饶球的中心旋转,鼠标的y轴便宜表示按照垂直方向饶球的中心旋转。

如果是第一人称视角,则lookat和摄像机的位置重合,如果是第三人称视角,则lookat是人物的头部,而摄像机在人物的后方。

16

主题

65

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2006-8-14 17:40:00 | 显示全部楼层

Re:FPS里面通过移动鼠标来转动视角是怎么搞的

上面的说的太泛泛,楼主一定一头雾水。。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-8-14 19:53:00 | 显示全部楼层

答案

的确,2楼3楼够泛泛的,浪费GAMERES的网页资源.

方法如下:
如果窗口大小是800*600,那你把鼠标位置定在400*300上.
然后时时刻刻看这个鼠标坐标是多少,比如边成401*301了,说明鼠标是向有移动1个点,向下移动1个点. 你就用这个 1*n ,n是一个浮点常数.可以设置鼠标移动幅度.
然后
要么用 glTranslatef(1*n,0,1,0) 来旋转物体
要么把摄象机的角度 angle+=1*n
两种方法都可以的.

祝你好运!

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-8-14 23:52:00 | 显示全部楼层

Re:FPS里面通过移动鼠标来转动视角是怎么搞的

。。无语中,楼上的。

旋转物体,FPS游戏里鼠标可以旋转物体的?
摄象机角度是个什么东西?
glTranslate是用来旋转的?

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-8-15 09:22:00 | 显示全部楼层

回复给tarkey

你是不是还在认为 FPS 必须要用LOOKAT?
我可以不用LOOKAT,编写一个FPS游戏.
旋转物体,指的是旋转"除了主角以外的所有物体".
能听懂吗?

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2006-8-15 10:00:00 | 显示全部楼层

Re:FPS里面通过移动鼠标来转动视角是怎么搞的

一句话解释:球面坐标系

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2006-8-15 13:53:00 | 显示全部楼层

Re:FPS里面通过移动鼠标来转动视角是怎么搞的

简单的参考代码,别直接用,看看就可以了:
POINT cpos;
        GetCursorPos(&cpos);
        rotXY-=(float)(cpos.x-512)/2000.0f;
        rotZ-=(float)(cpos.y-400)/2000.0f;

        if(rotXY>D3DX_PI+D3DX_PI)rotXY=0;
        if(rotXY<0)rotXY=D3DX_PI+D3DX_PI;

        if(rotZ>D3DX_PI/2)rotZ=D3DX_PI/2;
        if(rotZ<-D3DX_PI/2)rotZ=-D3DX_PI/2;
        SetCursorPos(512,400);

        if(GetAsyncKeyState('A')){eyes.x+=0.5f*sin(rotXY+D3DX_PI/2);eyes.y+=0.5f*cos(rotXY+D3DX_PI/2);}
        if(GetAsyncKeyState('D')){eyes.x+=0.5f*sin(rotXY-D3DX_PI/2);eyes.y+=0.5f*cos(rotXY-D3DX_PI/2);}
        if(GetAsyncKeyState('W')){eyes.x+=0.5f*sin(rotXY);eyes.y+=0.5f*cos(rotXY);}
        if(GetAsyncKeyState('S')){eyes.x+=0.5f*sin(rotXY+D3DX_PI);eyes.y+=0.5f*cos(rotXY+D3DX_PI);}
        if(eyes.x<=0||eyes.x>=tre.GetNodeNumX()*tre.GetLayerScale())eyes.x=tre.GetNodeNumX()*tre.GetLayerScale()*0.5f;
        if(eyes.y<=0||eyes.y>=tre.GetNodeNumY()*tre.GetLayerScale())eyes.y=tre.GetNodeNumY()*tre.GetLayerScale()*0.5f;

        if(GetAsyncKeyState('Q')){rotH+=0.5f;}
        if(GetAsyncKeyState('Z')){rotH-=0.5f;}
        if(rotH<tre.GetHeightFromHMapScaled(eyes.x,eyes.y)+1.75f)rotH=tre.GetHeightFromHMapScaled(eyes.x,eyes.y)+1.75f;
        if(rotH<tre.GetMapInfo()->m_fWaterHeight+0.25f)rotH=tre.GetMapInfo()->m_fWaterHeight+1.75f;
        if(rotH>tre.GetHeightFromHMapScaled(eyes.x,eyes.y)+1000.0f)rotH=tre.GetHeightFromHMapScaled(eyes.x,eyes.y)+200.0f;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 03:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表