【问题标题】:Translating the object with glm so that it follows the mouse cursor使用 glm 平移对象,使其跟随鼠标光标
【发布时间】:2015-07-10 13:02:36
【问题描述】:

所以这就是我想要做的。我想用我的鼠标实现翻译,以便我正在翻译的对象将跟随我的鼠标移动,即如果我的鼠标光标移动一定数量的像素 X,我希望对象移动完全相同的数量 X。

到目前为止,对于旋转,我一直在使用 glm 来实现轨迹球,因此我得到了一个旋转矩阵。

我正在使用 openGL 和 SDL,因此获取鼠标坐标并不困难。 我可以在鼠标运动事件期间使用当前鼠标坐标创建一个大小为 3 的向量:

while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case  SDL_MOUSEMOTION: 
            glm::vec3 vecTranslation(event.motion.x, event.motion.y, 0);
            glm::mat4 translationMatrix ;
            glm::translate(translationMatrix, vecTranslation) ;

        }
    }

这样我就有了一个翻译矩阵,但这不会让我得到一个完全按照鼠标光标最终所做的翻译。

有人对此有一些见解吗?

此外,要获得我的最终投影矩阵以便调用glMulMatrix(),我会这样做:

glm::matrixCompMult(translationMatrix,rotationMatrix);

但是当我这样做时,平移和旋转都不起作用。如果我只是简单地返回旋转矩阵并直接将它与glMulMatrix() 一起使用,我的轨迹球会按预期运行,但如果我使用上面的代码,我只能看到我拥有的立方体的一个面,并且它会不断改变它的比例,但是从不旋转也不平移。

至于我用于绘图的代码: //假设完成了一些代码以了解是否应该进行翻译以及应该进行哪些翻译 matrixProjection = translationMatrix * mMatNow * scaleMatrix ; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); glMultMatrixf(矩阵投影); // 缩放变换 glScalef(0.5,0.5,0.5); 绘制立方体();

    glFlush(); 
    SDL_GL_SwapBuffers(); 

我得到的矩阵类似于: 第一:

1 ; 0; 0; 0; 0; 1; 0; 0; 0; 0; 1; 0; 0; 0; 0; 1;

然后翻译后:

1 ; 0; 0; 0; 0; 1; 0; 0; 0; 0; 1; -25 ; 0; 0; 0; 1;

显然翻译确实发生了,但是我在我的绘图上得到了这个奇怪的结果:

原图:

【问题讨论】:

  • 如果您拒绝投票并投票结束,请说明原因。没有反馈就无法改进问题

标签: c++ opengl glm-math


【解决方案1】:

你有你的鼠标轨迹和你想要移动的对象的位置。

让对象跟随鼠标的最简单方法是将其位置设置为鼠标的位置:

一种方法:假设您将 vec3(10, 10, 4) 作为鼠标位置,然后简单地设置

. . . 10
. . . 10
. . . 4
0 0 0 1

(你这些不写点) 作为对象矩阵。为此,您的鼠标位置必须不是窗口上的位置,而是世界上的位置。

另一种方式: 在顶点着色器中添加一个 in 变量,如下所示:

layout(location = 0) in vec3 inputPosition;
layout(location = 1) in vec3 inputOffset;
layout(location = 2) in vec4 inputColor;

out vec4 color;

uniform mat4 worldMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;

void main(void)
{
    gl_Position = worldMatrix * vec4(inputPosition + inputOffset, 1.0f);
    gl_Position = viewMatrix * gl_Position;
    gl_Position = projectionMatrix * gl_Position;

    color = inputColor;

}

其中偏移量是您的鼠标位置向量。这种方法不会将对象附加到鼠标上,而是随其移动。 此外,对于您不想移动的每个对象,您都需要另一个着色器。

编辑: 如果要旋转它指向的对象,最简单的方法是将该对象的中间作为向量并计算鼠标位置和对象向量之间的距离。然后你可以做一些数学运算来获得正确的角度并旋转对象。

编辑2:

尝试以下方法:我也曾经遇到过翻译前的矩阵与翻译后相同的问题。这是因为他确实覆盖了矩阵。 我做了什么: 首先,为了更容易,用你的对象的位置创建一个 glm::vec3。例如。 vec3(0,0,0)。 然后绘制你的四边形,它的中心位于屏幕的左上角。如果现在用鼠标位置更新四边形的位置矢量,鼠标代表四边形的中心。 所以每一帧你都执行以下操作: 伪代码:

    positionQuad.x = event.motion.x; 
positionQuad.y = 0;
    positionQuad.z = event.motion.y;
    translationMatrix = glm::translate(positionQuad); // Declare translationMatrix as global/class variable to have access anywhere. glm translate multiplies the translation vector (vec4(mX, 0, mZ, 1) with an identity matrix. This works because we initialized the quad at upper left corner
    render(); // translationMatrix now is the model matrix. in render you still have to build the MVP matrix and draw it like always.

只需添加旋转即可

glm::rotate(translationMatrix, DEGREES, glm::vec3(0,1,0)); //this changes the current model-matrix by rotating it by DEGREES degrees around the axis specified in the vec3. If you do it otherwise like translationMatrix= glm::rotate.... you would overwrite the Matrix and you wont have any translation anymore.

翻译后渲染前

【讨论】:

  • 会尽快尝试并告诉您进展如何。反正我可能有一些问题^^
  • 最终它没有帮助,因为我想直接使用 GLM 中使用的函数。似乎有翻译功能,但它不起作用
  • 有多种原因。第一:鼠标X和Y是怎么计算的?您获得屏幕坐标(例如 523、445)还是获得增量? (1.456, 0.235)。如果你得到增量,你不会真正移动对象,因为如果你不移动鼠标,位置会重置。另一件事,试试 yourMatrix = glm::translate(vec3(mouseX, mouseY, 0)); ,这就是我做翻译的方式。然后我旋转这样做:yourMatrix = glm::rotate (yourMatrix, degree, vec3(0,1,0))。如果您不这样做,您可能会覆盖 yourMatrix 并且它不再翻译。之后我也使用着色器来绘制 MVP
  • 啊,我想我现在看到问题了:好的:您将立方体移动到 -z 方向,所以现在相机位于立方体内部。用鼠标移动它会让你沿着 x 和 y 移动它。所以只要改变你的翻译,mousex 会影响 x 位置和 mousey y 位置
  • 另外,您似乎只是在移动黄色的面孔。你不移动整个立方体。检查转换是否适用于整个
猜你喜欢
  • 1970-01-01
  • 2022-06-27
  • 2022-11-18
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多