OpenTK相机在C#(OpenTK Camera in C#)

2019-10-18 15:07发布

我想在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;

我已经把这个代码在主让我的相机工作:

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)GL.LoadMatrix(lookat)我得到一个超载匹配误差。 出于这个原因,我转换矩阵浮动阵列。 当我尝试绘制多边形,他们没有露面,除非该代码被注释掉了(与外var myWindow = new GameWindow(840, 600)命令。

Answer 1:

对于你的第一个问题, GL.LoadMatrix只有一个ref Matrix4超载,不只是一个Matrix4超载。 通过引用传递矩阵是快了很多,因为它不会在栈上创建一个额外的副本,当你调用该方法。 其次,对于参数Matrix4.CreatePerspectiveFiledOfViewMatrix4.LookAt不是矩阵。 他们基于这些参数的4x4矩阵(16辆彩车),所以你persFlookF “矩阵”将创造一些非常奇怪的结果。

适当的呼叫是GL.LoadMatrix(ref perspective);GL.LoadMatrix(ref lookat);

你应该创建GameWindow的子类,并重写OnLoad这个代码和OnRenderFrame为您的绘制代码。



文章来源: OpenTK Camera in C#