2014-07-05 34 views
-1

编辑:好吧,我写的代码现在完全直观,这就是结果:X轴似乎倒在OpenTK

http://i.imgur.com/x5arJE9.jpg

立方体在0,0,0

正如你所看到的,摄像头在z轴上的位置是负的,这表明我沿正z轴观察,这与不匹配。 (fw是负数)

另外,立方体颜色表明我处于正z轴上,朝负方向看。也正x轴是向右(在模型空间)

角度被计算如下:

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矩阵转置,因此乘法的顺序。

任何想法为什么轴/位置都搞砸了?

编辑结束。原贴:

看一看这个图片:http://i.imgur.com/Cjjr8jz.jpg

正如你可以看到,当(相机)正向矢量在Z轴,红色立方体正面是负x轴,

float[] points = { 
// position (3) Color (3) 
-s, s, z, 1.0f, 0.0f, 0.0f, // Red point 
s, s, z, 0.0f, 1.0f, 0.0f, // Green point 
s, -s, z, 0.0f, 0.0f, 1.0f, // Blue point 
-s, -s, z, 1.0f, 1.0f, 0.0f, // Yellow point 
}; 

相机x位置似乎被反转(立方体在围绕这些点几何着色器创建的)。换句话说,如果我沿着它的局部x轴增加相机位置,它将向左移动,反之亦然。

我通过变换矩阵是这样的:

 if (DefaultAttributeLocations.TryGetValue("modelViewProjectionMatrix", out loc)) 
     { 
      if (loc >= 0) 
      { 
       Matrix4 mvMatrix = Camera.GetMatrix() * projectionMatrix; 
       GL.UniformMatrix4(loc, false, ref mvMatrix); 
      } 

     } 

的GetMatrix()方法是这样的:

public virtual Matrix4 GetMatrix() 
    { 
     Matrix4 translation = Matrix4.CreateTranslation(Position); 
     Matrix4 rotation = Matrix4.CreateFromQuaternion(Rotation); 

     return translation * rotation; 
    } 

和投影矩阵:

private void SetupProjection() 
    { 
     AspectRatio = Window.Width/(float)Window.Height; 
     projectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)((Math.PI * Fov)/180), AspectRatio, ZNear, ZFar); 
    } 

我不看看我做错了什么:/

回答

1

这段代码有点难以分辨,但我相信这是因为在OpenGL中,摄像头的默认前向向量沿着Z轴是负向的 - 你是积极的,这意味着你正在从背部。这就是为什么X坐标似乎倒过来的原因。

+0

好吧,不管我尝试什么,一些轴似乎总是倒过来。我认为openTK Matrix4实现有些奇怪。我会尽快更新。 – pixartist

+0

嗯...好吧,只能想到我能想到的是,OpenTK Matrix4的存储方式与OpenGL不同(OpenTK是行优先,OpenGL是列专业)。但是你的转变看起来不错。也许试着将它们拖动一下,看看它有什么作用... – vesan

+0

如果你使用行主矩阵,那么你需要告诉OpenGL你传递的矩阵是行主要的。例如,查看glUniformMatrix4fv的第三个参数。另外,正如vesan所说,相机的默认前向矢量是(0,0,-1)。这意味着如果常规对象使用(0,0,1)作为其正向方向,则不能为相机和常规对象使用相同的lookAt函数。您可以创建投影矩阵,以便相机沿着正Z轴向下看。这将允许你使用相同的lookAt功能的一切。 – Homar

0

虽然这个问题还有几年了,但我仍然想提出我的意见。

你遇到这个bug的原因是因为OpenTK的矩阵是行重点。所有这一切真的意味着你必须做所有的矩阵数学是相反的。例如,变换矩阵就会成倍增加,像这样:

public static Matrix4 CreateTransformationMatrix(Vector3 position, Quaternion rotation, Vector3 scale) 
{ 
    return Matrix4.CreateScale(scale) * 
      Matrix4.CreateFromQuaternion(rotation) * 
      Matrix4.CreateTranslation(position); 
} 

这也同样适用于矩阵,所以如果你使用的Vector3的,而不是四元对您的旋转将是这样的:

public static Matrix4 CreateTransformationMatrix(Vector3 position, Vector3 rotation, Vector3 scale) 
{ 
    return Matrix4.CreateScale(scale) * 
      Matrix4.CreateRotationZ(rotation.Z) * 
      Matrix4.CreateRotationY(rotation.Y) * 
      Matrix4.CreateRotationX(rotation.X) * 
      Matrix4.CreateTranslation(position); 
} 

请注意,你的顶点着色器仍然会这样相乘:

void main() 
{ 
    gl_Position = projection * view * transform * vec4(position, 1.0f); 
} 

我希望这有助于!