Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl Can';我无法识别矩阵计算中的错误?_Opengl_Matrix_Rotation_Quaternions_Opentk - Fatal编程技术网

Opengl Can';我无法识别矩阵计算中的错误?

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

所以,我尝试在OpenTK中使用矩阵,我的“Transform”类有一个旋转(四元数)和一个位置向量3。它提供了folling字段:

    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,旋转)
。这应该是局部右向量吗?