游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2524|回复: 9

跪求 第一人称视角变换 演示代码 DX版的

[复制链接]

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2006-4-22 21:03:00 | 显示全部楼层 |阅读模式

第一人称视角变换,就象CS,QUAKE里那种类型的,《在D3D中实现第一人称视角控制》一文中提到的主页,我打不开,作者又联系不到。我自己写了个,用了另一种方法,但是不对,我实在想不明白自己的方法错在哪里。故到此求分代码,有哪位大哥有这样代码的,或者热心的,谢谢传上来,或者发我邮箱:zmhn320@163.com  。

PS:我的方法,主要是用鼠标旋转视角:让look at position 围绕着 通过 eye position 的垂直于XZ平面的轴转动,旋转矩阵这样得到:我把这个矩阵分为两部分,例如 eye .position 向量 e_p,  那么这个矩阵就是         
          D3DXMatrixTranslation(&mat_tran,g_ep.x,0,g_ep.z);
  mat_tran 是第一部分;
  第二部分是一个旋转变换矩阵:
          D3DXMatrixRotationY(&mat_y,angle);
最后把两部分合在一起:
         D3DXMatrixMultiply(&mat_tran,&mat_tran,&mat_y);
  得到 mat_tran 这个转换矩阵后,就可以变换那个 look at position 了!-----这种方法实验后发现有时候可以有时候不可以。       

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-4-22 23:25:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

  大家不会这么冷漠吧????

7

主题

299

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2006-4-22 23:41:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

描述得太简单,不能看出哪里出问题

Introduction to 3D Game Programming with DirectX 9.0里面有个例子

0

主题

25

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-4-23 18:29:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

//CAM是个矩阵,用于把世界坐标系的物体变换到相机空间
Camera::Camera(CameraType cameraType)
{
        _cameraType = cameraType;

        _pos   = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
        _right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
        _up    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
        _look  = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
}

Camera::~Camera()
{

}

//============== 水平运动
void Camera::walk(float units)//========= walk 行走。。。。对应前后平移
{
        // 只在xz水平面上运动
        _pos += D3DXVECTOR3(_look.x, 0.0f, _look.z) * units;
}

void Camera::strafe(float units) //====== strafe 水平扫射。。。。对应左右平移运动
{
        // 只在xz水平面上运动
        _pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;
}

void Camera::fly(float units) //========= 对应上下平移
{
        //只在y水平面上运动
        _pos.y += units;
}

//============ 旋转运动
void Camera::pitch(float angle) //======= pitch 倾斜、倾斜度。。。。对应上下旋转
{
        D3DXMATRIX T;
        // 创建一个围绕任意轴(这里为 _right)旋转的矩阵
        D3DXMatrixRotationAxis(&T, &_right,        angle);

        // 围绕 _right旋转 _up and _look  向量
        D3DXVec3TransformCoord(&_up,&_up, &T);
        D3DXVec3TransformCoord(&_look,&_look, &T);
}

void Camera::yaw(float angle)//========== yaw 偏移、偏航。。。对应左右旋转

{
        D3DXMATRIX T;

        // 总是围绕 y (0, 1, 0) 旋转
        // 创建一个绕y轴旋转了angle角度的矩阵T
        D3DXMatrixRotationY(&T, angle);

        // 围绕 _up 或 y-轴旋转  _right and _look  向量
        // 由给定的一个矩阵来变换一个3D向量
        D3DXVec3TransformCoord(&_right,&_right, &T);
        D3DXVec3TransformCoord(&_look,&_look, &T);
}


void Camera::getViewMatrix(D3DXMATRIX* V)
{
        // Keep camera's axes orthogonal to eachother
        D3DXVec3Normalize(&_look, &_look);
        D3DXVec3Cross(&_up, &_look, &_right);

        //up也是归一化的,用于标定方向
        //pos + dir x n就等于以pos为起点,向dir方向前进n个单位
       
        //这里的dir是方向,而且必须是归一化的         D3DXVec3Normalize(&_up, &_up);
        D3DXVec3Cross(&_right, &_up, &_look);
        D3DXVec3Normalize(&_right, &_right);

        // Build the view matrix:
        float x = -D3DXVec3Dot(&_right, &_pos);

        //如果right和pos是归一化的,则表示right和pos两个矢量的夹角的cos值
       
        float y = -D3DXVec3Dot(&_up, &_pos);
        float z = -D3DXVec3Dot(&_look, &_pos);

        (*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f;

        //看做一个单位,比如就像1,n x 1 =n
        (*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f;
        (*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f;
        (*V)(3,0) = x;        (*V)(3, 1) = y;     (*V)(3, 2) = z;       (*V)(3, 3) = 1.0f;
}

0

主题

25

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-4-23 18:30:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

用SWITCH(MSG)实现按键检测:

0

主题

25

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-4-23 18:31:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

f( ::GetAsyncKeyState('W') & 0x8000f )
                        TheCamera.walk(4.0f * timeDelta);

                if( ::GetAsyncKeyState('S') & 0x8000f )
                        TheCamera.walk(-4.0f * timeDelta);

                if( ::GetAsyncKeyState('A') & 0x8000f )
                        TheCamera.strafe(-4.0f * timeDelta);

                if( ::GetAsyncKeyState('D') & 0x8000f )
                        TheCamera.strafe(4.0f * timeDelta);

                if( ::GetAsyncKeyState('R') & 0x8000f )
                        TheCamera.fly(4.0f * timeDelta);

                if( ::GetAsyncKeyState('F') & 0x8000f )
                        TheCamera.fly(-4.0f * timeDelta);

                if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
                        TheCamera.pitch(1.0f * timeDelta);

                if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
                        TheCamera.pitch(-1.0f * timeDelta);

                if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
                        TheCamera.yaw(-1.0f * timeDelta);
                       
                if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
                        TheCamera.yaw(1.0f * timeDelta);

                if( ::GetAsyncKeyState('N') & 0x8000f )
                        TheCamera.roll(1.0f * timeDelta);

                if( ::GetAsyncKeyState('M') & 0x8000f )
                        TheCamera.roll(-1.0f * timeDelta);

0

主题

25

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-4-23 18:31:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

不好意思,恩错了2次,发了3个帖子~

0

主题

25

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-4-23 18:32:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

以上的代码可以实现CS 和QUAKE的第一人称效果~

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-4-23 20:59:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

  我自己想了种方法,然后看别人文章也得到了种方法,在这里,谢谢大家了!

27

主题

409

帖子

440

积分

中级会员

Rank: 3Rank: 3

积分
440
QQ
发表于 2006-4-24 11:58:00 | 显示全部楼层

Re:跪求 第一人称视角变换 演示代码 DX版的

光线引擎 2.1a 内测版里面有“第一人称视角”的代码,在“场景漫游”示例程序中,你可以在以下地址下载:
http://light.gameres.com/light2.1a.rar
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 07:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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