编辑:好吧,我写的代码现在完全直观,这就是结果: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);
}
我不看看我做错了什么:/
好吧,不管我尝试什么,一些轴似乎总是倒过来。我认为openTK Matrix4实现有些奇怪。我会尽快更新。 – pixartist
嗯...好吧,只能想到我能想到的是,OpenTK Matrix4的存储方式与OpenGL不同(OpenTK是行优先,OpenGL是列专业)。但是你的转变看起来不错。也许试着将它们拖动一下,看看它有什么作用... – vesan
如果你使用行主矩阵,那么你需要告诉OpenGL你传递的矩阵是行主要的。例如,查看glUniformMatrix4fv的第三个参数。另外,正如vesan所说,相机的默认前向矢量是(0,0,-1)。这意味着如果常规对象使用(0,0,1)作为其正向方向,则不能为相机和常规对象使用相同的lookAt函数。您可以创建投影矩阵,以便相机沿着正Z轴向下看。这将允许你使用相同的lookAt功能的一切。 – Homar