簡體   English   中英

GLFW - 帶有 OpenGL 相機的 Mac OS X 10.7 上的 glfwSetMousePos 錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM