gpt4 book ai didi

c++ - 您如何计算相机的变换矩阵?

转载 作者:行者123 更新时间:2023-11-30 01:10:08 25 4
gpt4 key购买 nike

我有一台摄像机,其位置,正向,向右和向下 vector 定义为类成员_position_forward_right_down。对于问题的旋转部分,我仅使用_forward_right_down加载目标坐标系( View 空间)的行,然后应用旋转矩阵进入“OpenGL” View 空间。

在此之前,我通过_position的否定词进行翻译。这是正确的吗,还是我需要做更多的数学运算才能确定要乘以我的旋转倍数或倍数的实际平移?

下面是我似乎无法正常工作的代码。具体来说,我是在世界空间的原点渲染一个对象(面向z轴的小方形),当我运行该程序时,该对象看起来变形了。 (请注意,尽管mat4构造函数将元素存储在内部main列中,但它们以ROW main顺序接受)。

mat4 Camera::matrix() const
{
return
mat4(
0.0f, 0.0f, -1.0f, 0.0f,
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f) *
mat4(
_forward.x, _forward.y, _forward.z, 0.0f,
_right.x, _right.y, _right.z, 0.0f,
_down.x, _down.y, _down.z, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f) *
translate(
-_position.x,
-_position.y,
-_position.z
);
}

这是以上代码之前使用的外观函数代码。
void Camera::look_at(const vec3& position, const vec3& point)
{
_position = position;
_forward = normalize(point - position);
_right = cross(_forward, vec3(0.0f, 1.0f, 0.0f));
_down = cross(_forward, _right);
}

在初始化时,我使用以下代码:
camera.look_at(vec3(1.0f, 1.0f, 1.0f), vec3(0.0f, 0.0f, 0.0f));
view = camera.matrix();
proj = perspective(60.0f, SCREEN_WIDTH / (float)SCREEN_HEIGHT, 0.001f, 100.0f);
view_proj = proj * view;

最佳答案

为了方便起见,我建议使用glm::lookAt()

有关更多信息,请引用https://glm.g-truc.net/0.9.2/api/a00245.html#ga2d6b6c381f047ea4d9ca4145fed9edd5

但是,这就是从位置,目标和上 vector 构造它的方式。

请注意,这与lookAt()函数相同。

//creates a lookat matrix
mat4 lookAt(Vec3 eye, Vec3 center, Vec3 up)
{
Vec3 left, up2, forward;

// make rotation matrix

// forward vector
forward = center - eye;
forward.Normalize();

// up2 vector (assuming up is normalized)
up2 = up;

// left vector = up2 cross forward
left = up2.Cross(forward);

// Recompute up2 = forward cross left (in case up and forward were not orthogonal)
up2 = forward.Cross(left);

// cross product gives area of parallelogram, which is < 1.0 for
// non-perpendicular unit-length vectors; so normalize left, up2 here
left.Normalize();
up2.Normalize();

mat4(
left.x, left.y, left.z, left.Dot(-eye),
up2.x, up2.y, up2.z, up2.Dot(-eye),
-forward.x, -forward.y, -forward.z, -forward.Dot(-eye),
0.0f, 0.0f, 0.0f, 1.0f)

}

注意up2 = up,如果up和forward正交,否则up2是要转发的正交up vector 。

关于c++ - 您如何计算相机的变换矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38819647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com