游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2467|回复: 6

DX 中摄像机类 怎么编写 谢谢

[复制链接]

2

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2007-3-15 17:25:00 | 显示全部楼层 |阅读模式
哪个NB 人告诉小弟啊   最好把 摄像 机在 世界中 移动 的原理说下 谢谢
还 有那两个什么 角 也说下  [em24]

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-3-16 05:09:00 | 显示全部楼层

Re:DX 中摄像机类 怎么编写 谢谢

DirectX SDK里面就有Camera的类啊,直接用就可以了啊

2

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2007-3-16 12:10:00 | 显示全部楼层

Re:DX 中摄像机类 怎么编写 谢谢

想 了 解下 原理  谢谢!!

2

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2007-3-16 12:15:00 | 显示全部楼层

Re:DX 中摄像机类 怎么编写 谢谢

在 加上 英语 不 怎么 好  呵呵 !!!

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2007-3-16 19:15:00 | 显示全部楼层

Re:DX 中摄像机类 怎么编写 谢谢

看翁云兵大师的教程就行了,里面写得很清楚

2

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2007-3-16 19:41:00 | 显示全部楼层

Re:DX 中摄像机类 怎么编写 谢谢

哪里下  啊 给  个地址啊

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2007-9-5 12:24:00 | 显示全部楼层

Re:DX 中摄像机类 怎么编写 谢谢

http://bbs.gameres.com/showthread.asp?postid=467279

//Camera.h

void Vec3MulMat(D3DXVECTOR3*,D3DXVECTOR3*,D3DXMATRIXA16*);//向量乘以矩阵
void CreateViewMat(D3DXMATRIX*,D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*);//建立视矩阵
void MoveOnAxis(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,float);//沿着某个轴移动
void RotateWithAxis(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,float);//围绕某个轴旋转
class CCamera
{
public:
CCamera(float,float,float);
CCamera(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*);
void MoveByWorld(float,float,float);//按照世界坐标移动
void Move(float,float,float);//(沿着摄像机的3轴)移动
void SetPos(float,float,float);//设置摄像机的位置
D3DXVECTOR3 GetPos();//取得位置
void Rotate(float,float,float);//(围绕摄像机的3轴)旋转
void RotateByWorld(float,float,float);//围绕世界坐标系的轴旋转
D3DXMATRIX GetViewMat();//取得视变换的矩阵
private:
D3DXVECTOR3 m_Pos;
D3DXVECTOR3 m_Look;
D3DXVECTOR3 m_Up;
D3DXVECTOR3 m_Right;
void CheckRightUpLook();//重新归一化,正交化Look,Up,重新计算出Right.
};

//Camera.cpp

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <d3d9.h>
#include <d3dx9.h>
#include "Camera.h"

void Vec3MulMat(D3DXVECTOR3* ret,D3DXVECTOR3* v,D3DXMATRIX* m)
{
ret->x = v->x * m->_11 + v->y * m->_21 + v->z * m->_31;
ret->y = v->x * m->_12 + v->y * m->_22 + v->z * m->_32;
ret->z = v->x * m->_13 + v->y * m->_23 + v->z * m->_33;
}

void CreateViewMat(D3DXMATRIX* mat,D3DXVECTOR3* pos,D3DXVECTOR3* right,D3DXVECTOR3* up,D3DXVECTOR3* look)
{
mat->_11=right->x; mat->_12=up->x; mat->_13=look->x; mat->_14=0;
mat->_21=right->y; mat->_22=up->y; mat->_23=look->y; mat->_24=0;
mat->_31=right->z; mat->_32=up->z; mat->_33=look->z; mat->_34=0;
mat->_41=-D3DXVec3Dot(pos,right); mat->_42=-D3DXVec3Dot(pos,up); mat->_43=-D3DXVec3Dot(pos,look); mat->_44=1;
}

void CCamera::CheckRightUpLook()//还有另一种方法。。。
{
D3DXVec3Normalize(&m_Look,&m_Look);
m_Up=m_Up-m_Look*D3DXVec3Dot(&m_Up,&m_Look);
D3DXVec3Normalize(&m_Up,&m_Up);
D3DXVec3Cross(&m_Right,&m_Up,&m_Look);
}

void MoveOnAxis(D3DXVECTOR3* dest,D3DXVECTOR3* axis,D3DXVECTOR3* pos,float deltaS)
{
D3DXVECTOR3 tmp;
D3DXVec3Normalize(&tmp,axis);
*dest=tmp*deltaS+*pos;
}

void RotateWithAxis(D3DXVECTOR3* ret,D3DXVECTOR3* vec,D3DXVECTOR3* axis,float sita)
{
D3DXMATRIX mat;
D3DXMatrixRotationAxis(&mat,axis,sita);
Vec3MulMat(ret,vec,&mat);
}

D3DXVECTOR3 CCamera::GetPos()
{
return m_Pos;
}

void CCamera::MoveByWorld(float dx,float dy,float dz)
{
m_Pos.x+=dx;m_Pos.y+=dy;m_Pos.z+=dz;
}

void CCamera::SetPos(float x,float y,float z)
{
m_Pos.x=x;m_Pos.y=y;m_Pos.z=z;
}

void CCamera::RotateByWorld(float x,float y,float z)
{
D3DXMATRIX mat;
if(x)
{
D3DXMatrixRotationX(&mat,x);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
if(y)
{
D3DXMatrixRotationY(&mat,y);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
if(z)
{
D3DXMatrixRotationZ(&mat,z);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
}

void CCamera::Rotate(float x,float y,float z)
{
if(x)
{
RotateWithAxis(&m_Look,&m_Look,&m_Right,x);
RotateWithAxis(&m_Up,&m_Up,&m_Right,x);
}
if(y)
{
RotateWithAxis(&m_Look,&m_Look,&m_Up,y);
RotateWithAxis(&m_Up,&m_Up,&m_Up,y);
}
if(z)
{
RotateWithAxis(&m_Look,&m_Look,&m_Look,z);
RotateWithAxis(&m_Up,&m_Up,&m_Look,z);
}
CheckRightUpLook();
}

void CCamera::Move(float dx,float dy,float dz)
{
if(dx)MoveOnAxis(&m_Pos,&m_Right,&m_Pos,dx);
if(dy)MoveOnAxis(&m_Pos,&m_Up,&m_Pos,dy);
if(dz)MoveOnAxis(&m_Pos,&m_Look,&m_Pos,dz);
}

D3DXMATRIX CCamera::GetViewMat()
{
D3DXMATRIX ret;
CreateViewMat(&ret,&m_Pos,&m_Right,&m_Up,&m_Look);
return ret;
}

CCamera::CCamera(float x,float y,float z)
{
m_Pos.x=x;
m_Pos.y=y;
m_Pos.z=z;
m_Up.x=0.0f;
m_Up.y=1.0f;
m_Up.z=0.0f;
m_Look.x=0.0f;
m_Look.y=0.0f;
m_Look.z=1.0f;
m_Right.x=1.0f;
m_Right.y=0.0f;
m_Right.z=0.0f;
}

CCamera::CCamera(D3DXVECTOR3* pos,D3DXVECTOR3* look,D3DXVECTOR3* up)
{
m_Pos=*pos;
m_Up=*up;
m_Look=*look;
CheckRightUpLook();
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-18 21:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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