1

我正在尝试熟悉在 C# 中使用 OpenTK 编写程序。我不知道如何设置和移动相机。目前,我导入了以下库:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.Windows;
using System.Runtime.InteropServices;
using Imaging = System.Drawing.Imaging;
using TK = OpenTK.Graphics.OpenGL;
using System.IO;
using System.Threading;

我已将此代码放在 Main 中以使我的相机工作:

var myWindow = new GameWindow(840, 600);
Matrix4 perspective = Matrix4.CreatePerspectiveFieldOfView(1.04f, 4f / 3f, 1f, 10000f);//Setup Perspective
float[] persF;
persF = new float[4] { 1.04f, 4f / 3f, 1f, 10000f };
Matrix4 lookat = Matrix4.LookAt(100, 20, 0, 0, 0, 0, 0, 1, 0);// 'Setup camera
float[] lookF;
lookF = new float[9] { 100, 20, 0, 0, 0, 0, 0, 1, 0 };
GL.MatrixMode(MatrixMode.Projection);// 'Load Perspective
GL.LoadIdentity();
GL.LoadMatrix(persF);
GL.MatrixMode(MatrixMode.Modelview);// 'Load Camera
GL.LoadIdentity();
GL.LoadMatrix(lookF);
GL.Enable(EnableCap.DepthTest);// 'Enable correct Z Drawings
GL.DepthFunc(DepthFunction.Less);// 'Enable correct Z Drawings
GL.Viewport(0, 0, myWindow.Width, myWindow.Height);

当我使用GL.LoadMatrix(perspective)andGL.LoadMatrix(lookat)时,我得到一个重载匹配错误。出于这个原因,我将矩阵转换为浮点数组。当我尝试绘制多边形时,它们无法显示,除非此代码被注释掉(var myWindow = new GameWindow(840, 600)命令除外)。

4

1 回答 1

2

对于您的第一个问题,GL.LoadMatrix只有ref Matrix4过载,而不仅仅是Matrix4过载。通过引用传递矩阵要快得多,因为当您调用该方法时,它不会在堆栈上创建额外的副本。其次, 和 的参数Matrix4.CreatePerspectiveFiledOfView不是Matrix4.LookAt矩阵。它们根据这些参数生成一个 4x4 矩阵(16 个浮点数),因此您的persFlookF“矩阵”会产生一些非常奇怪的结果。

正确的调用是GL.LoadMatrix(ref perspective);GL.LoadMatrix(ref lookat);

你应该创建一个 GameWindow 的子类并覆盖OnLoad这个代码和OnRenderFrame你的绘图代码。

于 2013-09-18T19:32:15.807 回答