所以这就是我想要做的。我想用鼠标实现翻译,以便我翻译的对象将跟随我的鼠标移动,即如果我的鼠标光标移动一定数量的像素X我想让对象移动相同数量的X.
到目前为止旋转我一直在使用glm来实现arcball,我得到了一个旋转矩阵。
我正在使用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()
一起使用,我的arcball就像预期的那样,但如果我使用上面的代码,我只能看到我拥有的多维数据集的一个面,并且它一直在改变它比例,但从不旋转或翻译。
至于我用于绘图的代码: //假设已经完成了一些代码以了解是否应该执行哪些翻译 matrixProjection = translationMatrix * mMatNow * scaleMatrix; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); glMultMatrixf(matrixProjection); //缩放转换 glScalef(0.5,0.5,0.5); drawCube();
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;
显然翻译确实发生了,但是我在绘图上得到了这个奇怪的结果:
原图:
答案 0 :(得分: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;
}
其中偏移量是鼠标位置向量。这种方法不会将对象附加到鼠标上,而是随之移动它。 此外,对于您不想移动的每个对象,您还需要另一个着色器。
编辑: 如果要旋转指向courser的对象,最简单的方法是将该对象的中间作为矢量并计算鼠标位置和对象矢量之间的距离。然后你可以做一些数学运算来获得正确的角度并旋转对象。
EDIT2:
尝试以下方法:我曾经遇到过翻译前我的矩阵与翻译后相同的问题。这是因为无论如何他确实覆盖了矩阵。 我做了什么: 首先,为了更容易,使用对象的位置创建一个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.
翻译后和渲染之前