[英]GLFW - glfwSetMousePos Bug on Mac OS X 10.7 with OpenGL camera
我一直在關注http://opengl-tutorials.org 上的教程,到目前為止它們都很棒(我使用的是 Mac,所以我不得不使用 OpenGL 3.2 和 GLSL 1.50 而不是 OpenGL 3.3 和 GLSL 3.30)。 到目前為止,教程的唯一問題是使用 3D 相機教程(教程 6:鍵盤和鼠標),當我移動鼠標時,我沒有得到任何旋轉,如果我這樣做,它只會很慢在向下的方向; 即使我向任何方向移動鼠標。
我已經編譯了給定的代碼(OpenGL 2.1 和 3.x)並手工編寫了它,這仍然存在此錯誤。 我不知道為什么會發生這種情況。 這可能是 GLFW、Mac OS X 或其他方面的錯誤嗎?
我知道這是一個很老的問題,但我遇到了同樣的問題,所以它可能會有所幫助。 我已經從網站上下載了代碼,並在 common/controls.cpp 中評論了這一行:
glfwSetMousePos(1024/2, 768/2);
顯然,MacOS 的 GLFW 中存在一個錯誤,此指令無法正常工作。 希望他們在較新的版本中修復了它,但我還沒有測試過。
附帶說明一下,注釋此行將使教程正常工作,但是在夾緊垂直攝像機角度時您可能會遇到一些問題:如果您將鼠標移過夾緊點(例如向上移動),鼠標位置將不斷更新,何時您向下移動鼠標,您必須等到它到達夾緊點,然后相機才能再次移動。
[編輯] 這是完整的修改代碼
// Reset mouse position for next frame
// EDIT : Doesn't work on Mac OS, hence the code below is a bit different from the website's
//glfwSetMousePos(1024/2, 768/2);
// Compute new orientation
horizontalAngle = 3.14f + mouseSpeed * float( 1024/2 - xpos );
verticalAngle = mouseSpeed * float( 768/2 - ypos );
正如GLFW3 的文檔所提到的:
“窗口必須有輸入焦點。”
所以你應該調用glfwSetCursorPos
直到窗口有輸入焦點! 這不是 MacOS 的 GLFW 中的錯誤!
代碼應該是這樣的:
bool firstMouse = true;
float centerX = (float)mWidth / 2, centerY = (float)mHeight / 2;
GLFWwindow* mWindow;
void mouse_callback(GLFWwindow *window, double xPos, double yPos) {
if (firstMouse) {
// why here?
// As
// https://www.glfw.org/docs/3.3/group__input.html#ga04b03af936d906ca123c8f4ee08b39e7
// mention :
// "The window must have input focus."
glfwSetCursorPos(mWindow, centerX, centerY);
firstMouse = false;
}
// ...
}
void main() {
// ...
glfwSetCursorPosCallback(mWindow, mouse_callback);
// ...
}
OS X 10.9 上的 GLFW 3 仍然存在同樣的問題。
為了禁用光標並將其捕獲在窗口內,我在創建窗口后添加了它。
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
然后我注釋掉//glfwSetCursorPos(window, 1024 / 2, 768 / 2);
在controls.cpp中
現在鼠標移動工作。 但是,似乎從某個角度查看立方體時,左右移動鼠標時視圖會旋轉,而從其他角度來看,視圖會左右移動。 奇怪的。
對於 OSX 上的 GLFW2,在 glfwCreateWindow( ...,...,) 之后在教程 XX.cpp 中添加這一行
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
然后在 common/controls.cpp 中創建兩個全局變量
double xpos_old, ypos_old;
最后注釋掉 glfwSetCursorPos(window, 1024/2, 768/2); 並將角度的計算更改為新設置,其想法是獲得舊鼠標和新鼠標之間的差異。 最終代碼應如下所示:
// Reset mouse position for next frame
// glfwSetCursorPos(window, 1024/2, 768/2);
// Compute new orientation
horizontalAngle += mouseSpeed * float( xpos_old - xpos );
verticalAngle += mouseSpeed * float( ypos_old - ypos );
xpos_old = xpos;
ypos_old = epos;
這在我的 Mac 上效果很好! 干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.