日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言glut打正方形,OpenGL绘制正方形并用键盘移动

發(fā)布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言glut打正方形,OpenGL绘制正方形并用键盘移动 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

準(zhǔn)備工作:

在OpenGL中,基本圖形元素如點(diǎn)、線、折線和多邊形都是由一個或多個頂點(diǎn)所定義。OpenGL的7種基本圖元:

WeChat77732bbab74bef94d9f34e151bce8b6e.png

WeChat26002917d9408c5eef2f9637246fd9a6.png

OpenGL繪制正方形與OpenGL繪制三角形類似,主要是setupRC方法中設(shè)置渲染環(huán)境時有區(qū)別, 在 triangleBatch.Begin(GL_TRIANGLE_FAN, 4)方法中設(shè)置繪制的圖元樣式,GL_TRIANGLE_FAN圖元的枚舉類型,4:頂點(diǎn)的個數(shù)。

void setupRC()

{

//設(shè)置清屏顏色(背景顏色)

glClearColor(0.98f, 0.40f, 0.7f, 1);

//沒有著色器,在OpenGL 核心框架中是無法進(jìn)行任何渲染的。初始化一個渲染管理器。

//在前面的課程,我們會采用固管線渲染,后面會學(xué)著用OpenGL著色語言來寫著色器

shaderManager.InitializeStockShaders();

//修改為GL_TRIANGLE_FAN ,4個頂點(diǎn)

triangleBatch.Begin(GL_TRIANGLE_FAN, 4);

triangleBatch.CopyVertexData3f(vVerts);

triangleBatch.End();

}

正方形繪制過程中代碼的執(zhí)行流程圖如下:

3DE23B4E-1AF7-4A35-9E40-E6C41C28A0A4.png

想要通過鍵盤移動正方形,需要注冊SpecialKeys()方法,在點(diǎn)擊鍵盤方向鍵,系統(tǒng)會自動調(diào)用該方法,所以在該方法中通過參數(shù)key判斷移動方向?qū)崿F(xiàn)對應(yīng)移動邏輯即可。通過鍵盤移動正方形有兩種方式:

一、通過計(jì)算圖形的頂點(diǎn)來移動

這種方式對于處理不規(guī)則圖形會比較復(fù)雜

void SpecialKeys(int key, int x, int y){

GLfloat stepSize = 0.025f;

GLfloat blockX = vVerts[0];

GLfloat blockY = vVerts[10];

if (key == GLUT_KEY_UP) {

blockY += stepSize;

}

if (key == GLUT_KEY_DOWN) {

blockY -= stepSize;

}

if (key == GLUT_KEY_LEFT) {

blockX -= stepSize;

}

if (key == GLUT_KEY_RIGHT) {

blockX += stepSize;

}

//邊界檢測,根據(jù)頂點(diǎn)移動的位置,判斷圖形是否超出邊界

//當(dāng)正方形移動超過最左邊的時候

if (blockX < -1.0f) {

blockX = -1.0f;

}

//當(dāng)正方形移動到最右邊時

//1.0 - blockSize * 2 = 總邊長 - 正方形的邊長 = 最左邊點(diǎn)的位置

if (blockX > (1.0 - blockSize * 2)) {

blockX = 1.0f - blockSize * 2;

}

//-1.0 - blockSize * 2 = Y(負(fù)軸邊界) - 正方形邊長 = 最下面點(diǎn)的位置

if (blockY < -1.0f + blockSize * 2 ) {

blockY = -1.0f + blockSize * 2;

}

//當(dāng)正方形移動到最上面時

if (blockY > 1.0f) {

blockY = 1.0f;

}

printf("blockX = %f\n",blockX);

printf("blockY = %f\n",blockY);

// Recalculate vertex positions

vVerts[0] = blockX;

vVerts[1] = blockY - blockSize*2;

printf("(%f,%f)\n",vVerts[0],vVerts[1]);

vVerts[3] = blockX + blockSize*2;

vVerts[4] = blockY - blockSize*2;

printf("(%f,%f)\n",vVerts[3],vVerts[4]);

vVerts[6] = blockX + blockSize*2;

vVerts[7] = blockY;

printf("(%f,%f)\n",vVerts[6],vVerts[7]);

vVerts[9] = blockX;

vVerts[10] = blockY;

printf("(%f,%f)\n",vVerts[9],vVerts[10]);

triangleBatch.CopyVertexData3f(vVerts);

//強(qiáng)制開啟渲染刷新,調(diào)用RenderScene方法

glutPostRedisplay();

}

二、通過矩陣移動圖形

其原理跟通過頂點(diǎn)移動相同,只是通過計(jì)算中心點(diǎn)的移動距離,通過矩陣函數(shù)整體計(jì)算。

同樣的在SpecialKeys()方法中計(jì)算移動距離及做邊界檢測

void SpecialKeys(int key, int x, int y){

GLfloat stepSize = 0.025f;

if (key == GLUT_KEY_UP) {

yPos += stepSize;

}

if (key == GLUT_KEY_DOWN) {

yPos -= stepSize;

}

if (key == GLUT_KEY_LEFT) {

xPos -= stepSize;

}

if (key == GLUT_KEY_RIGHT) {

xPos += stepSize;

}

//碰撞檢測

if (xPos < (-1.0f + blockSize)) {

xPos = -1.0f + blockSize;

}

if (xPos > (1.0f - blockSize)) {

xPos = 1.0f - blockSize;

}

if (yPos < (-1.0f + blockSize)) {

yPos = -1.0f + blockSize;

}

if (yPos > (1.0f - blockSize)) {

yPos = 1.0f - blockSize;

}

glutPostRedisplay();

}

與通過計(jì)算頂點(diǎn)移動圖形的方式相比,通過矩陣移動圖形,需要在刷新方法RenderScene()中設(shè)置矩陣的計(jì)算方式

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f};

//生成平移矩陣、

M3DMatrix44f mTransfromMatrix;

m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);

//計(jì)算移動后的矩陣計(jì)算及過,放到平面著色器中繪制

shaderManager.UseStockShader(GLT_SHADER_FLAT,mFinalTransform,vRed);

triangleBatch.Draw();

//執(zhí)行交換緩存區(qū)

glutSwapBuffers();

關(guān)于緩沖區(qū)的理解,在OpenGL專業(yè)名詞解析13條中有詳細(xì)介紹,同時涉及到圖片撕裂,掉幀等現(xiàn)象的原因及解決辦法。

總結(jié)

以上是生活随笔為你收集整理的c语言glut打正方形,OpenGL绘制正方形并用键盘移动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。