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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenGL】鼠标控制旋转(四)

發布時間:2024/1/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenGL】鼠标控制旋转(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先聲明自己是這方面的小白,希望大神可以對有問題以及可以優化的地方提出來。也歡迎指出不足和吐槽。希望幫到小白。

自己參考得比較多的網站是這個:
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html

所有代碼都可以去github免費下載(不怎么喜歡CSDN的積分下載):
https://github.com/Iamttp/OpenGLTest

不多廢話,好先上這一節的效果圖。

#include <gl/glut.h> #include <iostream>bool mouseDown = false;float xrot = 0.0f; float yrot = 0.0f;float xdiff = 0.0f; float ydiff = 0.0f;// 繪制正方體 void drawBox() {glBegin(GL_QUADS);glColor3f(1.0f, 0.0f, 0.0f);// FRONTglVertex3f(-0.5f, -0.5f, 0.5f);glVertex3f(0.5f, -0.5f, 0.5f);glVertex3f(0.5f, 0.5f, 0.5f);glVertex3f(-0.5f, 0.5f, 0.5f);// BACKglVertex3f(-0.5f, -0.5f, -0.5f);glVertex3f(-0.5f, 0.5f, -0.5f);glVertex3f(0.5f, 0.5f, -0.5f);glVertex3f(0.5f, -0.5f, -0.5f);glColor3f(0.0f, 1.0f, 0.0f);// LEFTglVertex3f(-0.5f, -0.5f, 0.5f);glVertex3f(-0.5f, 0.5f, 0.5f);glVertex3f(-0.5f, 0.5f, -0.5f);glVertex3f(-0.5f, -0.5f, -0.5f);// RIGHTglVertex3f(0.5f, -0.5f, -0.5f);glVertex3f(0.5f, 0.5f, -0.5f);glVertex3f(0.5f, 0.5f, 0.5f);glVertex3f(0.5f, -0.5f, 0.5f);glColor3f(0.0f, 0.0f, 1.0f);// TOPglVertex3f(-0.5f, 0.5f, 0.5f);glVertex3f(0.5f, 0.5f, 0.5f);glVertex3f(0.5f, 0.5f, -0.5f);glVertex3f(-0.5f, 0.5f, -0.5f);// BOTTOMglVertex3f(-0.5f, -0.5f, 0.5f);glVertex3f(-0.5f, -0.5f, -0.5f);glVertex3f(0.5f, -0.5f, -0.5f);glVertex3f(0.5f, -0.5f, 0.5f);glEnd(); }// 繪制函數 void display() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(0.0f, 0.0f, 3.0f,0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f);// 實現鼠標旋轉的核心glRotatef(xrot, 1.0f, 0.0f, 0.0f);glRotatef(yrot, 0.0f, 1.0f, 0.0f);drawBox();glFlush();glutSwapBuffers(); }void resize(int w, int h) {glMatrixMode(GL_PROJECTION);glLoadIdentity();glViewport(0, 0, w, h);gluPerspective(45.0f, 1.0f * w / h, 1.0f, 100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); }// 鼠標事件 void mouse(int button, int state, int x, int y) {if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {mouseDown = true;xdiff = x - yrot;ydiff = -y + xrot;std::cout << "xdiff:" << xdiff << "\tydiff" << ydiff << std::endl;}elsemouseDown = false; }// 鼠標移動事件 void mouseMotion(int x, int y) {if (mouseDown) {yrot = x - xdiff;xrot = y + ydiff;std::cout << "yrot:" << yrot << "\txrot" << xrot << std::endl;glutPostRedisplay();} }int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitWindowPosition(50, 50);glutInitWindowSize(500, 500);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);glutCreateWindow("demo");glutDisplayFunc(display);glutMouseFunc(mouse);glutMotionFunc(mouseMotion);glutReshapeFunc(resize);glClearColor(0.93f, 0.93f, 0.93f, 0.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glClearDepth(1.0f);glutMainLoop();return 0; }

可以看到代碼非常的簡潔,這是根據國外的一個示例代碼縮減的。關鍵就是并不是改變了攝像頭的視角(gluLookAt),而是直接在繪制之前就旋轉坐標系,讓之后繪制的東西都直接旋轉了。讓我們看起來像攝像頭視角在動(我只能說真cool)。

OpenGL專欄: https://blog.csdn.net/qq_40515692/article/details/103938499

總結

以上是生活随笔為你收集整理的【OpenGL】鼠标控制旋转(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。