游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2800|回复: 3

第一人称视角问题

[复制链接]

69

主题

335

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
发表于 2003-11-17 01:36:00 | 显示全部楼层 |阅读模式
看了gameres的Articles那片D3d的第一人称视角文章!

键盘操作的还简单!
鼠标的真难看懂。
看到鼠标前一段还能看懂,后面就一点都看不懂了!谁能给仔细讲讲,或者给我发个原代码。

谢谢。

我的email: thinbug@163.com

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20484
发表于 2003-11-17 10:11:00 | 显示全部楼层

Re:第一人称视角问题

你去跟作者联系一下,他应该会给你的,只要他还有代码的话。

13

主题

145

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2003-11-17 14:07:00 | 显示全部楼层

Re:第一人称视角问题

    float  m_fPitch;
    CDXInput   *m_Input;
        D3DXVECTOR3        m_vLook;      // Camera Look Vector
        D3DXVECTOR3        m_vUp;        // Camera Up Vector
        D3DXVECTOR3        m_vRight;     // Camera Right Vector
        D3DXVECTOR3        m_vCameraPos; // Camera Position
//-----------------------------------------------------------------------------------------------
//fElpasedTime:当前祯和上一祯的时间间隔
//fMoveSpeed:玩家的移动速度
//功能:更新视矩阵
//-----------------------------------------------------------------------------------------------
void CCamera::UpdateCamera(float fElpasedTime,float fMoveSpeed)
{
        //读取输入
        m_Input->ReadUserInput();

        DIMOUSESTATE2 diMouseState = m_Input->GetMouseState();

        D3DXMATRIX mtxRot;

    //根据鼠标让view matrix变化
        if(diMouseState.rgbButtons[0] & 0x80 )
        {
                if( diMouseState.lY != 0 )
                {
                        D3DXMatrixRotationAxis( &mtxRot, &m_vRight, D3DXToRadian( (float)diMouseState.lY / 3.0f) );
                        //m_vLook绕m_vRight旋转
                        D3DXVec3TransformCoord( &m_vLook, &m_vLook, &mtxRot );
                        //m_vUp绕m_vRight旋转
                        D3DXVec3TransformCoord( &m_vUp, &m_vUp, &mtxRot );
                }

                if( diMouseState.lX != 0 )
                {
                        float fPitchAmount = ((float)diMouseState.lX / 3.0f);
                        m_fPitch += fPitchAmount;
                        D3DXMatrixRotationAxis( &mtxRot, &D3DXVECTOR3(0,1,0), D3DXToRadian(fPitchAmount) );
                        //m_vLook绕y轴旋转
                        D3DXVec3TransformCoord( &m_vLook, &m_vLook, &mtxRot );
                        //m_vUp绕y轴旋转
                        D3DXVec3TransformCoord( &m_vUp, &m_vUp, &mtxRot );
                }
        }

        D3DXVECTOR3 tmpLook  = m_vLook;
        D3DXVECTOR3 tmpRight = m_vRight;
               

    //人物向前走
        if( m_Input->KeyDown(DIK_W) )
                m_vCameraPos += (fMoveSpeed*tmpLook)*fElpasedTime;

    //向后退
        if( m_Input->KeyDown(DIK_S) )
                m_vCameraPos -= (fMoveSpeed*tmpLook)*fElpasedTime;

        //向左走
        if( m_Input->KeyDown(DIK_A) )
                m_vCameraPos -= (fMoveSpeed*tmpRight)*fElpasedTime;

        //向右走
        if( m_Input->KeyDown(DIK_D) )
                m_vCameraPos += (fMoveSpeed*tmpRight)*fElpasedTime;

        //向上
        if( m_Input->KeyDown(DIK_HOME) )
                m_vCameraPos.y += fMoveSpeed*fElpasedTime;
       
    //向下
        if( m_Input->KeyDown(DIK_END) )
                m_vCameraPos.y -= fMoveSpeed*fElpasedTime;

        //更新视矩阵
        UpdateViewMatrix();
}

//---------------------------------------------------------------------------------------
//功能:更新视矩阵
//---------------------------------------------------------------------------------------
void CCamera::UpdateViewMatrix()
{

// 视矩阵的构成:
//
//  |   rx     ux     lx    0 |
//  |   ry     uy     ly    0 |
//  |   rz     uz     lz    0 |
//  | -(r.e) -(u.e) -(l.e)  1 |
//
//  r = Right vector
//  u = Up vector
//  l = Look vector
//  e = Eye position in world space
//  . = Dot-product operation
        D3DXMATRIX view;
        D3DXMatrixIdentity(&view);
   

        // Vector regeneration
        D3DXVec3Normalize( &m_vLook, &m_vLook );
        D3DXVec3Cross( &m_vRight, &m_vUp, &m_vLook );
        D3DXVec3Normalize( &m_vRight, &m_vRight );
        //D3DXVec3Cross( &m_vUp, &m_vLook, &m_vRight );
        D3DXVec3Normalize( &m_vUp, &m_vUp );

        // Build the view matrix
        view._11 = m_vRight.x; view._12 = m_vUp.x; view._13 = m_vLook.x;
        view._21 = m_vRight.y; view._22 = m_vUp.y; view._23 = m_vLook.y;
        view._31 = m_vRight.z; view._32 = m_vUp.z; view._33 = m_vLook.z;

        view._41 =- D3DXVec3Dot( &m_vCameraPos, &m_vRight );
        view._42 =- D3DXVec3Dot( &m_vCameraPos, &m_vUp    );
        view._43 =- D3DXVec3Dot( &m_vCameraPos, &m_vLook  );

        g_pd3dDevice->SetTransform( D3DTS_VIEW, &view );
}

13

主题

145

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2003-11-17 14:09:00 | 显示全部楼层

Re:第一人称视角问题

看着挺长,实际上我觉得是我看过结构最简单的第一人称视角控制的代码。希望能够对你有帮助,呵呵。
CDXInput是我封装的一个类。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-21 07:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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