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

C# 不确定在这种情况下如何正确使用Matrix4.LookAt,c#,opengl,matrix,glsl,opentk,C#,Opengl,Matrix,Glsl,Opentk,我正在试验射线行进,并且一直在跟随 当“移动摄影机”部分出现时,他们使用该功能 mat4视图矩阵(vec3眼睛,vec3中心,vec3向上){ vec3 f=正常化(中心-眼睛); vec3 s=标准化(交叉(f,向上)); vec3 u=交叉(s,f); 返回mat4( vec4(s,0.0),, vec4(u,0.0), vec4(-f,0.0), vec4(0.0,0.0,0.0,1) ); } 生成一个矩阵,该矩阵可用于变换方向向量,以便摄影机注视正确的对象 虽然我想将矩阵计算从着色器

我正在试验射线行进,并且一直在跟随

当“移动摄影机”部分出现时,他们使用该功能

mat4视图矩阵(vec3眼睛,vec3中心,vec3向上){
vec3 f=正常化(中心-眼睛);
vec3 s=标准化(交叉(f,向上));
vec3 u=交叉(s,f);
返回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的正确用法。瞧。

OpenTK在
OpenTK.Mathematics
命名空间中提供了数据类型
Vector3
Vector4
Matrix4

假设你有向量:

Vector3中心;
矢量3眼;
矢量3向上;
按如下所示计算视图矩阵

var f=Vector3.标准化(中心眼);
VarS=Vector3.归一化(Vector3.交叉(f,向上));
var u=向量3.交叉(s,f);
var viewMatrix=新矩阵x4(
新矢量4(s,0.0f),
新矢量4(u,0.0f),
新矢量4(-f,0.0f),
新矢量4(0.0f,0.0f,0,0f,1.0f),
);
可以使用
GL.UniformMatrix4
设置类型为
mat4
的制服。例如:

统一mat4视图矩阵;

“视图矩阵”从视图空间转换为世界空间。它将“视图”光线转换为世界。
Matrix4.LookAt
的作用正好相反。它计算将世界空间转换为视图空间的矩阵。它生成用于光栅化的矩阵,在该矩阵中,必须将对象从世界转换为视图。
因此,您需要从
Matrix4获取矩阵。请看

Matrix4 viewMatrix=Matrix4.LookAt(
新矢量3(0.0f),
中心眼,,
向上的
).inversed();

是的,我知道我可以将Jamie的函数转换为C#,但我想知道如何正确使用内置的Matrix4.LookAt方法(如果适用)。我应该在我的问题中更清楚地说明这一点,对不起,我已经扩展了答案。好吧,您引用的
viewMatrix
函数不是一个“LookAt”函数,因为它通常在计算机图形学的上下文中使用;您的函数仅设置旋转矩阵,不基于
眼睛
位置进行平移。至少非常不幸的是,如果它真的只对视图方向感兴趣,那么它就使用了参数
eye
center
,并误导用户认为它可能会创建一个
lookAt
矩阵(不确定是否有意)@derhass,这是有意义的。那么,LookAt函数是相关的还是我应该把viewMatrix函数转换成C#?嗯,更糟糕。它被称为
viewMatrix
,但创建了我们通常称之为视图矩阵的逆矩阵(该矩阵应该从世界空间转换为视图空间)。从概念上讲,代码的作用与转置(注视((0,0,0),中心眼,向上))的作用相同。请注意,这段代码没有任何错误-进行逆变换对于光线投射完全有意义,它不符合那些矩阵辅助函数(如
LookAt
)用于光栅化管道的概念和术语。
int viewMatrixLoc = GL.GetUniformLocation(0, "viewMatrix");
GL.UniformMatrix4(viewMatrixLoc, false, ref viewMatrix);