手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

VC .NETOpenGL编程快速入门

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

glCullFace( GL_BACK );

glEnable( GL_DEPTH_TEST ); //无论绘制的先后,让距离远的物体总在距离近的物体后面。
glDepthFunc( GL_LEQUAL );

int LightPos[] = { 50, 50, 10, 1 }; // 最后一个指定这是一个无指向的点光源
float LightColor[] = { 0.3f, 0.3f, 0.3f, 1.0f }; // 1.0是最亮,0.3看起来并不那么刺眼
glEnable(GL_LIGHTING); // 打开光照状态,除非人为改变,该状态将一直保留到程序退出
glLightiv( GL_LIGHT0, GL_POSITION, LightPos ); // 设置灯光位置
glLightfv( GL_LIGHT0, GL_AMBIENT, LightColor ); // 环境色
glLightfv( GL_LIGHT0, GL_DIFFUSE, LightColor ); // 散射色
glEnable( GL_LIGHT0 ); // 打开第一个光源,你一共可以开8个
glEnable( GL_COLOR_MATERIAL ); //打开颜色材质
glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ); // 我们可以为物体指定颜色
glShadeModel( GL_SMOOTH ); // 启用光滑的着色
glClearColor( 255.0f / 255.0f, 255.0f / 255.0f, 200.0f / 255.0f, 0.0 ); // 背景色
glColor3ub( 140, 200, 255 ); // 填充色
  这里要稍带一提的是OpenGL是一种状态机模式,比如你用glEnable打开一个状态,在以后的绘图中将一直保留并应用这个状态,除非你调用glDisable及同类函数来改变该状态或程序退出。OpenGL绝大多数函数都是一种状态机,比如你设置了当前的纹理,那么纹理将不会自动改变。


  下面要讲一些理论的东西了,请不要感到厌烦,因为如果没有这些知识,我们的三维教程将很难进行下去。为了方便的描述三维场景中物体的旋转、平移、缩放等空间变换操作,我们引入三维变换矩阵的概念。这是一个4X4的矩阵,当然单位矩阵的对角线上的值都是1了。看这貌似平凡的矩阵,里面却蕴藏着无数的神奇。比如在笛卡尔坐标系中有一个空间点,坐标是10, 10, 10,现在你想把这一点平移5, -2, 8个单位,那么你只需要将变换矩阵最后一行的前三列的值为别赋为5、-2和8再将空间点的坐标做为一个4X1的矩阵,最后一列补0再与变换矩阵求积(什么?你不会算矩阵相乘?!我倒!),得到的4X1矩阵的前三列值便是变换过的空间点坐标的X、Y和Z。同样的旋转、缩放也是大致的方法,区别仅在于变换矩阵里不同位置的值代表不同的含义。

  现在我们将开始绘图。先确定一下视角:

// 设置模形矩阵
void SetModalMatrix( void )
{
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( ); // 单位化矩阵
// 这个函数是在OnIdle里被调用的,所以我们用下面的代码来实现物体的旋转
// 一个很容易理解的概念是,你绕着物体转和物体自己转在某些简单场景里的
// 的效果看起来是一样的,所以我们通过矩阵运算让眼睛点在一定高度做圆周
// 运动。知道圆的简化方程是:(sinα* r)^2 (cosα* r)^2 = r^2,所以代码
// 很好理解。
static float fRadius = 0;
fRadius = 0.01f;
if ( fRadius > M_PI * 2 )
{
 fRadius = 0;
}
gluLookAt( cosf( fRadius ) * 30, sinf( fRadius ) * 30, 15.0,
 0.0, 0.0, 0.0, // 向原点坐标看去
 0.0, 0.0, 1.0 ); // 设置眼睛(摄影机)的方向向量,该向量表示眼表向上
}

// 设置透视矩阵
void SetProjMatrix( WORD wWidth, WORD wHeight )
{
// 此函数将在WM_SIZE时被调用,所以应该设置一下glViewPort
glViewport( 0, 0, wWidth, wHeight );
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
// 这和照象机很类似,第一个参数设置镜头广角度,第二个参数是长宽比,后面是远近剪切。
gluPerspective( 45.0, (double)wWidth / (double)wHeight, 1.0, 1000.0 );
}

  然后我们在OnDraw里调用下面的代码:

// 先将上次渲染的残留物清为背景色
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBegin( GL_QUADS ); // 设置绘制模式,我们画一个平面的四边形
glVertex2i( 5, 5 );
glVertex2i( 5, -5 );
glVertex2i( -5, -5 );
glVertex2i( -5, 5 );
SwapBuffers( g_hDC ); // 交换前后缓冲,双缓冲无闪烁
  至此,GlTest.cpp中的代码因该是这个样子:

// GlTest.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "GlTest.h"
#define MAX_LOADSTRING 100


// 全局变量:
HINSTANCE hInst;    // 当前实例
HWND g_hWnd;
HDC g_hDC;
HGLRC g_glRes;

TCHAR szTitle[MAX_LOADSTRING];   // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];  // 主窗口类名

// 此代码模块中包含的函数的前向声明:
void OnCreate( HWND hWnd );
void OnCreated( void );
void OnDestroy( void );
void OnDraw( void );
void SetProjMatrix( WORD wWidth, WORD wHeight );
void SetModalMatrix( void );
void OnIdle( void );

ATOM  MyRegisterClass(HINSTANCE hInstance);
BOOL  InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
           HINSTANCE hPrevInstance,
           LPTSTR  lpCmdLine,
           int    nCmdShow)
{
 // TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_GLTEST, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS