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);