?? 3dsfile.cpp
字號:
//=========================================================================
/**
* @file 3DSFile.cpp
*
* 項目描述: 3DS文件載入
* 文件描述: 具體實例類
* 適用平臺: Windows98/2000/NT/XP
*
* 作者: WWBOSS
* 電子郵件: wwboss123@gmail.com
* 創建日期: 2006-09-13
* 修改日期: 2006-12-02
*
* 在這個類中您必須重載如下幾個虛函數
*
* virtual bool Init();
* 執行所有的初始化工作,如果成功函數返回true
*
* virtual void Uninit();
* 執行所有的卸載工作
*
* virtual void Update(DWORD milliseconds);
* 執行所有的更新操作,傳入的參數為兩次操作經過的時間,以毫秒為單位
*
* virtual void Draw();
* 執行所有的繪制操作
*/
//=========================================================================
#include "stdafx.h"
#include "3DSFile.h"
/** 創建一個程序的實例 */
GLApplication * GLApplication::Create(const char * class_name)
{
Test * test = new Test(class_name);
return reinterpret_cast<GLApplication *>(test);
}
/** 構造函數 */
Test::Test(const char * class_name) : GLApplication(class_name)
{
/// 初始化用戶自定義的程序變量
m_Fps = 0;
m_RenderMode = true;
sp = false;
}
/** 初始化OpenGL */
bool Test::Init()
{
/** 用戶自定義的初始化過程 */
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
ResizeDraw(true); /**< 改變OpenGL窗口大小,直接調用子類的函數 */
/** 初始化字體 */
if(!m_Font.InitFont())
MessageBox(NULL,"初始化字體失敗!","錯誤",MB_OK);
/** 初始化地形 */
if(!m_Terrain.init())
{
MessageBox(NULL,"初始化地形失敗!","錯誤",MB_OK);
exit(0);
}
/** 初始化天空 */
if(!m_SkyBox.init())
{
MessageBox(NULL,"初始化天空失敗!","錯誤",MB_OK);
exit(0);
}
/** 初始化3DS文件 */
m_3DS.Init("model.3ds");
/** 設置攝像機 */
m_Camera.setCamera( 381, 35, 674, 374.5, 35, 669, 0, 1, 0);
return true; /**< 成功返回 */
}
/** 用戶自定義的卸載函數 */
void Test::Uninit()
{
}
/** 更新攝像機 */
void Test::UpdateCamera()
{
m_Camera.setViewByMouse();
/** 鍵盤按鍵響應 */
if(m_Keys.IsPressed(VK_SHIFT)) /**< 按下SHIFT鍵時加速 */
{
m_Camera.setSpeed(1.2f);
}
if(!m_Keys.IsPressed(VK_SHIFT))
{
m_Camera.setSpeed(0.6f);
}
if(m_Keys.IsPressed(VK_UP) || m_Keys.IsPressed('W')) /**< 向上方向鍵或'W'鍵按下 */
m_Camera.moveCamera(m_Camera.getSpeed()); /**< 移動攝像機 */
if(m_Keys.IsPressed(VK_DOWN) || m_Keys.IsPressed('S')) /**< 向下方向鍵或'S'鍵按下 */
m_Camera.moveCamera(-m_Camera.getSpeed()); /**< 移動攝像機 */
if(m_Keys.IsPressed(VK_LEFT) || m_Keys.IsPressed('A')) /**< 向左方向鍵或'A'鍵按下 */
m_Camera.yawCamera(-m_Camera.getSpeed()); /**< 移動攝像機 */
if(m_Keys.IsPressed(VK_RIGHT) || m_Keys.IsPressed('D')) /**< 向右方向鍵或'D'鍵按下 */
m_Camera.yawCamera(m_Camera.getSpeed()); /**< 移動攝像機 */
/** 根據地形高度更新攝像機 */
Vector3 vPos = m_Camera.getPosition(); /**< 得到當前攝像機位置 */
Vector3 vNewPos = vPos;
/** 設置攝像機高度為 地形高度 + 10 */
vNewPos.y = (float)m_Terrain.getAveHeight(vPos.x,vPos.z ) + 10;
/** 得到高度差值 */
float temp = vNewPos.y - vPos.y;
/** 更新攝像機方向 */
Vector3 vView = m_Camera.getView();
vView.y += temp;
/** 設置攝像機 */
m_Camera.setCamera(vNewPos.x, vNewPos.y, vNewPos.z,
vView.x, vView.y, vView.z,
0, 1, 0);
}
/** 程序更新函數 */
void Test::Update(DWORD milliseconds)
{
if (m_Keys.IsPressed(VK_ESCAPE) == true) /**< 按ESC退出 */
{
TerminateApplication();
}
/** 用戶自定義的更新過程 */
/** 更新攝像機 */
UpdateCamera();
/** 空格鍵切換繪制模式 */
if(m_Keys.IsPressed(VK_SPACE) && !sp)
{
sp = true;
m_RenderMode = !m_RenderMode;
if(m_RenderMode)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
if(!m_Keys.IsPressed(VK_SPACE))
sp = false;
}
/** 計算幀速 */
void Test::CaculateFrameRate()
{
static float framesPerSecond = 0.0f; /**< 保存顯示幀數 */
static float lastTime = 0.0f; /**< 記錄上次時間 */
float currentTime = GetTickCount() * 0.001f; /**< 獲得當前時間 */
framesPerSecond++; /**< 顯示幀數遞增1 */
/** 如果時間差大于1.0秒 */
if( currentTime - lastTime > 1.0f )
{
lastTime = currentTime; /**< 保存當前時間 */
m_Fps = framesPerSecond; /**< 當前幀數傳給m_Fps */
framesPerSecond = 0; /**< 將幀數置零 */
}
}
/** 輸出文字信息 */
void Test::PrintText()
{
char string[128]; /**< 用于保存輸出字符串 */
glPushAttrib(GL_CURRENT_BIT); /**< 保存現有顏色屬性信息 */
glColor3f(0.0f,1.0f,1.0f); /**< 設置文字顏色 */
sprintf(string,"當前位置:X=%3.1f Y=%3.1f Speed =%3.1f ",
m_Camera.getPosition().x,m_Camera.getPosition().z ,m_Camera.getSpeed()); /**< 字符串賦值 */
m_Font.PrintText(string,-5.0f,3.5f);
/** 輸出幀速 */
CaculateFrameRate(); /**< 計算幀速 */
sprintf(string,"FPS:%d",(int)m_Fps); /**< 字符串賦值 */
m_Font.PrintText(string, -5.0f,3.0f); /**< 輸出字符串 */
glPopAttrib();
}
/** 顯示3DS模型 */
void Test::Show3DS(float x,float z,float scale)
{
glPushMatrix();
float y = m_Terrain.getAveHeight(x,z) ; /**< 獲得此處地形高度 */
glTranslatef(x,y,z);
glScalef(scale,scale,scale);
m_3DS.Draw(); /**< 顯示3DS模型 */
glPopMatrix();
}
/** 繪制函數 */
void Test::Draw()
{
/** 用戶自定義的繪制過程 */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
/** 放置攝像機 */
m_Camera.setLook();
/** 渲染地形 */
m_Terrain.render();
/** 繪制天空 */
m_SkyBox.render();
/** 顯示3DS模型 */
Show3DS(260,583,20);
/** 輸出屏幕信息 */
PrintText();
glFlush(); /**< 強制執行所有的OpenGL命令 */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -