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;
eye
和 center
被假定为 Vector3
类型。可能您必须根据需要更改 _mouseDeltaY
的比例。
几天来我一直在尝试在 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;
eye
和 center
被假定为 Vector3
类型。可能您必须根据需要更改 _mouseDeltaY
的比例。