游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2692|回复: 5

第一人称射击游戏视角问题,快烦死我了!!!!

[复制链接]

23

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2006-3-28 22:11:00 | 显示全部楼层 |阅读模式
我定义了
eye=D3DXVECTOR3 (0.0f,0.0f,0.0f);
at=D3DXVECTOR3 (0.0f,0.0f,1.0f);
ax=D3DXVECTOR3 (0.0f,0.0f,11.0f);

up=D3DXVECTOR3 (0.0f,1.0f,0.0f);
right=D3DXVECTOR3 (11.0f,0.0f,0.0f);
几个向量,
然后用键盘操作,想实现摄象机的旋转平移,就像第一人称射击游戏的主视角那样,

平移操作        右:BasicXFile.eye+=BasicXFile.right*1;
                    BasicXFile.at+=BasicXFile.right*1;
                 左:BasicXFile.eye-=BasicXFile.right*1;
             BasicXFile.at-=BasicXFile.right*1;
                 前:        BasicXFile.eye+=BasicXFile.ax*1;
                                BasicXFile.at+=BasicXFile.ax*1;
                  后:BasicXFile.eye-=BasicXFile.ax*1;
                       BasicXFile.at-=BasicXFile.ax*1;

旋转操作:        按z:BasicXFile.RotateY(0.1f);
         按x:BasicXFile.RotateY(-0.1f);
         
   旋转代码: void CBasicXFile::RotateY(float fAngle){
   
                 D3DXMATRIX matRotate;
        D3DXVECTOR3 staticy(0.0f,1.0f,0.0f);
               
        D3DXMatrixRotationAxis(&matRotate,&staticy,fAngle);
        D3DXVec3TransformCoord(&right,&right,&matRotate);
        D3DXVec3TransformCoord(&at,&at,&matRotate);
        D3DXVec3TransformCoord(&xup,&xup,&matRotate);
                D3DXVec3TransformCoord(&ax,&ax,&matRotate);}

摄影坐标变换3DXMATRIX viewMatrix;  
D3DXMatrixLookAtLH(&viewMatrix,&eye,&at,&up);  //取得变换矩阵
       
m_pIDirect3DDevice->SetTransform(D3DTS_VIEW,&viewMatrix);  //设置观察变换矩阵

代码就是这些 只要不做自身旋转,光平移的话没有问题,但是一旋转,再平移,上下左右就全乱了,如果再转几次的话有时候会变正确,有时候是前后移动正确,左右移动错误!!不知道为什么??

如果我在旋转代码中加入:D3DXVec3TransformCoord(&eye,&eye,&matRotate);旋转和移动全正常,但是摄象机就不做自身旋转了,而是做饶中心轴的转大圈子!!!!想了好几天也搞不明白到底是什么问题,请救救我吧 谢谢大家了!!!

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2006-3-28 23:23:00 | 显示全部楼层

Re:第一人称射击游戏视角问题,快烦死我了!!!!

问你以下几个问题:
1。什么是摄像机的摄像方向,什么是摄像机的摄像目标点?
2。当已知摄像机位置和摄像机的目标点的位置,如何得到摄像方向?
3。当已知摄像方向和摄像机的向上向量,如何得到摄像机的右方向,或者左方向?
4。当摄像机作旋转时,为什么不把这个旋转变换作用在摄像机位置向量上?
5。当摄像机移动时,摄像方向向量是否变化?
6。你的系统使用的是左手坐标系,还是右手?

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-3-29 00:25:00 | 显示全部楼层

Re:第一人称射击游戏视角问题,快烦死我了!!!!

你做没做矩阵的乘积运算啊。为什么不直接用矩阵运算呢?而要用向量运算呢?

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-3-29 00:29:00 | 显示全部楼层

Re:第一人称射击游戏视角问题,快烦死我了!!!!

看这个行不。
前天,我说 弄明白视角变换了,今天才知道原来自己错了。

今天弄第一人称视角把我累坏了,看了这里和网上介绍的都是用细节化的操作矩阵的。
原来简单的平移和旋转摄影机即可实现,在此共享。

//视角矩阵   
D3DXMATRIX matView;
D3DXMATRIX matMoveView,matMoveOut;
D3DXMatrixLookAtLH( &matView, &m_matAni.eye, &m_matAni.LookAt, &m_matAni.Up);
{
    if(m_AtView){
        D3DXMatrixTranslation(&matMoveView,m_ViewX,m_ViewY,m_ViewZ);
        D3DXMatrixMultiply(&matMoveOut,&matView,&matMoveView);
               matView = matMoveOut;
     }
}

m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView);

0

主题

237

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2006-3-29 00:45:00 | 显示全部楼层

Re:第一人称射击游戏视角问题,快烦死我了!!!!

?是??ame Programming Gems 1 ??姓?淼?PS camera, OGL???3D後的source code:

float fSinYaw   = sin(cam.vRot.y),
       fCosYaw   = cos(cam.vRot.y);
float fSinPitch = sin(cam.vRot.x),
       fCosPitch = cos(cam.vRot.x);
float fSinRoll  = sin(cam.vRot.z),
       fCosRoll  = cos(cam.vRot.z);

D3DVECTOR vFrom={cam.vPos.x,cam.vPos.y,cam.vPos.z}, vRight, vUp={0,1,0}, vDir;

vRight.x = fCosYaw  * fCosRoll + fSinYaw * fSinPitch * fSinRoll;
vRight.y = fSinRoll * fCosPitch;
vRight.z = fCosYaw  * fSinPitch * fSinRoll - fSinYaw * fCosRoll;
vUp.x = fSinYaw * fSinPitch * fCosRoll - fCosYaw * fSinRoll;
vUp.y = fCosRoll * fCosPitch;
vUp.z = fSinRoll * fSinYaw + fCosRoll * fCosYaw * fSinPitch;
vDir.x = fCosPitch * fSinYaw;
vDir.y = -fSinPitch;
vDir.z = fCosPitch * fCosYaw;
matView._11 = vRight.x;
matView._21 = vRight.y;
matView._31 = vRight.z;
matView._41 = -DotProduct(&vFrom, &vRight);
matView._12 = vUp.x;
matView._22 = vUp.y;
matView._32 = vUp.z;
matView._42 = -DotProduct(&vFrom, &vUp);
matView._13 = vDir.x;
matView._23 = vDir.y;
matView._33 = vDir.z;
matView._43 = -DotProduct(&vFrom, &vDir);
matView._14 = matView._24 = matView._34 = 0.0f;
matView._44 = 1.0f;

pd3dDevice->SetTransform( D3DTS_VIEW, &matTemp );

?卷有益.

7

主题

299

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2006-3-29 01:20:00 | 显示全部楼层

Re:第一人称射击游戏视角问题,快烦死我了!!!!

D3DXVec3TransformCoord(&eye,&eye,&matRotate);

这样当然绕y轴转啦,应该是look = (LookAtPoint - eye)这个是正方向
然后正方向转D3DXVec3TransformCoord(&look ,&look ,&matRotate);
右方向转D3DXVec3TransformCoord(&right,&right ,&matRotate);
look , right 的叉积形成上方向up

楼主的变量定义看得我有点晕
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 01:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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