游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2354|回复: 4

怎么把鼠标的移动变为摄象机的移动?

[复制链接]

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
发表于 2007-7-21 17:28:00 | 显示全部楼层 |阅读模式
在消息处理函数中调用
void Camera::getViewMatrix(D3DXMATRIX* v)
{//keep camera's axes orthogonal to each orther
        D3DXVec3Normalize(&_look,&_look);
        D3DXVec3Cross(&_up,&_look,&_right);
        D3DXVec3Normalize(&_up,&_up);
        D3DXVec3Cross(&_right,&_up,&_look);
    D3DXVec3Normalize(&_right,&_right);
//build the view matrix
        float x = -D3DXVec3Dot(&_right,&_pos);
        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;
    (*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;

};
SetTransform( D3DTS_VIEW, v );么?
好象行不通.

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2007-7-21 19:23:00 | 显示全部楼层

Re:怎么把鼠标的移动变为摄象机的移动?

矩阵的计算方法没有错,不过里面并没有涉及到鼠标的移动呀。

用鼠标移动摄像机比较好的方法就是arcball,在graphic gems里面有介绍,dxut里面也有一个现成的实现。
如果你英文还行的话,google里面搜索arcball,可以找到很多资料。

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2007-7-21 22:32:00 | 显示全部楼层

Re:怎么把鼠标的移动变为摄象机的移动?

鼠标的移动也有的
        case WM_MOUSEMOVE:
             if (m_bDrag)
               {
                        
                if( MK_RBUTTON&wParam )
                {
                              // Compute the drag rectangle in screen coord.
                  POINT ptCursor = { (short)LOWORD(lParam), (short)HIWORD(lParam) };

                  // Update member var state
                  if( ( msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK ))

                  // Capture the mouse, so if the mouse button is
                  // released outside the window, we'll get the WM_LBUTTONUP message
                   SetCapture(hWnd);
                   if( (iMouseY-m_ptLastMouse.x)>0.0f)
                                           Z = +0.05f;
                                   if( (iMouseY-m_ptLastMouse.x)<0.0f)
                                           Z = -0.05f;

                   if((iMouseX-m_ptLastMouse.x)>0.0f)
                                           X = +0.05f;
                   if((iMouseX-m_ptLastMouse.x)<0.0f)
                       X = -0.05f;
                   g_pCamera->walk(Z);
                   g_pCamera->yaw(X);
                   g_pCamera->getViewMatrix(&matView);
                                   g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

                         }
                           }
               return 0;
......
void Camera::yaw(float angle)
{
D3DXMATRIX T;
//rotate around world y(0,1,0) always for land object
if(_cameraType==LANDOBJECT)
D3DXMatrixRotationY(&T,angle);
//rotate around up vector for aircraft
if(_cameraType==AIRCRAFT)
D3DXMatrixRotationAxis(&T,&_up,angle);
//rotate _right and _look around _up or y axis
D3DXVec3TransformCoord(&_right,&_right,&T);
D3DXVec3TransformCoord(&_look,&_look,&T);

}
......
void Camera::walk(float units)
{//move only on xz plane for land object
if(_cameraType==LANDOBJECT)
_pos+=D3DXVECTOR3(_look.x,0.0f,_look.z)*units;
if(_cameraType==AIRCRAFT)
_pos+=_look*units;
}
arcball有它的局限性,不能平移.

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2007-7-22 10:46:00 | 显示全部楼层

Re:怎么把鼠标的移动变为摄象机的移动?

抱歉,请问你要怎么样移动摄像机?是想要做成一个FPS类型的摄像机?

arcball一般是用来移动模型的,但是稍微改变一下也可以用于改变摄像机朝向,变成类似FPS的摄像机。要平移的话,鼠标操作并不是一个很好的选择。用键盘比较好。

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-7-22 14:49:00 | 显示全部楼层

Re:怎么把鼠标的移动变为摄象机的移动?

别用WindowsMessage做,用DirectInput

天哪,貌似用不着这么多矩阵算法吧……使用立体几何就可解出,只要算出看向点和眼睛的位置,再简单的得出一个从眼睛到看向点的向量就可,剩下的就是拆分这个向量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 18:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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