gpt4 book ai didi

c++ - 在 eigen 中为顶点着色器设置投影、模型和 View 变换

转载 作者:可可西里 更新时间:2023-11-01 16:34:39 27 4
gpt4 key购买 nike

我环顾四周,但从未明确地看到每个矩阵的作用以及形成它们的操作(因此实际的特征函数调用)。这就是我要找的。或者至少是对过程的描述和几个带有特征函数的例子,看看一般是怎么做的!不管怎样,下面是一些有用的细节:

我正在设置一个自上而下的透视游戏(因此相机向下固定但可以沿 XY 平面旋转和移动),但是因为我将有一些 3D 元素(以及一些严格的 2D 元素) ) 我认为透视投影效果很好。但我确实想知道形成正交投影需要哪些命令...

我有点理解 View ,这可以通过将相机坐标平移到原点,通过相机旋转进行旋转,将它们平移回原来的位置,然后缩放缩放来完成?但具体涉及哪些函数和对象,我不确定。

对于存储任何给定对象的旋转,四元数似乎是最佳选择。那么这会决定模型投影吗?如果我设法将我的旋转简化为一个角度的二维情况,那么四元数会不会很浪费?

这些矩阵是否都需要从每一帧的身份中重新生成?还是可以以某种方式更改它们以适应新数据?

我真的更愿意为此使用 eigen 而不是手持库,但我需要一些东西来弄清楚到底发生了什么......我有所有的 GLSL 设置和正在馈送的统一矩阵使用我的 VAO 进行渲染,我只需要理解并制作它们。

编辑:
我的顶点着色器使用此标准设置,其中 3 个统一的 mat4 与位置 vec3 相乘:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);

mat3s 和 vec2 是否可以用于定位以在纯 2D 情况下获得更好的性能?

最佳答案

这里是一个 lookAt 和 setPerspective 函数的例子,它从简单的输入创建 View 和投影矩阵:

void Camera::lookAt(const Eigen::Vector3f& position, const Eigen::Vector3f& target, const Eigen::Vector3f& up)
{
Matrix3f R;
R.col(2) = (position-target).normalized();
R.col(0) = up.cross(R.col(2)).normalized();
R.col(1) = R.col(2).cross(R.col(0));
mViewMatrix.topLeftCorner<3,3>() = R.transpose();
mViewMatrix.topRightCorner<3,1>() = -R.transpose() * position;
mViewMatrix(3,3) = 1.0f;
}

void Camera::setPerspective(float fovY, float aspect, float near, float far)
{
float theta = fovY*0.5;
float range = far - near;
float invtan = 1./tan(theta);

mProjectionMatrix(0,0) = invtan / aspect;
mProjectionMatrix(1,1) = invtan;
mProjectionMatrix(2,2) = -(near + far) / range;
mProjectionMatrix(3,2) = -1;
mProjectionMatrix(2,3) = -2 * near * far / range;
mProjectionMatrix(3,3) = 0;
}

然后您可以将矩阵指定给 GL:

glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_view"), 1, GL_FALSE, mCamera.viewMatrix().data());
glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_proj"), 1, GL_FALSE, mCamera.projectionMatrix().data());

对于模型转换(最好将 View 和模型分开),您可以使用带有 Scaling、Translation 和 Quaternion 类的 Geometry 模块来组装 Affine3f 对象。

关于c++ - 在 eigen 中为顶点着色器设置投影、模型和 View 变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13768423/

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