Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何平移光标位置并缩放投影矩阵Opengl_Java_Opengl_Matrix - Fatal编程技术网

Java 如何平移光标位置并缩放投影矩阵Opengl

Java 如何平移光标位置并缩放投影矩阵Opengl,java,opengl,matrix,Java,Opengl,Matrix,我正在使用LWJGL,我希望在缩放投影矩阵后选择瓷砖,但我不确定如何选择。我正在为线性代数库使用JOML。投影矩阵首先应用正交变换,然后将其转换为玩家的位置,最后进行缩放。当我缩放投影矩阵时,由于所有内容都在放大,鼠标不再选择正确的平铺。这是我试图更正鼠标位置的尝试: float cursorX = input.getCursorPosX() + getX(); float cursorY = input.getCursorPosY(true) + getY(); cursorX *= (

我正在使用LWJGL,我希望在缩放投影矩阵后选择瓷砖,但我不确定如何选择。我正在为线性代数库使用JOML。投影矩阵首先应用正交变换,然后将其转换为玩家的位置,最后进行缩放。当我缩放投影矩阵时,由于所有内容都在放大,鼠标不再选择正确的平铺。这是我试图更正鼠标位置的尝试:

 float cursorX = input.getCursorPosX() + getX();
 float cursorY = input.getCursorPosY(true) + getY();
 cursorX *= (1/cameraScalar);
 cursorY *= (1/cameraScalar);

前两行从GLFW获取光标,并将玩家位置添加到其中。第三行和第四行只需乘以相机比例的倒数。

我不熟悉JOML,但一般的方法是这样的:

  • 将以像素为单位的真实屏幕坐标转换为OpenGL屏幕坐标系,该坐标系是位于(0,0,0)的立方体,边长为2(您可能需要反转Y轴):

    float-screenX=2.0f*mouseX/屏幕宽度-1.0f;
    浮动屏幕Y=1.0f-2.0f*鼠标/屏幕高度;
    

  • 使用投影矩阵的逆(
    proj
    )使用坐标(screenX,screenY,1)将屏幕向量投影到世界:

    Vector3屏幕=新的Vector3(屏幕X,屏幕Y,1);
    Vector3 world=proj.inverse().mul(屏幕);
    

  • 现在
    world.x
    world.y
    包含正确的世界坐标


  • 我不熟悉JOML,但是您想要做的事情的一般方法是这样的:

  • 将以像素为单位的真实屏幕坐标转换为OpenGL屏幕坐标系,该坐标系是位于(0,0,0)的立方体,边长为2(您可能需要反转Y轴):

    float-screenX=2.0f*mouseX/屏幕宽度-1.0f;
    浮动屏幕Y=1.0f-2.0f*鼠标/屏幕高度;
    

  • 使用投影矩阵的逆(
    proj
    )使用坐标(screenX,screenY,1)将屏幕向量投影到世界:

    Vector3屏幕=新的Vector3(屏幕X,屏幕Y,1);
    Vector3 world=proj.inverse().mul(屏幕);
    

  • 现在
    world.x
    world.y
    包含正确的世界坐标

  • JOML提供GLU的“unproject”函数和一个额外的“.”

    JOML提供GLU的“unproject”函数和一个额外的“.”