C# OpenGL OpenTK - камера отходит от чертежей, когда я настраиваю значение eye.X - PullRequest
1 голос
/ 27 февраля 2020

Я уже несколько дней пытаюсь настроить камеру в OpenGL, но просто не могу заставить ее работать должным образом. По мере того, как значение eye.X или eye.Y увеличивается / уменьшается, вместо того, чтобы «смотреть вокруг», камера (я знаю, что нет такой вещи, как камера ...) удаляется / приближается к чертежам!

Надеюсь, что следующая информация может вам помочь. (Я также загрузил видео, в котором показана ошибка): https://www.youtube.com/watch?v=OlD5X0EzkUw

Эти мои вычисления ModelView для OnUpdateFrame .

_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;
}

1 Ответ

1 голос
/ 27 февраля 2020

Чтобы оглянуться вокруг, вы должны повернуть 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;

Предполагается, что eye и center относятся к типу Vector3. Возможно, вам придется изменить масштаб _mouseDeltaY для ваших нужд.

...