gpt4 book ai didi

c# - 将建模矩阵应用于 View 矩阵 = 失败

转载 作者:行者123 更新时间:2023-11-30 14:38:27 24 4
gpt4 key购买 nike

我在 OpenGL 中移动和旋转对象时遇到问题。我正在使用 C# 和 OpenTK (Mono),但我想问题出在我不了解 OpenGL 部分,因此即使您对 C#/OpenTK 一无所知,您也可以帮助我。

我正在阅读 OpenGL SuperBible(最新版)并尝试重写 GLFrame在 C# 中。这是我已经重写的部分:

public class GameObject
{
protected Vector3 vLocation;
public Vector3 vUp;
protected Vector3 vForward;

public GameObject(float x, float y, float z)
{
vLocation = new Vector3(x, y, z);
vUp = Vector3.UnitY;
vForward = Vector3.UnitZ;
}

public Matrix4 GetMatrix(bool rotationOnly = false)
{
Matrix4 matrix;

Vector3 vXAxis;
Vector3.Cross(ref vUp, ref vForward, out vXAxis);

matrix = new Matrix4();
matrix.Row0 = new Vector4(vXAxis.X, vUp.X, vForward.X, vLocation.X);
matrix.Row1 = new Vector4(vXAxis.Y, vUp.Y, vForward.Y, vLocation.Y);
matrix.Row2 = new Vector4(vXAxis.Z, vUp.Z, vForward.Z, vLocation.Z);
matrix.Row3 = new Vector4(0.0f, 0.0f, 0.0f, 1.0f);

return matrix;
}

public void Move(float x, float y, float z)
{
vLocation = new Vector3(x, y, z);
}

public void RotateLocalZ(float angle)
{
Matrix4 rotMat;

// Just Rotate around the up vector
// Create a rotation matrix around my Up (Y) vector
rotMat = Matrix4.CreateFromAxisAngle(vForward, angle);

Vector3 newVect;

// Rotate forward pointing vector (inlined 3x3 transform)
newVect.X = rotMat.M11 * vUp.X + rotMat.M12 * vUp.Y + rotMat.M13 * vUp.Z;
newVect.Y = rotMat.M21 * vUp.X + rotMat.M22 * vUp.Y + rotMat.M23 * vUp.Z;
newVect.Z = rotMat.M31 * vUp.X + rotMat.M32 * vUp.Y + rotMat.M33 * vUp.Z;

vUp = newVect;
}
}

所以我在一些随机坐标上创建了一个新的游戏对象 (GLFrame):GameObject go = new GameObject(0, 0, 5); 并稍微旋转它:go.RotateLocalZ(旋转Z);。然后我使用 Matrix4 matrix = go.GetMatrix(); 获取矩阵并渲染帧(首先,我设置观察矩阵,然后我将它与建模矩阵相乘)

protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
this.Title = "FPS: " + (1 / e.Time).ToString("0.0");

GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();

Matrix4 modelmatrix = go.GetMatrix();
Matrix4 viewmatrix = Matrix4.LookAt(new Vector3(5, 5, -10), Vector3.Zero, Vector3.UnitY);

GL.LoadMatrix(ref viewmatrix);

GL.MultMatrix(ref modelmatrix);

DrawCube(new float[] { 0.5f, 0.4f, 0.5f, 0.8f });

SwapBuffers();
}

DrawCube(float[] color) 是我自己绘制立方体的方法。

现在是最重要的部分:如果我渲染帧没有 GL.MultMatrix(ref matrix); 部分,但是使用GL.Translate()GL.Rotate(),它有效(第二个屏幕截图)。但是,如果我不使用这两种方法,而是使用 GL.MultMatrix() 将建模矩阵直接传递给 OpenGL,它会绘制一些奇怪的东西(第一个屏幕截图)。

How it looks like How it should look like

你能帮我解释一下问题出在哪里吗?为什么它可以使用平移和旋转方法工作,而不是将 View 矩阵乘以建模矩阵?

最佳答案

OpenGL 变换矩阵按列排序。您应该使用您正在使用的矩阵的转置。

关于c# - 将建模矩阵应用于 View 矩阵 = 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com