时间段内有多少个周六强周日轮周日如题,望高手指教一个算法

#ifndef _MODEL_H
#define _MODEL_H
#include "main.h"
#include "3ds.h"
#include "Camera.h"
class Model
//导入模型
void modelImport();
//绘制模型
void modelRander();
//清除模型
void cleanupModel();
//更新模型信息
void Update();
//模型按键响应
void SpecialKeys();
//模型运动
void modeModel();
//设置坦克位置
void setPosition(int selected,float x,float y,float z);
//模型移动速度
#endif _MODEL_H
#include "Model.h"
#include "main.h"
#include "Camera.h"
//3DS文件名
#define FILE_NAME
#define FILE_MODLE_NAME "tank1.3ds"
#define GUN_ID
//3DS类的实例对象
CLoad3DS g_Load3
//3D模型对象
t3DModel g_3DModel[NUM];
//定义绘图方式
g_ViewMode
= GL_TRIANGLES;
/////////////////////////////构造函数////////////////////////////
////////////////////////////////////////////////////////////////
Model::Model()
CVector3 vZero = CVector3(0.0, 0.0, 0.0);
// 初始位置为(0,0,0)
// 用具体初始化量进行赋值
for(int n=0;n&n++)
g_3DModel[n].m_Move= vZ
///////////////////////模型渲染函数////////////////////
///////////////////////////////////////////////////////
void Model::modelRander()
// 将导入的模型移动到可视位置
glTranslatef(800,28,200);
glScalef(3,3,3);
//进行模型绘制
for(int n=0;n&n++)
glPushMatrix();
// 模型移动
if(g_Controller==n)
modeModel();
// ------------------------渲染模型的每一个对象
for(int i = 0; i & g_3DModel[n].numOfO i++)
// 确保对象有效(size() is in the vector class)
if(g_3DModel[n].pObject.size() &= 0)
// 获得当前正在绘制的对象
t3DObject *pObject = &g_3DModel[n].pObject[i];
// 检查这个对象是否拥有纹理映射,如果有,绑定纹理.
if(pObject-&bHasTexture) {
// 开启纹理映射,关闭颜色.
glEnable(GL_TEXTURE_2D);
// 重新设置颜色
glColor3ub(255, 255, 255);
// 根据 materialID 进行纹理绑定
glBindTexture(GL_TEXTURE_2D, g_Texture[GUN_ID]);
// 关闭纹理映射,开启颜色
glDisable(GL_TEXTURE_2D);
// 重新设置颜色
glColor3ub(255, 255, 255);
// 确定是用网格绘制模式,还是正常绘制模式
// 用我们选择的方式开始绘制 现在g_ViewMode为GL_TRIANGLES
glBegin(g_ViewMode);
// 遍历所有对象的面(多边形)并绘制他们
for(int j = 0; j & pObject-&numOfF j++)
// 遍历所有的三角形顶点并绘制他们
for(int whichVertex = 0; whichVertex & 3; whichVertex++)
// 获得面中每一个点的索引Get
int index = pObject-&pFaces[j].vertIndex[whichVertex];
// 各个索引的法线方向.
glNormal3f(pObject-&pNormals[ index ].x, pObject-&pNormals[ index ].y, pObject-&pNormals[ index ].z);
// 如果这个对象有一个纹理与他关联,给出他的纹理坐标.
if(pObject-&bHasTexture) {
// 确认有一个UVW得索引适用于当前对象,否则它不会被分配到纹理坐标.
if(pObject-&pTexVerts) {
glTexCoord2f(pObject-&pTexVerts[ index ].x, pObject-&pTexVerts[ index ].y);
// 确定赋给对象的材质/颜色是有效的.
if(g_3DModel[n].pMaterials.size() && pObject-&materialID &= 0)
// 获得并且设置对象颜色,并且它应该没有材质。
BYTE *pColor = g_3DModel[n].pMaterials[pObject-&materialID].
// 将当前的颜色赋值给模型
glColor3ub(pColor[0], pColor[1], pColor[2]);
// 开始进行点的绘制
glVertex3f(pObject-&pVerts[ index ].x, pObject-&pVerts[ index ].y, pObject-&pVerts[ index ].z);
glEnd();// 结束绘制
glPopMatrix();
glRotatef(45.0f,0.0,1.0,0.0);
//**************************************
//**************************************
void Model::modelImport()
for(n=0;n&n++)
//导入模型
g_Load3ds.Import3DS(&g_3DModel[n], FILE_MODLE_NAME);
//逐一读取模型中的材质数
for(int i = 0; i & g_3DModel[n].numOfM i++)
// 检查在这个材质中是否有一个文件名需要加载
if(strlen(g_3DModel[n].pMaterials[i].strFile) & 0)
// 创建纹理
// 进入我们的全局纹理数组,其中包括纹理名称和ID号.
CreateTexture(g_Texture, g_3DModel[n].pMaterials[i].strFile, i);
// 为这个材质设置纹理ID
g_3DModel[n].pMaterials[i].texureId =
void Model::cleanupModel()
for( int n=0; n& n++)
for(int i = 0; i & g_3DModel[n].numOfO i++)
// 释放面,法线,点和纹理坐标
delete [] g_3DModel[n].pObject[i].pF
delete [] g_3DModel[n].pObject[i].pN
delete [] g_3DModel[n].pObject[i].pV
delete [] g_3DModel[n].pObject[i].pTexV
void Model::SpecialKeys()
// w或up-key
if(GetKeyState(VK_NUMPAD8) & 0x80) {
// Move Forward
g_3DModel[g_Controller].m_Move.x += 1.0f;
// VK_NUMPAD5
if(GetKeyState(VK_NUMPAD5) & 0x80 ) {
// Move Retreat
g_3DModel[g_Controller].m_Move.x -= 1.0f;
// VK_NUMPAD4
if(GetKeyState(VK_NUMPAD4) & 0x80 ) {
// Move Left
g_3DModel[g_Controller].m_Move.z += 1.0f;
// VK_NUMPAD6
if(GetKeyState(VK_NUMPAD6) & 0x80 ) {
// Move Right
g_3DModel[g_Controller].m_Move.z -= 1.0f;
//VK_NUMPAD7
if(GetKeyState(VK_NUMPAD7) & 0x80 ) {
g_3DModel[g_Controller].m_Move.y += 1.0f;
//VK_NUMPAD9
if(GetKeyState(VK_NUMPAD9) & 0x80 ) {
// Move Down
g_3DModel[g_Controller].m_Move.y -= 1.0f;
//VK_NUMPAD1
if(GetKeyState(VK_NUMPAD1) & 0x80 ) {
// Rotate right
g_3DModel[g_Controller].m_Rotate -= 1.0f;
//VK_NUMPAD3
if(GetKeyState(VK_NUMPAD3) & 0x80 ) {
// Rotate left
g_3DModel[g_Controller].m_Rotate += 1.0f;
void Model::Update()
SpecialKeys();
void Model::modeModel()
//移动模型
glTranslatef(g_3DModel[g_Controller].m_Move.x, g_3DModel[g_Controller].m_Move.y, g_3DModel[g_Controller].m_Move.z);
//旋转模型
glRotatef(g_3DModel[g_Controller].m_Rotate, 0.0f, 1.0f, 0.0f);
void Model::setPosition(int selected,float x,float y,float z)
g_3DModel[selected].m_Move.x=x;
g_3DModel[selected].m_Move.y=y;
g_3DModel[selected].m_Move.z=z;
#ifndef _MAIN_H
#define _MAIN_H
#include &windows.h&
#include &stdio.h&
#include &stdlib.h&
#include &fstream&
#include &math.h&
#include &gl/gl.h&
#include &gl/glu.h&
#include &gl/glaux.h&
#include &gl/glut.h&
#include &crtdbg.h&
#include &vector&
#include "Terrain.h"
// 定义体积雾,我们需要添加扩展宏定义和自定义类型
// 为这些状态进行了一些宏定义,用于对glFogi()传值
#define GL_FOG_COORDINATE_SOURCE_EXT
#define GL_FOG_COORDINATE_EXT
// 为了容积雾的设置声明我们的函数指针
typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
//*************************************************************************************
// 多重纹理定义
#define GL_TEXTURE0_ARB
#define GL_TEXTURE1_ARB
#define GL_COMBINE_ARB
#define GL_RGB_SCALE_ARB
// 给出多重纹理函数原型
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum target);
// 为了实现多纹理功能而声名的函数原型
extern PFNGLMULTITEXCOORD2FARBPROC
glMultiTexCoord2fARB;
extern PFNGLACTIVETEXTUREARBPROC
glActiveTextureARB;
// 能载入的最大纹理数
#define MAX_TEXTURES 1000
// 记录纹理的ID号
extern UINT g_Texture[MAX_TEXTURES];
// 天空纹理,用于控制纹理函数使用
#define GL_CLAMP_TO_EDGE 0x812F
// 定义窗口大小
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
#define SCREEN_DEPTH 16
extern bool
extern HWND
extern RECT
extern HDC
extern HGLRC g_hRC;
extern HINSTANCE g_hI
//最大模型个数
const int NUM=100;
//当前模型个数
//控制第几个模型
extern int g_C
// 定义3D顶点结构
class CVector3
// 默认构造
CVector3() {}
// 拷贝构造
CVector3(float X, float Y, float Z)
x = X; y = Y; z = Z;
// 运算符'+'重载
CVector3 operator+(CVector3 vVector)
return CVector3(vVector.x + x, vVector.y + y, vVector.z + z);
// 运算符'-'重载
CVector3 operator-(CVector3 vVector)
return CVector3(x - vVector.x, y - vVector.y, z - vVector.z);
// 运算符'*'重载
CVector3 operator*(float num)
return CVector3(x * num, y * num, z * num);
// 运算符'/'重载
CVector3 operator/(float num)
return CVector3(x / num, y / num, z / num);
float x, y,
// 定义2D顶点结构,用于UV纹理坐标
class CVector2
// 面结构体
struct tFace
int vertIndex[3];
// 建立三角面片
int coordIndex[3];
// 纹理坐标索引
// 材质信息结构体
struct tMaterialInfo
strName[255];
// 纹理名字
strFile[255];
// 纹理文件名称
// 对象的颜色
// 纹理u方向平铺
// 纹理v方向平铺
// 纹理在u方向偏移
// 纹理在v方向偏移
// 3D对象结构体
struct t3DObject
// 模型顶点数
// 模型面片数
// 纹理的坐标点数
materialID;
// 纹理坐标的索引号
bool bHasT
// 为真时说明对象拥有纹理索引
char strName[255];
// 对象名称
// 对象的顶点指针
// 对象的法线指针
// 纹理的UV坐标指针
// 对象的面片信息指针
// 3D模型结构体
struct t3DModel
int numOfO
// 模型中的对象数
int numOfM
// 模型中的材质数
vector&tMaterialInfo& pM // 材质信息列表(纹理和颜色)
vector&t3DObject& pO
// 对象模型列表
GLfloat m_R
//计算帧数率
void CalculateFrameRate();
//计算两个向量的向量积
CVector3 Cross(CVector3 vVector1, CVector3 vVector2);
//返回单位向量
CVector3 Normalize(CVector3 vVector);
//两点坐标减操作
CVector3 Vector(CVector3 vPoint1, CVector3 vPoint2);
//两点坐标加操作
CVector3 AddVector(CVector3 vVector1, CVector3 vVector2);
//平均分点坐标
CVector3 DivideVectorByScaler(CVector3 vVector1, float Scaler);
// 窗口主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprev, PSTR cmdline, int ishow);
// 窗口信息处理函数
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
// 控制我们程序的循环
WPARAM MainLoop();
// 创建纹理函数.读取文件,创建纹理
bool CreateTexture(UINT &texture, LPSTR strFileName);
// 重载创建纹理函数.读取文件,创建纹理
void CreateTexture(UINT textureArray[], LPSTR strFileName, int textureID);
// 切换到全屏模式
void ChangeToFullScreen();
// 自定义函数,使创建一个窗口更加符合模块化也更容易
HWND CreateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle, bool bFullScreen, HINSTANCE hInstance);
// 设置窗口,为OpenGL和后台缓存
bool bSetupPixelFormat(HDC hdc);
// 初始化屏幕的大小和位置
void SizeOpenGLScreen(int width, int height);
// 初始化OpenGL
void InitializeOpenGL(int width, int height);
// 初始化整个程序
void Init(HWND hWnd);
// 绘制函数
void RenderScene();
//释放所有申请的内存
void DeInit();
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
#include "main.h"
#include "camera.h"
#include "3ds.h"
#include "windows.h"
#include "Model.h"
g_bFullScreen =
// 默认设置为全屏模式
// 窗口句柄
// 窗口大小
// 设备上下文句柄 -- handle to device context
HGLRC g_hRC;
// 渲染设备上下文句柄 -- Our Rendering Context for OpenGL
HINSTANCE g_hI
// 实例句柄
//这是我们的烟雾范围函数,设置顶点的烟雾深度
PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL;
//设置我们所需的烟雾深度
float g_FogDepth = 10.0f;
// 多重纹理函数指针
PFNGLMULTITEXCOORD2FARBPROC
glMultiTexCoord2fARB
PFNGLACTIVETEXTUREARBPROC
glActiveTextureARB
//判断是否进行多重纹理贴图
bool g_bDetail =
// 进行细节纹理贴图时的比例
int g_DetailScale = 16;
// 全局相机对象
CCamera g_C
// 地形信息数组
BYTE g_HeightMap[MAP_SIZE*MAP_SIZE];
// 用线方式还是用填充方式
g_bRenderMode =
// 通过ID来记录不同的纹理信息
UINT g_Texture[MAX_TEXTURES] = {0};
//skybox贴图
#define BACK_ID
#define FRONT_ID 12
#define BOTTOM_ID 13
#define TOP_ID
#define LEFT_ID
#define RIGHT_ID 16
#define GUN_ID
//定义光照状态
g_bLighting
//控制第几个模型运动
int g_Controller
//Model Import
///////////////////////////////// CREATE SKY BOX ////////////////////////////////*
///// This creates a sky box centered around X Y Z with a width, height and length
创建一个skybox
///////////////////////////////// CREATE SKY BOX ////////////////////////////////*
void CreateSkyBox(float x, float y, float z, float width, float height, float length)
// 开启纹理映射
glEnable(GL_TEXTURE_2D);
//因为skybox是在三维空间中位于将空间分割成8份中的x+,y+,z+的空间内,所以这里可以求得skybox的中心
x = x - width
y = y - height / 2;
z = z - length / 2;
//----开始贴天空纹理----
// 绑定纹理、控制滤波
glBindTexture(GL_TEXTURE_2D, g_Texture[BACK_ID]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 以四边形绘制方式进行绘制
glBegin(GL_QUADS);
// Assign the texture coordinates and vertices for the BACK Side
glTexCoord2f(1.0f, 0.0f); glVertex3f(x + width, y,
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + width, y + height, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x,
y + height, z);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x,
// 绑定纹理、控制滤波
glBindTexture(GL_TEXTURE_2D, g_Texture[FRONT_ID]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 以四边形绘制方式进行绘制
glBegin(GL_QUADS);
// Assign the texture coordinates and vertices for the FRONT Side
glTexCoord2f(1.0f, 0.0f); glVertex3f(x,
z + length);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x,
y + height, z + length);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y + height, z + length);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y,
z + length);
// 绑定纹理、控制滤波
glBindTexture(GL_TEXTURE_2D, g_Texture[BOTTOM_ID]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 以四边形绘制方式进行绘制
glBegin(GL_QUADS);
// Assign the texture coordinates and vertices for the BOTTOM Side
glTexCoord2f(1.0f, 0.0f); glVertex3f(x,
glTexCoord2f(1.0f, 1.0f); glVertex3f(x,
z + length);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y,
z + length);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y,
// 绑定纹理、控制滤波
glBindTexture(GL_TEXTURE_2D, g_Texture[TOP_ID]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 以四边形绘制方式进行绘制
glBegin(GL_QUADS);
// Assign the texture coordinates and vertices for the TOP Side
glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y + height, z);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y + height, z + length);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x,
y + height, z + length);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x,
y + height, z);
// 绑定纹理、控制滤波
glBindTexture(GL_TEXTURE_2D, g_Texture[LEFT_ID]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 以四边形绘制方式进行绘制
glBegin(GL_QUADS);
// Assign the texture coordinates and vertices for the LEFT Side
glTexCoord2f(1.0f, 1.0f); glVertex3f(x,
y + height, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x,
y + height, z + length);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x,
z + length);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x,
// 绑定纹理、控制滤波
glBindTexture(GL_TEXTURE_2D, g_Texture[RIGHT_ID]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 以四边形绘制方式进行绘制
glBegin(GL_QUADS);
// Assign the texture coordinates and vertices for the RIGHT Side
glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y,
glTexCoord2f(1.0f, 0.0f); glVertex3f(x + width, y,
z + length);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + width, y + height, z + length);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y + height, z);
///////////////////////////////// INIT ////////////////////////////////*
初始化函数
///////////////////////////////// INIT
////////////////////////////////*
void Init(HWND hWnd)
g_hWnd = hW
// 将这个窗口句柄赋值给全局窗口句柄
GetClientRect(g_hWnd, &g_rRect);
// 将这个窗口矩形赋值给全局的RECT
InitializeOpenGL(g_rRect.right, g_rRect.bottom); // 用g_rRect初始化OpenGL
// 初始化多重纹理函数
glActiveTextureARB
= (PFNGLACTIVETEXTUREARBPROC)
wglGetProcAddress("glActiveTextureARB");
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)
wglGetProcAddress("glMultiTexCoord2fARB");
//初始化 导入模型
md.modelImport();
//------------------------------------------------------------------------
//开启默认光源
glEnable(GL_LIGHT0);
//开启光照
//glEnable(GL_LIGHTING);
//开启材质颜色
glEnable(GL_COLOR_MATERIAL);
// Allow color
// 我们应该使我们的多重纹理函数在之前已经进行了宏定义
// 但是让我们先来确定当前的OpenGL版本是否在机器上已经安装好
// 如果这个扩展函数不能被找到,我们的函数指针将会置空
if(!glActiveTextureARB || !glMultiTexCoord2fARB)
//打印错误信息后推出
MessageBox(g_hWnd, "Your current setup does not support multitexturing", "Error", MB_OK);
PostQuitMessage(0);
//------------------------------设置烟雾效果-------------------------------
// 如果我们正确的加载了多重纹理,我们现在可以试着看看我们的显卡是否支持fog的硬件加速
// 我们对每一个扩展部分都做这样的测试.首先告诉wglGetProcAddress()那些扩展部分是我们想要的
// 然后返回一个函数指针.然后检查函数指针来确定当前的显卡驱动或者设置支持它.
// 找到保存fog坐标函数的指针
glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");
// 在确认使用这个函数指针之前,我们应该确认它指向了一个有效的地址
if(!glFogCoordfEXT)
// 打印错误信息并推出
MessageBox(g_hWnd, "Your current setup does not support volumetric fog", "Error", MB_OK);
PostQuitMessage(0);
// 假定通过这里,我们应该可以实现体积雾
// 现在进行设置和初始化.先要开启雾化效果.
// 然后给出一个烟雾的颜色,也给出烟雾的厚度的start和distance
// 这个新的信息将会交付给glFogi()
// 这个新的特征将会被我们进行宏定义来告知OpenGL,我们想要每一个点都有fog.
// 注意我们没有使用GL_FOG_DENSITY.
但是这并没有什么实际的影响.
// 烟雾颜色
float fogColor[4] = {0.8f, 0.8f, 0.8f, 1.0f};
glEnable(GL_FOG);
// 开启烟雾效果
glFogi(GL_FOG_MODE, GL_LINEAR);
// 设置烟雾模式
glFogfv(GL_FOG_COLOR, fogColor);
// 设置烟雾颜色
glFogf(GL_FOG_START, 0.0);
// 设置开始位置深度为0
glFogf(GL_FOG_END, 50.0);
// 设置结束位置深度为50
// 现在我们告诉OpenGL我们正在为每一个点的烟雾进行计算
// 为每一个点.对于每一个点都需要设置烟雾,我们必须使用 glFogCoordfEXT()函数,并传入一个深度值
// 这些特征都在main.h中被定义.
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
//------------------------------导入地形文件-------------------------------
// 这里我们从.raw文件中读入地形信息,然后将它存放在g_HeightMap数组中
// 我们也需要传入.raw文件的大小
//导入.raw文件
LoadRawFile("Terrain.raw", MAP_SIZE * MAP_SIZE, g_HeightMap);
//开启深度检测
glEnable(GL_DEPTH_TEST);
//------------------------------纹理贴图-------------------------------
//开启纹理映射
glEnable(GL_TEXTURE_2D);
//打开背面消隐
glEnable(GL_CULL_FACE);
//创建纹理
CreateTexture(g_Texture[0],
"Terrain.bmp"); // 载入地形纹理
CreateTexture(g_Texture[1],
"Detail.bmp"); // 载入细致贴图纹理
CreateTexture(g_Texture[BACK_ID], "Back.bmp"); // 载入skybox纹理
CreateTexture(g_Texture[FRONT_ID], "Front.bmp"); // 载入skybox纹理
CreateTexture(g_Texture[BOTTOM_ID], "Bottom.bmp"); // 载入skybox纹理
CreateTexture(g_Texture[TOP_ID], "Top.bmp");
// 载入skybox纹理
CreateTexture(g_Texture[LEFT_ID], "Left.bmp"); // 载入skybox纹理
CreateTexture(g_Texture[RIGHT_ID], "Right.bmp"); // 载入skybox纹理
CreateTexture(g_Texture[GUN_ID], "SC113_L.bmp"); // 载入gun纹理
// 在世界坐标系中给出相机一个合适的起始位置
g_Camera.PositionCamera( 480,35,350,
500,35,340,
//设置模型位置
md.setPosition(0,200,10,250);
md.setPosition(1,200,35,250);
md.setPosition(2,200,20,250);
//隐藏光标
ShowCursor(false);
///////////////////////////////// MAIN GAME LOOP ////////////////////////////////*
This function handles the main game loop
游戏循环池
///////////////////////////////// MAIN GAME LOOP ////////////////////////////////*
WPARAM MainLoop()
// 无限循环
// 检查是否有消息
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if(msg.message == WM_QUIT)
// 如果不是退出消息的话
TranslateMessage(&msg);
// 找到信息要做的内容
DispatchMessage(&msg);
// 执行消息内容
// 如果没有消息出现
RenderScene();
// 按每一帧刷新屏幕
md.cleanupModel();
// 释放所有分配的内存
return(msg.wParam);
// 从程序中返回
///////////////////////////////// RENDER SCENE ////////////////////////////////*
This function renders the entire scene.
///////////////////////////////// RENDER SCENE ////////////////////////////////*
void RenderScene()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空屏幕和深度缓存
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 重置观察矩阵
// 获得当前相机的位置
CVector3 vPos
= g_Camera.Position();
CVector3 vNewPos
//----------------------与地面进行碰撞检测-------------------
//设置眼睛与地面的高度
const int peopletop=50;
//Height()函数用来返回地形中当前点的高度值
if(vPos.y & Height(g_HeightMap, (int)vPos.x, (int)vPos.z ) + peopletop)
//设置相机位置:y方向=当前地形的高度值+眼睛与地面高度;
vNewPos.y = (float)Height(g_HeightMap, (int)vPos.x, (int)vPos.z ) +
// Get the difference of the y that the camera was pushed back up
float temp = vNewPos.y - vPos.y;
// 获得当前的观察点,并且增长他通过坐标之间的差异
CVector3 vView = g_Camera.View();
vView.y +=
// 设置新的相机位置
g_Camera.PositionCamera(vNewPos.x,
vNewPos.y,
vNewPos.z,
vView.x, vView.y, vView.z, 0, 1, 0);
// 给予OpenGL我们相机的位置
g_Camera.Look();
// 渲染地形
RenderHeightMap(g_HeightMap);
// 创建天空盒子并将地形圈起来
CreateSkyBox(500, 0, 500, , 2000);
//更新模型
md.Update();
//渲染场景内模型
md.modelRander();
// 刷新相机
g_Camera.Update();
// 交换后台缓存为前台
SwapBuffers(g_hDC);
///////////////////////////////// WIN PROC ////////////////////////////////*
This function handles the window messages.
windows消息处理函数
///////////////////////////////// WIN PROC ////////////////////////////////*
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
PAINTSTRUCT
switch (uMsg)
case WM_SIZE:
// 窗口大小被改变
if(!g_bFullScreen)
// 不是全屏时
SizeOpenGLScreen(LOWORD(lParam),HIWORD(lParam));// LoWord=Width, HiWord=Height
GetClientRect(hWnd, &g_rRect);
// 获得窗口矩形
case WM_PAINT:
// 绘制与重绘
BeginPaint(hWnd, &ps);
// 初始化绘制函数
EndPaint(hWnd, &ps);
// 结束绘制
case WM_LBUTTONDOWN:
// 左键按下时
g_bDetail = !g_bD
// 进行细致纹理贴图
case WM_RBUTTONDOWN:
// 右键按下时
g_bRenderMode = !g_bRenderM
// 改变渲染模式
if(g_bRenderMode)
// 三角形填充模式
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
// 三角形网格渲染模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
case WM_KEYDOWN:
// 键盘响应
switch(wParam)
case VK_ESCAPE:
// 按下ESC时
PostQuitMessage(0);
//退出程序
case VK_SPACE:
// 按下空格时
// 改变当前的细致纹理刻度值
g_DetailScale = (g_DetailScale * 2) % 128;
// 如果刻度值变为0,设置为1
if(g_DetailScale == 0)
g_DetailScale = 1;
case VK_ADD:
// 按下+号键时
g_FogDepth += 2;
// 增加fog的深度
if(g_FogDepth & 200)
// 高度上限
g_FogDepth = 200;
case VK_SUBTRACT:
// 按下-号键时
g_FogDepth -= 1;
// 减少fog的深度
if(g_FogDepth & 0)
// 确保深度不会小于0
g_FogDepth = 0;
case VK_F1:
g_Controller = 0;
case VK_F2:
g_Controller = 1;
case VK_F3:
g_Controller = 2;
case VK_F4:
case WM_CLOSE:
// 窗口关闭时
PostQuitMessage(0);
// 退出窗口程序
return DefWindowProc (hWnd, uMsg, wParam, lParam);
// 返回默认响应
主要代码大概就是这些,问题是这样的:
&& 初始化的时候,是可以控制0号模型(在这里是坦克)进行移动,但是当按下F1进行切换到其他坦克的时候,之前移动的坦克又回到了初始化的位置,此时可以控制的是切换到的模型(例如开始控制0号,切换到1号时,0号回到初始位置,此时可以控制1号),但是当又切换回0号的时候,1号又回到初始位置,此时的0号保存了之前移动到的位置,然后在这个位置上再进行控制移动。
&& 我想知道这是为什么?怎么改?错在哪了?我问了老师,老师说就是Model.cpp中的
//// 模型移动&&if(g_Controller==n)&&& modeModel();
这一句出了问题,说是逻辑问题。
希望有人能告诉我该怎么改,越详细越好,感激不尽!没齿难忘!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:782次
排名:千里之外

我要回帖

更多关于 周六周日兼职招聘 的文章

 

随机推荐