【发布时间】:2018-03-20 09:36:22
【问题描述】:
我有一个对象,它是变形的(在 Y 轴上旋转 45 度)。
目标是在x和y轴上移动(平移)物体并保持变换效果不变。
太难解释了,所以发了一张图:
我知道 opengl 中相机的概念,我知道我不能真正移动相机,但实际上一切都在相机周围移动。有人真的知道如何做到这一点吗?
我的代码:
//set mvp
matrixProj = new PerspectiveProjectionMatrix(fovy, aspect, near, far);
matrixView = new ModelMatrix();
matrixView.LookAtTarget(new Vertex3f(0, 0, 2), new Vertex3f(0, 0, 0), new Vertex3f(0, 1, 0));
matrixModel = new ModelMatrix();
matrixModel.SetIdentity();
matrixModel.RotateY(45);
matrixModel.Translate(-2, -2, 0);
Matrix4x4 mvp = matrixProj * matrixView * matrixModel;
Gl.UniformMatrix4(Gl.GetUniformLocation(shaderProgram, "MVP"), 1, false, mvp.ToArray());
//draw quad
Gl.Begin(PrimitiveType.Quads);
Gl.Vertex3(-2, 2, 0);
Gl.Vertex3(2, 2, 0);
Gl.Vertex3(2, -2, 0);
Gl.Vertex3(-2, -2, 0);
Gl.End();
【问题讨论】:
-
请参阅Understanding 4x4 homogenous transform matrices,这样您就可以将相机矩阵和模型矩阵分开......并且仅在渲染之前组合......看看那里最后一个链接中的示例。顺便说一句,您的图像没有多大意义,因为所需结果和当前结果之间的差异并不明显。你想沿着相机局部轴或物体局部轴或世界全局轴移动?
-
你能给我们一些代码吗,你是如何应用你不同的转换的。
-
@DraykoonD 我添加了一些代码
-
您知道透视投影在物体移动时会改变物体的轮廓,对吗?如果您不想进行这些更改,请使用正交投影
-
您可以在投影矩阵上预乘一个平移矩阵,从而产生应用透视后移动对象的效果。从概念上讲,这将导致不对称的平截头体(这与投影仪的镜头移位实现的原理相同)。但是,如果您的场景中有多个对象,并且您希望对每个对象应用不同的此类变换,则必须小心(如果您只在 x 和 y 中平移,它应该仍然可以很好地工作,但如果您还搞砸了深度测试修改 z)。
标签: opengl matrix 3d camera projection