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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

GLFW+OpenGL三维空间旋转模型的算法

發(fā)布時間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GLFW+OpenGL三维空间旋转模型的算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在三維軟件中,用鼠標控制三維模型旋轉是很必要的,可以方便使用者觀察模型,具有諸多優(yōu)勢,那么如何實現(xiàn)呢?

有兩種方案,一種是控制模型旋轉,這種方法將著色器中的model進行旋轉變換即可;另一種是旋轉攝像頭,這種方法其實利用了相對運動的原理,要讓模型旋轉,其實也就是讓觀察者在以機器人模型為原點的球面坐標系中運動,當然運動之后,觀察者也要旋轉相應的角度。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

這樣一看是第一種方法簡單,但是當模型位置不能動時(如要進行仿真,模型有確定的坐標),移動觀察者變成唯一的選擇。

要實現(xiàn)旋轉三維模型,第一步是定義一個鼠標的反饋函數(shù),這個函數(shù)要將鼠標在屏幕中橫向移動值轉換為方位角,縱向移動值轉換為天頂角,函數(shù)的調用需要按鈕反饋函數(shù)以及鼠標移動函數(shù)的輔助。

按下鼠標右鍵的反饋:

void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) { if (action == GLFW_PRESS) switch(button) { case GLFW_MOUSE_BUTTON_RIGHT: glfwSetCursorPosCallback(window, mouse_callback2); break; default: return; } if (action != GLFW_PRESS) glfwSetCursorPosCallback(window, mouse_callback1); return; } void mouse_callback2(GLFWwindow* window, double xpos, double ypos) { if (firstMouse) { lastX = xpos; lastY = ypos; firstMouse = false; } float xoffset = 0.1*(xpos - lastX); float yoffset = 0.1*(lastY - ypos); // reversed since y-coordinates go from bottom to top lastX = xpos; lastY = ypos; //camera.ProcessMouseMovement(xoffset, yoffset); float r = sqrt(camera.Position.x * camera.Position.x + camera.Position.y * camera.Position.y + camera.Position.z * camera.Position.z); float x,y,z,afa,fi; if(camera.Position.x>=0) { afa = atan(camera.Position.z/camera.Position.x); } else { afa = atan(camera.Position.z/camera.Position.x)+3.1415926; } if(camera.Position.y>0) { fi = atan(camera.Position.x/(camera.Position.y*cos(afa))); } else { fi = atan(camera.Position.x/(camera.Position.y*cos(afa)))+3.1415926; } x = r*sin(fi+(yoffset)/180.0f*3.1415926)*cos(afa+(xoffset)/180.0f*3.1415926); y = r*cos(fi+(yoffset)/180.0f*3.1415926); z = r*sin(fi+(yoffset)/180.0f*3.1415926)*sin(afa+(xoffset)/180.0f*3.1415926); camera.update(glm::vec3(x, y, z),glm::vec3(0.0f, 1.0f, 0.0f), -90.0f+afa/3.1415926*180.0+xoffset-83.6598f, 0.0f+fi/3.1415926*180.0+yoffset-69.7911f); }

firstMouse提前設為true。

afa、fi是原始位置對應的方位角和天頂角,由于存在tan的反三角函數(shù),需要討論正負,并在值發(fā)生跳躍的時候補上180度,讓選擇連續(xù)。

總結

以上是生活随笔為你收集整理的GLFW+OpenGL三维空间旋转模型的算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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