Opengl Can';我无法识别矩阵计算中的错误?
所以,我尝试在OpenTK中使用矩阵,我的“Transform”类有一个旋转(四元数)和一个位置向量3。它提供了folling字段:Opengl Can';我无法识别矩阵计算中的错误?,opengl,matrix,rotation,quaternions,opentk,Opengl,Matrix,Rotation,Quaternions,Opentk,所以,我尝试在OpenTK中使用矩阵,我的“Transform”类有一个旋转(四元数)和一个位置向量3。它提供了folling字段: public virtual Vector3 Right { get { return Vector3.Transform(Vector3.UnitX, Rotation); } } public virtual Vector3 For
public virtual Vector3 Right
{
get
{
return Vector3.Transform(Vector3.UnitX, Rotation);
}
}
public virtual Vector3 Forward
{
get
{
return Vector3.Transform(-Vector3.UnitZ, Rotation);
}
}
public virtual Vector3 Up
{
get
{
return Vector3.Transform(Vector3.UnitY, Rotation);
}
}
以下是创建视图和模型矩阵的方式:
public virtual Matrix4 GetMatrix()
{
Matrix4 translation = Matrix4.CreateTranslation(Position);
Matrix4 rotation = Matrix4.CreateFromQuaternion(Rotation);
return translation * rotation;
}
预测:
private void SetupProjection()
{
if(GameObject != null)
{
AspectRatio = GameObject.App.Window.Width / (float)GameObject.App.Window.Height;
projectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)((Math.PI * Fov) / 180), AspectRatio, ZNear, ZFar);
}
}
矩阵乘法:
public Matrix4 GetModelViewProjectionMatrix(Transform model)
{
return model.GetMatrix()* Transform.GetMatrix() * projectionMatrix;
}
着色器:
[Shader vertex]
#version 150 core
in vec3 pos;
in vec4 color;
uniform float _time;
uniform mat4 _modelViewProjection;
out vec4 vColor;
void main() {
gl_Position = _modelViewProjection * vec4(pos, 1);
vColor = color;
}
OpenTK矩阵被转置,因此乘法顺序
此设置的问题是,所有轴和方向向量以及对象位置都是混合、镜像和倒置的
现在,在做了大量的修改之后,我成功地实现了一个有用的转换,并最终实现了以下目标:
我必须反转方向的四元数:
public virtual Vector3 Right
{
get
{
return Vector3.Transform(Vector3.UnitX, Rotation.Inverted());
}
}
public virtual Vector3 Forward
{
get
{
return Vector3.Transform(-Vector3.UnitZ, Rotation.Inverted());
}
}
public virtual Vector3 Up
{
get
{
return Vector3.Transform(Vector3.UnitY, Rotation.Inverted());
}
}
public virtual Matrix4 GetMatrixView()
{
Matrix4 translation = Matrix4.CreateTranslation(Position*2).Inverted();
Matrix4 rotation = Matrix4.CreateFromQuaternion(Rotation);
return translation * rotation;
}
我不得不这样修改视图矩阵结构:
public virtual Vector3 Right
{
get
{
return Vector3.Transform(Vector3.UnitX, Rotation.Inverted());
}
}
public virtual Vector3 Forward
{
get
{
return Vector3.Transform(-Vector3.UnitZ, Rotation.Inverted());
}
}
public virtual Vector3 Up
{
get
{
return Vector3.Transform(Vector3.UnitY, Rotation.Inverted());
}
}
public virtual Matrix4 GetMatrixView()
{
Matrix4 translation = Matrix4.CreateTranslation(Position*2).Inverted();
Matrix4 rotation = Matrix4.CreateFromQuaternion(Rotation);
return translation * rotation;
}
如你所见,我必须反转平移矩阵并将位置乘以2,以使相机空间与世界空间匹配。什么是F
编辑:看看这个。使用默认/直观设置,我可以得到以下结果:
[日志]:(0;0;10)->
[日志]:FW(0;0;-1)
[日志]:R(-1;0;0)
[日志]:向上(0;1;0)
好的,我在Z 10,看着0,0,0。正如预期的那样,前进是x-1。向上是Y1,也可以。但是水平轴向左?这是什么样的坐标系?您提到矩阵是转置的,因此乘法顺序是颠倒的。例如,您的MVP计算是:
model.GetMatrix()* Transform.GetMatrix() * projectionMatrix;
但是您的平移*旋转串联顺序错误:
Matrix4 translation = Matrix4.CreateTranslation(Position);
Matrix4 rotation = Matrix4.CreateFromQuaternion(Rotation);
return translation * rotation;
对于非转置矩阵,正确的乘法顺序为:
translation * rotation * scale
因此,对于转置矩阵,应将其反转为:
scale * rotation * translation
因此,您的代码应该是:
Matrix4 translation = Matrix4.CreateTranslation(Position);
Matrix4 rotation = Matrix4.CreateFromQuaternion(Rotation);
return rotation * translation;
你的位置、旋转、ZNear和ZFar的值是多少?ZNear是1,ZFar是120。位置和旋转是可变的。但在启动位置和旋转分别是恒等式和零。零旋转,所以它是四元数。恒等式?否则很奇怪,使用MV矩阵的标识,您的模型应该在任何地方都进行渲染。顺便说一句,你正在做
translation*rotation
,你确定要先平移然后旋转吗?好吧,我想按对象的位置平移,然后按对象的旋转旋转?!否则我会旋转翻译。PS:yes rotation is Identity我的点是,例如,如果您从(0,0,0)开始,平移(-10,0,0),围绕Z轴旋转90度,则对象将位于(0,0,10)。如果旋转然后平移,对象将围绕其中心旋转,然后平移为(-10,0,0)。因此,根据变换的顺序,它将在不同的位置结束。这会导致相机旋转0,0坐标,即GetMatrixView()应该返回视图矩阵?是的。但是,视图矩阵的计算是否应该像网格的模型矩阵一样?不,视图矩阵的组合方式不同,这里有一个很好的链接可以查看:好的,尽管该教程使用了它所帮助的行主矩阵。但是现在,当我尝试绕一个局部轴旋转相机矩阵(没有视图)时,旋转都被搞砸了!我执行以下操作来倾斜视图:LocalRotation*=Quaternion.FromAxisAngle(轴,角度)编码>使用轴Vector3.Transform(Vector3.UnitX,旋转)
。这应该是局部右向量吗?