用Vc++和opengl画图

1.真实感图形绘制(不用Opengl)(1)用多面体方法分别生成一个四面体,一个立方体,和一个球体(2)建立照相机并进行三维观察变换(3)实现消隐面运算(4)实现一中光照... 1.真实感图形绘制(不用Opengl)
(1)用多面体方法分别生成一个四面体,一个立方体,和一个球体
(2)建立照相机并进行三维观察变换
(3)实现消隐面运算
(4)实现一中光照模型下的真实感图形绘制
2.实现贝塞尔曲线,曲面(编程)和NURBS曲面(可用opengl)
3.实现一种分形方法

现在先奖励20分,如果我对答案满意另外再奖200分!
展开
 我来答
bluebaby9811
2009-02-19 · TA获得超过235个赞
知道答主
回答量:75
采纳率:0%
帮助的人:118万
展开全部
(2)建立照相机并进行三维观察变换
先做以下约定
1.坐标系:
(1)右手系,与屏幕对应:
y轴向上;
x轴向右;
z轴向外;
(2)向限规定:
a. XOY, YOZ, ZOX 三个基准平面把空间分为八个向限.
b. ZOX平面( +Y )轴方向四个向限中,YOZ平面( +X )轴方向、XOY平面( +Z )轴方向为0向限,逆时针方向依次为1,2,3向限.
c. ZOX平面( -Y )轴方向四个向限中,YOZ平面( +X )轴方向、XOY平面( +Z )轴方向为4向限,
逆时针方向依次为5,6,7向限.

3.角度规定:
(1)右手旋系,姆指指向轴的正向,其余手指弯曲的方向为旋转的正方向.
(2)方位角Azimuth,标识符A,以Y轴为轴心,+X轴为起点;
(3)仰角Elevation,标识符E,以X轴为轴心,+Z轴为起点;
(4)倾角Roll,标识符R,以Z轴为轴心,+Y轴为起点;

4.物体在物体空间中的初始坐标规定:
(1)初始位置,POS(0,0,0);
(2)初始角度,A=90,E=180,R=0;
(3)初始前向量( 0, 0, -1 );
(4)初始上向量( 0, 1, 0 );
(5)初始右向量( 0, 0, 1 );

5.求把物体变换到世界空间的世界变换矩阵M_world:
(1)绕Z轴旋转(物体当前R);
(2)绕X轴旋转(物体当前E - 物体初始E<180>);
(3)绕Y轴旋转(物体当前A - 物体初始A<90>);
(4)平移(物体当前POS);

6.求物体在世界空间的当前的向前,向上,向右向量:
(1)绕Z轴旋转(物体当前R);
(2)绕X轴旋转(物体当前E - 物体初始E<180>);
(3)绕Y轴旋转(物体当前A - 物体初始A<90>);
(4)分别用此矩阵变换物体的初始向前向量,初始向上向量,初始向右向量得到.

7.光照计算时,把光源变换到物体空间:
(1)平移(物体初始POS - 物体当前POS);
(2)绕Y轴旋转(物体初始A<90> - 物体当前A);
(3)绕X轴旋转(物体初始E<180> - 物体当前E);
(4)绕Z轴旋转(物体初始R<0> - 物体当前R);
也就是M_wrold的逆矩阵,这样物体的法向量就完全正确的了。

8.摄像机在世界空间中的初始坐标规定:
(1)初始位置,POS(0,0,0);
(2)初始角度,A=90,E=180,R=0;
(3)初始向前向量( 0, 0, -1 );
(4)初始向上向量( 0, 1, 0 );
(5)初始向右向量( 0, 0, 1 );

9.求把物体由世界空间变换到摄像机空间的摄像机变换矩阵M_camera:
(1)平移(摄像机初始POS - 摄像机当前POS);
(2)绕Y轴旋转(摄像机初始A<90> - 摄像机当前A);
(3)绕X轴旋转(摄像机初始E<180> - 摄像机当前E);
(4)绕Z轴旋转(摄像机初始R<0> - 摄像机当前R);

10.求摄像机当前的向前,向上,向右向量:
(1)绕Z轴旋转(摄像机当前R);
(2)绕X轴旋转(摄像机当前E - 摄像机初始E<180>);
(3)绕Y轴旋转(摄像机当前A - 摄像机初始A<90>);
(4)分别用此矩阵变换摄像机的初始向前向量,初始向上向量,初始向右向量得到。

11.物体的最终变换矩阵由:M_world X M_camera X M_projection 构成。

