1

几天来,我一直在尝试在 OpenGL 中设置相机,但我无法让它正常工作。随着 eye.X 或 eye.Y 值的增加/减少,而不是“环顾四周”,相机(我知道没有相机之类的东西......)移开/靠近图纸!

我希望以下信息可以帮助你。(我还上传了一个视频,显示错误): https ://www.youtube.com/watch?v=OlD5X0EzkUw

这些是我在OnUpdateFrame上的 ModelView 计算。

_worldPosition = Matrix4.CreateTranslation(_worldX, _worldY, _worldZ);
_cameraMatrix = Matrix4.LookAt(eye.X, eye.Y, eye.Z, center.X, center.Y, center.Z, up.X, up.Y, up.Z);

_modelViewMatrix = _worldPosition * _cameraMatrix;

在这里,我使用OnMouseMove函数调整值:

if (_mouseDown)
{
     _mousePos.X = 2.0f * Mouse.X / Width - 1;
     _mousePos.Y = 2.0f * Mouse.Y / Width - 1;

     _mouseDeltaY = (_mousePosOld.Y - _mousePos.Y) / 10;
     _mouseDeltaX = (_mousePosOld.X - _mousePos.X) / 10;

     eye.X -= _mouseDeltaX;
     eye.Y -= _mouseDeltaY;
}

最后是我的顶点着色器

#version 440 core

layout (location = 0) in vec4 position;
layout(location = 1) in vec4 color;

layout(location = 2) uniform  mat4 projectionMatrix;
layout (location = 3) uniform  mat4 modelViewMatrix;

out vec4 vs_color;

void main(void)
{
    gl_Position = projectionMatrix * modelViewMatrix * position;
    vs_color = color;
}
4

1 回答 1

1

要环顾四周,您必须center四处旋转eye

例如,如果您想围绕 x 轴(向上、向下)进行旋转,则必须设置一个取决于以下内容的旋转矩阵_mouseDeltaY

float angle_degree = _mouseDeltaY;
Matrix4 rotateY = Matrix4.CreateRotationY(angle_degree * (float)Math.PI / 180.0f);

计算从eye到中心的向量并旋转它:

Vector3 toTarget = center - eye;
toTarget = Vector4.Transform(new Vector4(toTarget, 0.0f), rotateY).Xyz;

最后计算新中心

center = eye + toTarget;

eyecenter假定为 类型Vector3。可能您必须根据需要更改规模_mouseDeltaY

于 2020-02-27T18:25:32.197 回答