C# OpenGL OpenTK - 当我调整 eye.X 值时,相机远离绘图

C# OpenGL OpenTK - Camera moves away from drawings as I adjust eye.X value

几天来我一直在尝试在 OpenGL 中设置相机,但就是无法正常工作。 由于 eye.X 或 eye.Y 值 increases/decreases,而不是 "looking arround",相机(我知道没有相机这样的东西......)移动 away/gets 离图纸更近了!

希望以下信息对您有所帮助。(我还上传了一个视频,显示错误): 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;
}

要环顾四周,您必须 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 的比例。