这是自己写的一个摄像机类,但是在调用的时候,按键操作没办法实现,希望高手能帮忙下!!

lijie8680293 2008-10-12 11:11:42

#include "stdafx.h"
#include "Camera.h"
#include <zmouse.h>

CCamera::CCamera()
{
m_Pos = D3DXVECTOR3(0.0f, 0.0f, 0.0f); //位置
m_LookAt = D3DXVECTOR3(0.0f, 0.0f, 1.0f);//视点
m_Up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);//正方向

m_fNear = 0.0f; //近平面
m_fFar = 0.0f; //远平面
m_fFOV = 0.0f; //FOV夹角
m_fAspect = 0.0f; //纵横比

m_bIsTrans = false; //是否平移
m_vDelta = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
m_fVelocity = 0.01f; //移动速度

m_bIsRot = false; //是否发生旋转
m_fMaxPitch = D3DX_PI*0.49f;
m_fMinPitch = (-D3DX_PI*0.49f); //最小俯仰角
}

CCamera::~CCamera()
{

}

//设置视图矩阵
void CCamera::SetViewParam(D3DXVECTOR3& vPos, D3DXVECTOR3& vLookAt, D3DXVECTOR3& vUp)
{
m_Pos = vPos;
m_LookAt = vLookAt;
m_Up = vUp;
m_Direction = vLookAt-vPos;

D3DXVec3Normalize(&m_Direction,&m_Direction);
D3DXVec3Cross(&m_Right,&m_Up,&m_Direction);

D3DXMatrixLookAtLH(&m_View,&m_Pos,&m_LookAt,&m_Up);

D3DXMATRIX invView;
D3DXMatrixInverse(&invView,0,&m_View);

D3DXVECTOR3 * pZBasis = (D3DXVECTOR3*)&invView._31;

m_fYaw = atan2f(pZBasis->x,pZBasis->z);
float fLen = sqrtf(pZBasis->z*pZBasis->z+pZBasis->x*pZBasis->x);
m_Pitch = -atan2f(pZBasis->y,fLen);
}

//设置投影矩阵
void CCamera::SetProjMatrix(float fFov,float fAspect,float fNear,float fFar)
{
m_fFOV = fFov;
m_fAspect = fAspect;
m_fNear = fNear;
m_fFar = fFar;

D3DXMatrixPerspectiveFovLH(&m_Project,fFov,fAspect,fNear,fFar);
}

//获取视图与投影矩阵
D3DXMATRIX* CCamera::GetViewMatrix(void)
{
return &m_View;
}
D3DXMATRIX* CCamera::GetProjMatrix(void)
{
return &m_Project;
}

//摄象机的平移控制
void CCamera::SetVelocity(float fVelocity)
{
m_fVelocity = fVelocity;
}

void CCamera::ProcessKey(float fElapsedTime)
{
m_vDelta = D3DXVECTOR3(0.f,0.f,0.f);
float fDis = m_fVelocity * fElapsedTime;

if( GetKeyState('W') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.z += fDis;
}
if( GetKeyState('S') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.z -= fDis;
}
if( GetKeyState('A') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.x -= fDis;
}
if( GetKeyState('D') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.x += fDis;
}
if( GetKeyState(VK_HOME) & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.y += fDis;
}
if( GetKeyState(VK_END) & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.y -= fDis;
}
}

//摄象机的旋转
LRESULT CCamera::HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_LBUTTONDOWN:
m_bIsRot = true;
SetCapture(hWnd);
GetCursorPos(&m_LastPoint);
break;
case WM_LBUTTONUP:
m_bIsRot = false;
ReleaseCapture();
break;
}
return 0;
}

//更新摄象机
void CCamera::Update(void)
{
POINT ptCurrentPos = {0, 0};
POINT ptDeltaPos = {0, 0};

GetCursorPos(&ptCurrentPos);
ptCurrentPos.x = ptCurrentPos.x-m_LastPoint.x;
ptCurrentPos.y = ptCurrentPos.y-m_LastPoint.y;
m_LastPoint = ptCurrentPos;

float fYaw = ptDeltaPos.x*0.01f;
float fPitch = ptDeltaPos.y*0.01f;

if (m_bIsRot)
{
m_fYaw +=fYaw;
m_Pitch+=fPitch;
}
if (m_Pitch<-D3DX_PI*0.5f)
{
m_Pitch=-D3DX_PI*0.5f;
}
else if (m_Pitch>D3DX_PI*0.5f)
{
m_Pitch = D3DX_PI*0.5f;
}


D3DXMATRIX matCamera;
ZeroMemory(&matCamera,sizeof(D3DXMATRIX));
D3DXMatrixRotationYawPitchRoll(&matCamera,m_fYaw,m_Pitch,0);
D3DXVECTOR3 vUp,vDirection;
D3DXVec3TransformCoord(&vUp,&D3DXVECTOR3(0,1,0),&matCamera);
D3DXVec3TransformCoord(&vDirection,&D3DXVECTOR3(0,0,1),&matCamera);

if (m_bIsTrans)
{
D3DXVECTOR3 vPosDelta;
D3DXVec3TransformCoord( &vPosDelta, &m_vDelta, &matCamera);
m_Pos += vPosDelta;
}

m_LookAt = m_Pos + vDirection;
D3DXMatrixLookAtLH( &m_View, &m_Pos, &m_LookAt, &m_Up );
m_Direction = m_LookAt - m_Pos;
m_Up = vUp;
D3DXVec3Cross( &m_Right, &vUp,&m_Direction );
}

//获取设备指针
void CCamera::ApplyDevice(LPDIRECT3DDEVICE9 pDevice )
{
if( pDevice )
{
pDevice->SetTransform(D3DTS_VIEW, &m_View);
pDevice->SetTransform(D3DTS_PROJECTION, &m_Project);
}
}
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
frp529 2008-10-13
  • 打赏
  • 举报
回复
你写的太乱了首先你得要确定要写什么类型Camera是自由还是跟随键盘消息可以用win32消息或者DXINPUT
如果自由的话就是行走 m_vPos += Look * dis; 扫视 m_vPos += Right * dis; 升降 m_vPos += up * dis;
旋转部分仰俯哪两个依次类推
void Camera::rotatVer(float angle)
{
D3DXMATRIXA16 matWorld;
D3DXMatrixRotationAxis(&matWorld,&_vRight,angle);
D3DXVec3TransformCoord(&_vLookat,&_vLookat,&matWorld);
D3DXVec3TransformCoord(&_vUp,&_vUp,&matWorld);
}
你得Camera写的太乱了我没仔细看建议把正交化写在Update()里面因为每一次调用都要重新设置View和PROJECTION矩阵而且会设计到Frustum我好像没有看到你把3x3的矩阵扩充为4x4。



dirdirdir3 2008-10-13
  • 打赏
  • 举报
回复
哪里出错,错误描述都不清楚
e_sharp 2008-10-13
  • 打赏
  • 举报
回复
帮顶 up
qqwx_1986 2008-10-13
  • 打赏
  • 举报
回复
很长 也不知道你哪里有问题
友情帮顶了
lijie8680293 2008-10-13
  • 打赏
  • 举报
回复
晕死,怎么没人回啊
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