下面是我以此思想实现的照相机类:
class CCamera
{
protected:
CVertex3f m_position; //位置
float m_azimuth; //方位角
float m_elevation; //仰角
float m_roll; //转角

private:
//更新摄影机
void Update( void );

public:
CCamera(){ Initialize(); }
~CCamera(){}

//初始化摄影机
void Initialize();

/////////////////////////////
//操纵摄影机
///////////////////////////
//设置摄影机位置
void SetPosition( float x, float y, float z );
void SetPosition( CVertex3f &Pos );
//设置摄影机方位角
void SetAzimuth( float angle );
//设置摄影机仰角
void SetElevation( float angle );
//设置摄影机倾角
void SetRoll( float angle );
//跟踪空间某目标点
void Target( float targetx, float targety, float targetz );
void Target( CVertex3f &target );

//用空间信息驱动摄影机
void Drive( CSpaceInfo& SpaceInfo );

//////////////////////////////
//使用摄影机
////////////////////////////
void GetMatrix( CMatrix& matrix ); //获得变换矩阵
void GetContraryMatrix( CMatrix& matrix ); //获得逆向变换矩阵

//获得摄影机XYZ轴向量
bool GetXYZAxialVector( CVector3f* pVector );

////////////////////////////////////////
//获得摄影机各种信息
//////////////////////////////////////////
void GetPosition( CVertex3f &Pos );
float GetAzimuth();
float GetElevation();
float GetRoll();

};

//////////////////////////////////
//CCamera implement
//////////////////////////

//摄影机初始化
void CCamera::Initialize()
{
m_position.Set( 0, 0, 0 );
m_azimuth = 90;
m_elevation = 180;
m_roll = 0;
}

/////////////////////////////
//操纵摄影机
///////////////////////////
//设置摄影机位置
void CCamera::SetPosition( float x, float y, float z )
{
m_position.Set( x, y, z );
}
void CCamera::SetPosition( CVertex3f &Pos )
{
m_position.Copy( Pos );
}

//设置方位角
void CCamera::SetAzimuth( float angle )
{
m_azimuth = angle;
}

//设置仰角
void CCamera::SetElevation( float angle )
{
m_elevation = angle;

}

//设置倾角
void CCamera::SetRoll( float angle )
{
m_roll = angle;
}

//跟踪目标
void CCamera::Target( float targetx, float targety, float targetz )
{
CVertex3f target( targetx, targety, targetz );
CVector3f v( 0.0f, 0.0f, 0.0f );
m_position.GetVector( target, v );
m_azimuth = v.GetAzimuth();
m_elevation = v.GetElevation();
}
void CCamera::Target( CVertex3f &target )
{
CVector3f v( 0.0f, 0.0f, 0.0f );
m_position.GetVector( target, v );
m_azimuth = v.GetAzimuth();
m_elevation = v.GetElevation();
}

//用空间信息驱动摄影机
void CCamera::Drive( CSpaceInfo& SpaceInfo )
{
m_azimuth = SpaceInfo.m_azimuth;
m_elevation = SpaceInfo.m_elevation;
m_roll = SpaceInfo.m_roll;
m_position.Copy( SpaceInfo.m_position );

}

///////////////////////
//使用摄影机
///////////////////////////
//获得变换矩阵
void CCamera::GetMatrix( CMatrix& matrix )
{
matrix.Identity();
matrix.Translate( -m_position.X(), -m_position.Y(), -m_position.Z() );
matrix.RotateY( 90 - m_azimuth );
matrix.RotateX( 180 - m_elevation );
matrix.RotateZ( -m_roll );
}
//获得逆向变换矩阵
void CCamera::GetContraryMatrix( CMatrix& matrix )
{
matrix.Identity();
matrix.RotateZ( m_roll );
matrix.RotateX( m_elevation - 180 );
matrix.RotateY( m_azimuth - 90 );
matrix.Translate( m_position.X(), m_position.Y(), m_position.Z() );
}

//获得摄影机向前,向右,向上向量
bool CCamera::GetXYZAxialVector( CVector3f* pVector )
{
if( NULL == pVector )
{
return false;
}

pVector[0].Set( 1.0f, 0.0f, 0.0f );
pVector[1].Set( 0.0f, 1.0f, 0.0f );
pVector[2].Set( 0.0f, 0.0f, -1.0f );

CMatrix T;
T.RotateZ( m_roll );
T.RotateX( m_elevation - 180 );
T.RotateY( m_azimuth - 90.0f );

T.Transform( pVector, 3 );

return true;
}

////////////////////////////////////////
//获得摄影机各种信息
//////////////////////////////////////////
//获得摄影机位置
void CCamera::GetPosition( CVertex3f &Pos )
{
Pos.Copy( m_position );
}

//获得方位角
float CCamera::GetAzimuth( )
{
return m_azimuth;
}

//获得仰角
float CCamera::GetElevation( )
{
return m_elevation;
}

//获得倾角
float CCamera::GetRoll( )
{
return m_roll;
}
////////////////

参考资料: 这是我开发的EVOLVE引擎中的代码

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式