gpt4 book ai didi

c# - 不确定在这种情况下如何正确使用 Matrix4.LookAt

转载 作者:行者123 更新时间:2023-12-04 08:06:23 24 4
gpt4 key购买 nike

我正在试验光线行进,并且一直在关注 Jamie Wong's tutorial.
当移动相机部分来时,他们使用该功能

mat4 viewMatrix(vec3 eye, vec3 center, vec3 up) {
vec3 f = normalize(center - eye);
vec3 s = normalize(cross(f, up));
vec3 u = cross(s, f);
return mat4(
vec4(s, 0.0),
vec4(u, 0.0),
vec4(-f, 0.0),
vec4(0.0, 0.0, 0.0, 1)
);
}
生成可用于变换方向向量的矩阵,以便相机观察正确的对象。
我想将矩阵计算移出着色器,因为它更适合作为统一体,所以我做到了,但是 OpenTK 的函数 Matrix4.LookAt()产生非常不同的结果,我不确定如何使用 Jamie 函数提供的简单乘法将它们应用于光线。
我已经确认矩阵被正确加载到统一中,它只是不适用于方向向量。
编辑:我知道我可以将 Jamie Wong 的函数从 GLSL 翻译成 C#,但我想知道 Matrix4.LookAt 的正确用法。

最佳答案

OpenTK 提供数据类型 Vector3 , Vector4Matrix4OpenTK.Mathematics命名空间。
假设你有向量:

Vector3 center;
Vector3 eye;
Vector3 up;
计算 View 矩阵如下
var f = Vector3.Normalize(center - eye);
var s = Vector3.Normalize(Vector3.Cross(f, up));
var u = Vector3.cross(s, f);
var viewMatrix = new Matrix4(
new Vector4(s, 0.0f),
new Vector4(u, 0.0f),
new Vector4(-f, 0.0f),
new Vector4(0.0f, 0.0f, 0,0f, 1.0f),
);
制服类型 mat4可以用 GL.UniformMatrix4 设置.例如:
uniform mat4 viewMatrix;
int viewMatrixLoc = GL.GetUniformLocation(0, "viewMatrix");
GL.UniformMatrix4(viewMatrixLoc, false, ref viewMatrix);

您的“ View 矩阵”从 View 空间转换为世界空间。它将“ View ”射线转换为世界。 Matrix4.LookAt相反。它计算将世界空间转换为 View 空间的矩阵。它生成一个用于光栅化的矩阵,其中一个对象必须从世界转换为 View 。
所以你需要 invert你从 Matrix4.LookAt 得到的矩阵:
Matrix4 viewMatrix = Matrix4.LookAt(
new Vector3(0.0f),
center - eye,
up
).Inverted();

关于c# - 不确定在这种情况下如何正确使用 Matrix4.LookAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66200688/

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